public override void CaseAALocalDecl(AALocalDecl node) { if (node.GetConst() != null) Write("const "); node.GetType().Apply(this); Write(" " + node.GetName().Text); if (node.GetInit() != null) { Write(" = "); node.GetInit().Apply(this); } }
public VariableDescription(AALocalDecl localDecl, VariableTypes type) { Name = localDecl.GetName().Text; Type = Util.TypeToString(localDecl.GetType()); switch (type) { case VariableTypes.LocalVariable: PlacementPrefix = "Local"; break; case VariableTypes.Parameter: PlacementPrefix = "Parameter"; break; case VariableTypes.StructVariable: PlacementPrefix = "Struct field"; break; default: PlacementPrefix = ""; break; } VariableType = type; Const = localDecl.GetConst() != null; IsStatic = localDecl.GetStatic() != null; Visibility = localDecl.GetVisibilityModifier(); realType = (PType) localDecl.GetType().Clone(); init = localDecl.GetInit(); Line = localDecl.GetName().Line; Position = TextPoint.FromCompilerCoords(localDecl.GetName()); }
public override void CaseAALocalDecl(AALocalDecl node) { if (node.GetConst() == null) return; initialLocalDecl = node; if (IsConstant(node.GetInit())) { { List<ALocalLvalue> lvalues = new List<ALocalLvalue>(); lvalues.AddRange(data.LocalLinks.Where(link => link.Value == node).Select(link => link.Key)); foreach (ALocalLvalue lvalue in lvalues) { PExp parent = (PExp)lvalue.Parent(); parent.ReplaceBy(Util.MakeClone(node.GetInit(), data)); } } { List<AStructLvalue> lvalues = new List<AStructLvalue>(); lvalues.AddRange(data.StructFieldLinks.Where(link => link.Value == node).Select(link => link.Key)); foreach (AStructLvalue lvalue in lvalues) { PExp parent = (PExp)lvalue.Parent(); parent.ReplaceBy(Util.MakeClone(node.GetInit(), data)); } } { List<AStructFieldLvalue> lvalues = new List<AStructFieldLvalue>(); lvalues.AddRange( data.StructMethodFieldLinks.Where(link => link.Value == node).Select(link => link.Key)); foreach (AStructFieldLvalue lvalue in lvalues) { PExp parent = (PExp) lvalue.Parent(); parent.ReplaceBy(Util.MakeClone(node.GetInit(), data)); } } if (node.Parent() is ALocalDeclStm) node.Parent().Parent().RemoveChild(node.Parent()); else node.Parent().RemoveChild(node); } initialLocalDecl = null; }
public override void OutAALocalDecl(AALocalDecl node) { if (!Util.HasAncestor<AABlock>(node) && !Util.HasAncestor<AMethodDecl>(node)) { //OutStructFieldDecl(node); return; } if (node.GetInit() != null) return; AABlock pBlock; int insertIndex; PLvalue lvalue; if (Util.HasAncestor<AABlock>(node)) { //A local variable pBlock = Util.GetAncestor<AABlock>(node); insertIndex = pBlock.GetStatements().IndexOf(Util.GetAncestor<PStm>(node)) + 1; lvalue = new ALocalLvalue(new TIdentifier(node.GetName().Text)); data.LocalLinks[(ALocalLvalue) lvalue] = node; data.LvalueTypes[lvalue] = node.GetType(); } else { //Parameter //Parameters will be set from the caller return; pBlock = (AABlock) Util.GetAncestor<AMethodDecl>(node).GetBlock(); insertIndex = 0; lvalue = new ALocalLvalue(new TIdentifier(node.GetName().Text)); data.LocalLinks[(ALocalLvalue)lvalue] = node; data.LvalueTypes[lvalue] = node.GetType(); } AABlock block = new AABlock(new ArrayList(), new TRBrace("}")); MakeAssignments(block, node.GetType(), lvalue, true); if (block.GetStatements().Count != 0) pBlock.GetStatements().Insert(insertIndex, new ABlockStm(new TLBrace("{"), block)); }
public override void CaseAALocalDecl(AALocalDecl node) { InAALocalDecl(node); if (node.GetInit() != null) { node.GetInit().Apply(this); } if (node.GetName() != null) { node.GetName().Apply(this); } if (node.GetType() != null) { node.GetType().Apply(this); } if (node.GetConst() != null) { node.GetConst().Apply(this); } if (node.GetOut() != null) { node.GetOut().Apply(this); } if (node.GetRef() != null) { node.GetRef().Apply(this); } if (node.GetStatic() != null) { node.GetStatic().Apply(this); } if (node.GetVisibilityModifier() != null) { node.GetVisibilityModifier().Apply(this); } OutAALocalDecl(node); }
/*public override void CaseAShadyLocalDecl(AShadyLocalDecl node) { bool hasIdentifier = node. node.GetName() != null; if (hasIdentifier) {//Replace with a non shady local decl if (node.GetInit() != null) errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, "Array declarations cannot be initialized", false)); AALocalDecl localDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, node.GetConst(), node.GetType(), node.GetName(), null); node.ReplaceBy(localDecl); localDecl.Apply(this); } else { //If it is not a declaration, it is an assignment exp, so we must have a right side if (node.GetInit() == null) { errors.Add(new ErrorCollection.Error(GetToken(node.GetType()), currentSourceFile, "Expected assignment", false)); node.Parent().RemoveChild(node); return; } //If it says const first, we got an error if (node.GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetConst(), currentSourceFile, "Unexpected const", false)); ALocalDeclStm parent = (ALocalDeclStm)node.Parent(); PLvalue lvalue = DetypeArray(node.GetType()); ASAssignmentExp exp = new ASAssignmentExp(node.GetAssignop(), lvalue, node.GetInit()); AExpStm stm = new AExpStm(parent.GetToken(), exp); parent.ReplaceBy(stm); stm.Apply(this); } }*/ public override void OutAALocalDecl(AALocalDecl node) { if (Util.GetAncestor<AABlock>(node) != null) {//We are a local defined inside a method if (node.GetConst() != null && node.GetInit() == null) errors.Add(new ErrorCollection.Error(node.GetConst(), currentSourceFile, LocRM.GetString("ErrorText190"), false)); } else if (Util.HasAncestor<AMethodDecl>(node) || Util.HasAncestor<AConstructorDecl>(node)) {//We are in a parameter if (node.GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetConst(), currentSourceFile, LocRM.GetString("ErrorText191"), false)); } else { //Struct var if (node.GetConst() != null && node.GetInit() == null) errors.Add(new ErrorCollection.Error(node.GetConst(), currentSourceFile, LocRM.GetString("ErrorText190"), false)); } base.OutAALocalDecl(node); }
public override void OutAALocalDecl(AALocalDecl node) { if (node.GetInit() != null) { PType from = data.ExpTypes[node.GetInit()]; PType to = node.GetType(); if (!Assignable(from, to)) { if (ImplicitAssignable(from, to)) { ANamedType namedTo = (ANamedType)to; ACastExp cast = new ACastExp(new TLParen("("), new ANamedType(new TIdentifier(((AAName)namedTo.GetName()).AsString()), null), node.GetInit()); node.SetInit(cast); OutACastExp(cast); to = from; } else errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText151") + Util.TypeToString(from) + LocRM.GetString("ErrorText152") + Util.TypeToString(to))); } } //If the return type or the type of any formals is a private struct, and the method is a public context, give an error if (node.Parent() is AStructDecl) { AStructDecl pStruct = Util.GetAncestor<AStructDecl>(node); //Is public context if ( pStruct.GetVisibilityModifier() is APublicVisibilityModifier && !(node.GetVisibilityModifier() is APrivateVisibilityModifier)) { PType type = node.GetType(); int i = 0; FindPrivateTypes finder = new FindPrivateTypes(data); type.Apply(finder); if (finder.PrivateTypes.Count > 0) { List<ErrorCollection.Error> subErrors = new List<ErrorCollection.Error>(); List<PDecl> usedDecls = new List<PDecl>(); foreach (ANamedType namedType in finder.PrivateTypes) { if (data.StructTypeLinks.ContainsKey(namedType)) { AStructDecl decl = data.StructTypeLinks[namedType]; if (usedDecls.Contains(decl)) continue; usedDecls.Add(decl); subErrors.Add(new ErrorCollection.Error(decl.GetName(), LocRM.GetString("ErrorText64"))); } else if (data.DelegateTypeLinks.ContainsKey(namedType)) { AMethodDecl decl = data.DelegateTypeLinks[namedType]; if (usedDecls.Contains(decl)) continue; usedDecls.Add(decl); subErrors.Add(new ErrorCollection.Error(decl.GetName(), LocRM.GetString("ErrorText154"))); } } errors.Add(new ErrorCollection.Error(node.GetName(), LocRM.GetString("ErrorText155"), false, subErrors.ToArray())); } } } base.OutAALocalDecl(node); }
public override void CaseAALocalDecl(AALocalDecl node) { //Convert a static struct field into a global variable. All refferences to it are structFieldLvalues. if (node.GetStatic() == null) return; AStructDecl str = (AStructDecl) node.Parent(); if (data.StructFields[str].Contains(node)) data.StructFields[str].Remove(node); AFieldDecl replacementField; //Don't enhrit static fields. if (data.EnheritanceLocalMap.ContainsKey(node)) { str.RemoveChild(node); AALocalDecl realVar = data.EnheritanceLocalMap[node]; if (convertionMap.ContainsKey(realVar)) { //Already converted to a field replacementField = convertionMap[realVar]; foreach (AStructFieldLvalue lvalue in data.StructMethodFieldLinks.Where(link => link.Value == node).Select(link => link.Key)) { AFieldLvalue newLvalue = new AFieldLvalue(new TIdentifier(replacementField.GetName().Text)); data.FieldLinks[newLvalue] = replacementField; data.LvalueTypes[newLvalue] = replacementField.GetType(); lvalue.ReplaceBy(newLvalue); } } else { List<AStructFieldLvalue> refferences = new List<AStructFieldLvalue>(); refferences.AddRange(data.StructMethodFieldLinks.Where(link => link.Value == node).Select(link => link.Key)); foreach (AStructFieldLvalue lvalue in refferences) { data.StructMethodFieldLinks[lvalue] = realVar; } } return; } replacementField = new AFieldDecl(new APublicVisibilityModifier(), null, node.GetConst(), node.GetType(), node.GetName(), node.GetInit()); replacementField.GetName().Text = str.GetName().Text + "_" + replacementField.GetName().Text; AASourceFile file = Util.GetAncestor<AASourceFile>(node); file.GetDecl().Insert(file.GetDecl().IndexOf(node.Parent()), replacementField); data.Fields.Add(new SharedData.DeclItem<AFieldDecl>(file, replacementField)); if (ContainsNewExp(replacementField.GetInit())) data.FieldsToInitInMapInit.Add(replacementField); foreach (AStructFieldLvalue lvalue in data.StructMethodFieldLinks.Where(link => link.Value == node).Select(link => link.Key)) { AFieldLvalue newLvalue = new AFieldLvalue(new TIdentifier(replacementField.GetName().Text)); data.FieldLinks[newLvalue] = replacementField; data.LvalueTypes[newLvalue] = replacementField.GetType(); lvalue.ReplaceBy(newLvalue); } convertionMap.Add(node, replacementField); node.Parent().RemoveChild(node); }
public override void CaseAALocalDecl(AALocalDecl node) { /*foreach (List<PointerType> pointerType in GetAllPointerTypes(node, node.GetType())) { MakePointer(pointerType); }*/ //Parameter if (Util.GetAncestor<AMethodDecl>(node) == null) return; { /*currentPointer.Clear(); node.GetLvalue().Apply(this); List<PointerType> leftSide = MakePointer(currentPointer);*/ if (node.GetInit() == null) { isSet = false; isExposed = false; } else { currentPointer.Clear(); node.GetInit().Apply(this); } //List<PointerType> rightSide = MakePointer(currentPointer); foreach (List<PointerType> prefix in GetAllPointerTypes(node, node.GetType())) { //if prefix is root - set to isSet / isExposed //if prefix is child - set isSet only if false, and isExposed only if true. bool isRoot = prefix.Count == 1; List<PointerType> aPrefix = MakePointer(prefix); if (isSet != Contains(setPointers, aPrefix)) { if (isSet) { if (isRoot) setPointers.Add(aPrefix); } else setPointers.Remove(aPrefix); } if (isExposed != Contains(exposedPointers, aPrefix)) { if (isSet) setPointers.Add(aPrefix); else if (isRoot) setPointers.Remove(aPrefix); } } } }
public override void CaseADeleteStm(ADeleteStm node) { List<Node> visitMeNext = new List<Node>(); APointerType pointer = (APointerType) data.ExpTypes[node.GetExp()]; //Call deconstructor if it exists { AMethodDecl deconstructor = null; if (pointer.GetType() is ANamedType && data.StructTypeLinks.ContainsKey((ANamedType) pointer.GetType())) { AStructDecl str = data.StructTypeLinks[(ANamedType) pointer.GetType()]; deconstructor = data.DeconstructorMap[data.StructDeconstructor[str]]; } else //Look for enrichment deconstructor { foreach (AEnrichmentDecl enrichment in data.Enrichments) { if (Util.TypesEqual(pointer.GetType(), enrichment.GetType(), data)) { foreach (PDecl decl in enrichment.GetDecl()) { if (decl is ADeconstructorDecl) { deconstructor = data.DeconstructorMap[(ADeconstructorDecl) decl]; break; } } if (deconstructor != null) break; } } } if (deconstructor != null) { /* * Convert delete <exp>; to * * var deleteVar = <exp>; * Deconstructor(deleteVar); * delete deleteVar; */ AALocalDecl deleteVarDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType( new TIdentifier(Util.IsIntPointer(node, pointer. GetType(), data) ? "int" : "string"), null), new TIdentifier("deleteVar"), node.GetExp()); ALocalLvalue deleteVarRef = new ALocalLvalue(new TIdentifier("deleteVar")); ALvalueExp deleteVarRefExp = new ALvalueExp(deleteVarRef); node.SetExp(deleteVarRefExp); AABlock pBlock = (AABlock) node.Parent(); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new ALocalDeclStm(new TSemicolon(";"), deleteVarDecl)); data.LocalLinks[deleteVarRef] = deleteVarDecl; data.LvalueTypes[deleteVarRef] = data.ExpTypes[deleteVarRefExp] = data.ExpTypes[deleteVarDecl.GetInit()]; deleteVarRef = new ALocalLvalue(new TIdentifier("deleteVar")); deleteVarRefExp = new ALvalueExp(deleteVarRef); ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier(deconstructor.GetName().Text), new ArrayList() {deleteVarRefExp}); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new AExpStm(new TSemicolon(";"), invoke)); data.LocalLinks[deleteVarRef] = deleteVarDecl; data.LvalueTypes[deleteVarRef] = data.ExpTypes[deleteVarRefExp] = data.ExpTypes[deleteVarDecl.GetInit()]; data.SimpleMethodLinks[invoke] = deconstructor; data.ExpTypes[invoke] = deconstructor.GetReturnType(); visitMeNext.Add(deleteVarDecl); } } if (pointer.GetType() is AArrayTempType || pointer.GetType() is ADynamicArrayType) { //If struct array, delete all struct data PType baseType; if (pointer.GetType() is AArrayTempType) baseType = ((AArrayTempType) pointer.GetType()).GetType(); else baseType = ((ADynamicArrayType)pointer.GetType()).GetType(); PExp pointerString = node.GetExp(); if (Util.IsBulkCopy(baseType)) { node.GetExp().Apply(new MoveMethodDeclsOut("pointerVar", data)); pointerString = node.GetExp(); ANamedType aBaseType = (ANamedType) baseType; /* Add the following * * string deleteMe = node.getExp(); <-- no * int i = 0; * while (i < array.length) * { * DeleteStruct<name>(deleteMe + StringToInt(i)); * i = i + 1; * } * */ //string deleteMe = node.getExp(); /*AALocalDecl deleteMeVar = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("deleteMe"), node.GetExp());*/ //pointerString = deleteMeVar; //int i = 0; AALocalDecl iVar = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("i"), new AIntConstExp(new TIntegerLiteral("0"))); //i < array.length ASimpleInvokeExp lenghCall = new ASimpleInvokeExp(new TIdentifier("DataTableGetInt"), new ArrayList()); lenghCall.GetArgs().Add(new ABooleanConstExp(new ATrueBool())); //ALocalLvalue deleteMeUse1 = new ALocalLvalue(new TIdentifier("deleteMeVar")); ABinopExp arrayLengthString = new ABinopExp(Util.MakeClone(pointerString, data), new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"\\\\Length\""))); lenghCall.GetArgs().Add(arrayLengthString); ALocalLvalue iUse1 = new ALocalLvalue(new TIdentifier("i")); ABinopExp cond = new ABinopExp(new ALvalueExp(iUse1), new ALtBinop(new TLt("<")), lenghCall); //DeleteStruct<name>(deleteMe + StringToInt(i)); //ALocalLvalue deleteMeUse2 = new ALocalLvalue(new TIdentifier("deleteMeVar")); ALocalLvalue iUse2 = new ALocalLvalue(new TIdentifier("i")); ASimpleInvokeExp intToString = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList()); intToString.GetArgs().Add(new ALvalueExp(iUse2)); ABinopExp binopExp1 = new ABinopExp(Util.MakeClone(pointerString, data), new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"[\""))); ABinopExp binopExp2 = new ABinopExp(binopExp1, new APlusBinop(new TPlus("+")), intToString); ABinopExp binopExp3 = new ABinopExp(binopExp2, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"]\""))); ASimpleInvokeExp deleteStructInvoke = new ASimpleInvokeExp(new TIdentifier("DeleteStruct" + aBaseType.AsIdentifierString()), new ArrayList()); deleteStructInvoke.GetArgs().Add(binopExp3); //i = i + 1; ALocalLvalue iUse3 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iUse4 = new ALocalLvalue(new TIdentifier("i")); ABinopExp binopExp = new ABinopExp(new ALvalueExp(iUse4), new APlusBinop(new TPlus("+")), new AIntConstExp(new TIntegerLiteral("1"))); AAssignmentExp assign = new AAssignmentExp(new TAssign("="), iUse3, binopExp); //While (...){...} AABlock innerWhile = new AABlock(); innerWhile.GetStatements().Add(new AExpStm(new TSemicolon(";"), deleteStructInvoke)); innerWhile.GetStatements().Add(new AExpStm(new TSemicolon(";"), assign)); AWhileStm whileStm = new AWhileStm(new TLParen("("), cond, new ABlockStm(new TLBrace("{"), innerWhile)); AABlock pBlock = (AABlock) node.Parent(); //pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new ALocalDeclStm(new TSemicolon(";"), deleteMeVar)); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new ALocalDeclStm(new TSemicolon(";"), iVar)); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), whileStm); //visitMeNext.Add(deleteMeVar); visitMeNext.Add(whileStm); data.ExpTypes[iVar.GetInit()] = data.LvalueTypes[iUse1] = data.LvalueTypes[iUse2] = data.LvalueTypes[iUse3] = data.LvalueTypes[iUse4] = data.ExpTypes[cond.GetLeft()] = data.ExpTypes[lenghCall] = data.ExpTypes[(PExp) intToString.GetArgs()[0]] = data.ExpTypes[binopExp.GetLeft()] = data.ExpTypes[binopExp.GetRight()] = data.ExpTypes[binopExp] = data.ExpTypes[assign] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[(PExp) lenghCall.GetArgs()[0]] = data.ExpTypes[cond] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[lenghCall] = // data.LvalueTypes[deleteMeUse1] = // data.LvalueTypes[deleteMeUse2] = data.ExpTypes[arrayLengthString.GetLeft()] = data.ExpTypes[arrayLengthString.GetRight()] = data.ExpTypes[arrayLengthString] = data.ExpTypes[intToString] = data.ExpTypes[binopExp1] = data.ExpTypes[binopExp1.GetLeft()] = data.ExpTypes[binopExp1.GetRight()] = data.ExpTypes[binopExp2] = data.ExpTypes[binopExp3] = data.ExpTypes[binopExp3.GetRight()] = data.ExpTypes[lenghCall] = data.ExpTypes[lenghCall] = data.ExpTypes[lenghCall] = data.ExpTypes[lenghCall] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[deleteStructInvoke] = new AVoidType(new TVoid("void")); data.Locals[pBlock].Add(iVar); //data.Locals[pBlock].Add(deleteMeVar); data.LocalLinks[iUse1] = data.LocalLinks[iUse2] = data.LocalLinks[iUse3] = data.LocalLinks[iUse4] = iVar; //data.LocalLinks[deleteMeUse1] = // data.LocalLinks[deleteMeUse2] = deleteMeVar; data.SimpleMethodLinks[lenghCall] = data.Libraries.Methods.First(method => method.GetName().Text == lenghCall.GetName().Text); data.SimpleMethodLinks[intToString] = data.Libraries.Methods.First(method => method.GetName().Text == intToString.GetName().Text); AStructDecl structDecl = data.StructTypeLinks[aBaseType]; if (!deleteStructMethod.ContainsKey(structDecl)) CreateDeleteStructMethod(node, structDecl, data); data.SimpleMethodLinks[deleteStructInvoke] = deleteStructMethod[structDecl]; } /* * Convert delete <exp> * to * DeleteArray(<exp>); * */ ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("DeleteArray"), new ArrayList(){pointerString}); /*if (pointerString == null) { invoke.GetArgs().Add(node.GetExp()); } else { ALocalLvalue local = new ALocalLvalue(new TIdentifier("pointerString")); invoke.GetArgs().Add(new ALvalueExp(local)); data.LocalLinks[local] = pointerString; data.LvalueTypes[local] = data.ExpTypes[(PExp) invoke.GetArgs()[0]] = new ANamedType(new TIdentifier("string"), null); }*/ data.ExpTypes[invoke] = new AVoidType(new TVoid("void")); if (deleteArrayMethod == null) CreateDeleteArrayMethod(node, data); data.SimpleMethodLinks[invoke] = deleteArrayMethod; visitMeNext.Add(invoke); node.ReplaceBy(new AExpStm(new TSemicolon(";"), invoke)); } else { //Not array type PExp pointerString = node.GetExp(); bool isIntPointer = Util.IsIntPointer(node, pointer.GetType(), data); bool createdStructDelete = false; if (Util.IsBulkCopy(pointer.GetType())) { node.GetExp().Apply(new MoveMethodDeclsOut("pointerVar", data)); pointerString = node.GetExp(); ANamedType aBaseType = (ANamedType) pointer.GetType(); /* Insert * * string deleteMeVar = node.getExp(); * DeleteStruct<name>(deleteMeVar); * */ /* AALocalDecl deleteMeVar = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("deleteMe"), node.GetExp());*/ //pointerString = deleteMeVar; //ALocalLvalue deleteMeUse = new ALocalLvalue(new TIdentifier("deleteMeVar")); PExp deleteExp = Util.MakeClone(pointerString, data); AStructDecl structDecl = data.StructTypeLinks[aBaseType]; if (isIntPointer) { GlobalStructVars vars = CreateStructFields(node, structDecl, data); int allocateLimit = int.Parse(structDecl.GetIntDim().Text); if (vars.IdentifierArray != null) { int usedBits = allocateLimit == 0 ? 0 : ((int) Math.Floor(Math.Log(allocateLimit, 2)) + 1); int bitsLeft = 31 - usedBits; int biggestIdentifier = (1 << (bitsLeft + 1)) - 1; AIntConstExp bitsLeftConst = new AIntConstExp(new TIntegerLiteral(bitsLeft.ToString())); deleteExp = new ABinopExp(deleteExp, new ARBitShiftBinop(new TRBitShift(">>")), bitsLeftConst); data.ExpTypes[bitsLeftConst] = data.ExpTypes[deleteExp] = new ANamedType(new TIdentifier("int"), null); } } ASimpleInvokeExp deleteStructInvoke = new ASimpleInvokeExp(new TIdentifier("DeleteStruct" + aBaseType.AsIdentifierString()), new ArrayList()); deleteStructInvoke.GetArgs().Add(deleteExp); AABlock pBlock = (AABlock)node.Parent(); //pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new ALocalDeclStm(new TSemicolon(";"), deleteMeVar)); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(node), new AExpStm(new TSemicolon(";"), deleteStructInvoke)); //visitMeNext.Add(deleteMeVar); visitMeNext.Add(deleteStructInvoke); /*data.ExpTypes[(PExp) deleteStructInvoke.GetArgs()[0]] = data.LvalueTypes[deleteMeUse] = new ANamedType(new TIdentifier("string"), null);*/ data.ExpTypes[deleteStructInvoke] = new AVoidType(new TVoid("void")); //data.Locals[pBlock].Add(deleteMeVar); //data.LocalLinks[deleteMeUse] = deleteMeVar; if (!deleteStructMethod.ContainsKey(structDecl)) CreateDeleteStructMethod(node, structDecl, data); data.SimpleMethodLinks[deleteStructInvoke] = deleteStructMethod[structDecl]; createdStructDelete = true; } if (!isIntPointer) { /* * Convert delete <exp> * to * DeleteSimple(<exp>); * */ ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("DeleteObject"), new ArrayList() {pointerString}); /*if (pointerString == null) { invoke.GetArgs().Add(node.GetExp()); } else { ALocalLvalue local = new ALocalLvalue(new TIdentifier("pointerString")); invoke.GetArgs().Add(new ALvalueExp(local)); data.LocalLinks[local] = pointerString; data.LvalueTypes[local] = data.ExpTypes[(PExp)invoke.GetArgs()[0]] = new ANamedType(new TIdentifier("string"), null); }*/ data.ExpTypes[invoke] = new AVoidType(new TVoid("void")); if (deleteObjectMethod == null) CreateDeleteObjectMethod(node, data); data.SimpleMethodLinks[invoke] = deleteObjectMethod; visitMeNext.Add(invoke); node.ReplaceBy(new AExpStm(new TSemicolon(";"), invoke)); } else if (createdStructDelete) { node.Parent().RemoveChild(node); } else { //There is an enrichment PExp deleteExp = pointerString; AEnrichmentDecl enrichmentDecl = data.EnrichmentTypeLinks[pointer.GetType()]; if (isIntPointer) { GlobalStructVars vars = CreateEnrichmentFields(node, enrichmentDecl, data); int allocateLimit = int.Parse(enrichmentDecl.GetIntDim().Text); if (vars.IdentifierArray != null) { int usedBits = allocateLimit == 0 ? 0 : ((int)Math.Floor(Math.Log(allocateLimit, 2)) + 1); int bitsLeft = 31 - usedBits; AIntConstExp bitsLeftConst = new AIntConstExp(new TIntegerLiteral(bitsLeft.ToString())); deleteExp = new ABinopExp(deleteExp, new ARBitShiftBinop(new TRBitShift(">>")), bitsLeftConst); data.ExpTypes[bitsLeftConst] = data.ExpTypes[deleteExp] = new ANamedType(new TIdentifier("int"), null); } } ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("DeleteObject"), new ArrayList() { deleteExp }); data.ExpTypes[invoke] = new AVoidType(new TVoid("void")); data.SimpleMethodLinks[invoke] = CreateDeleteEnrichmentMethod(node, enrichmentDecl, data); visitMeNext.Add(invoke); node.ReplaceBy(new AExpStm(new TSemicolon(";"), invoke)); } } bool hadPointerPreviously = hadPointer; PExp previosNameExp = nameExp; for (int i = 0; i < visitMeNext.Count; i++) { hadPointer = false; nameExp = null; visitMeNext[i].Apply(this); } hadPointer = hadPointerPreviously; nameExp = previosNameExp; }
public override void OutAALocalDecl(AALocalDecl node) { if (node.GetInit() != null) { PType type = node.GetType(); if (Util.IsBulkCopy(type)) { node.Apply(mover); ALocalLvalue lvalue = new ALocalLvalue(new TIdentifier(node.GetName().Text)); data.LocalLinks[lvalue] = node; data.LvalueTypes[lvalue] = type; List<PStm> replacementStatements = MakeAssignments(lvalue, node.GetInit(), new List<AALocalDecl>() { null }); PStm pStm = Util.GetAncestor<PStm>(node); AABlock pBlock = (AABlock)pStm.Parent(); foreach (PStm stm in replacementStatements) { pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm) + 1, stm); } node.SetInit(null); } } base.OutAALocalDecl(node); }