public override void CaseADelegateExp(ADelegateExp node) { /* Replace delegate<Type>(method) * With * * "method" * * or * * "method:reciever" */ AMethodDecl method = finalTrans.data.DelegateCreationMethod[node]; string d = GetName(method); PExp replacer; APointerLvalue reciever = finalTrans.data.DelegateRecieveres[node]; if (reciever != null) { d += ":"; AStringConstExp leftSide = new AStringConstExp(new TStringLiteral("\"" + d + "\"")); replacer = new ABinopExp(leftSide, new APlusBinop(new TPlus("+")), reciever.GetBase()); finalTrans.data.ExpTypes[leftSide] = finalTrans.data.ExpTypes[replacer] = new ANamedType(new TIdentifier("string"), null); if (Util.IsIntPointer(reciever, data.LvalueTypes[reciever], data)) { ASimpleInvokeExp intToStringInvoke = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList() {((ABinopExp) replacer).GetRight()}); ((ABinopExp)replacer).SetRight(intToStringInvoke); finalTrans.data.SimpleMethodLinks[intToStringInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == intToStringInvoke.GetName().Text); data.ExpTypes[intToStringInvoke] = new ANamedType(new TIdentifier("string"), null); } } else { replacer = new AStringConstExp(new TStringLiteral("\"" + d + "\"")); finalTrans.data.ExpTypes[replacer] = new ANamedType(new TIdentifier("string"), null); } MoveMethodDeclsOut mover = new MoveMethodDeclsOut("delegateVar", finalTrans.data); node.Apply(mover); node.ReplaceBy(replacer); foreach (PStm stm in mover.NewStatements) { stm.Apply(this); } }
public override void CaseADelegateInvokeExp(ADelegateInvokeExp node) { //Build a list of the possible methods AASourceFile currentFile = Util.GetAncestor<AASourceFile>(node); List<AMethodDecl> methods = new List<AMethodDecl>(); ANamedType type = (ANamedType) finalTrans.data.ExpTypes[node.GetReceiver()]; AMethodDecl delegateMethod = finalTrans.data.DelegateTypeLinks[type]; foreach (KeyValuePair<ADelegateExp, AMethodDecl> delegateCreationPair in finalTrans.data.DelegateCreationMethod) { if (TypeChecking.Assignable(delegateCreationPair.Key.GetType(), type)) { if (!methods.Contains(delegateCreationPair.Value)) methods.Add(delegateCreationPair.Value); } } MoveMethodDeclsOut mover; if (methods.Count == 0) { //Can only remove it if the return value is unused if (!(node.Parent() is AExpStm)) { finalTrans.errors.Add(new ErrorCollection.Error(node.GetToken(), currentFile, LocRM.GetString("Delegates_Text1"))); throw new ParserException(node.GetToken(), "Delegates.OutADelegateInvokeExp"); } mover = new MoveMethodDeclsOut("delegateVar", finalTrans.data); foreach (Node arg in node.GetArgs()) { arg.Apply(mover); } node.Parent().Parent().RemoveChild(node.Parent()); foreach (PStm stm in mover.NewStatements) { stm.Apply(this); } return; } if (methods.Count == 1) { ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("renameMe"), new ArrayList()); while (node.GetArgs().Count > 0) { invoke.GetArgs().Add(node.GetArgs()[0]); } //If we have a struct method, add the pointer from the delegate if (finalTrans.data.StructMethods.Any(str => str.Value.Contains(methods[0]))) { AStructDecl targetStr = finalTrans.data.StructMethods.First(str => str.Value.Contains(methods[0])).Key; AMethodDecl getPointerDecl = GetPointerMethod(targetStr.GetDimention() != null); ASimpleInvokeExp getPointerInvoke = new ASimpleInvokeExp(new TIdentifier("renameMe"), new ArrayList(){node.GetReceiver()}); invoke.GetArgs().Add(getPointerInvoke); finalTrans.data.SimpleMethodLinks[getPointerInvoke] = getPointerDecl; finalTrans.data.ExpTypes[getPointerInvoke] = getPointerDecl.GetReturnType(); } finalTrans.data.SimpleMethodLinks[invoke] = methods[0]; finalTrans.data.ExpTypes[invoke] = methods[0].GetReturnType(); node.ReplaceBy(invoke); return; } //Multiple methods. Make /* * <Methods moved out from reciever> * string delegate = GetMethodPart(<reciever>); * if (delegate == "...") * { * Foo(...); * } * else if (delegate == "...") * { * Bar(..., GetPointerPart(<reciever>); * } * else if(...) * ... * else * { * UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("[<file>:<line>]: No methods matched delegate.")); * int i = 1/0; * return; * } * */ AABlock block = new AABlock(new ArrayList(), new TRBrace("}")); mover = new MoveMethodDeclsOut("delegateVar", finalTrans.data); node.GetReceiver().Apply(mover); AMethodDecl methodPartMethod = GetMethodMethod(); ASimpleInvokeExp methodPartInvoke = new ASimpleInvokeExp(new TIdentifier("GetMethodPart"), new ArrayList() { Util.MakeClone(node.GetReceiver(), finalTrans.data) }); finalTrans.data.SimpleMethodLinks[methodPartInvoke] = methodPartMethod; finalTrans.data.ExpTypes[methodPartInvoke] = methodPartMethod.GetReturnType(); AALocalDecl methodPartDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("methodPart"), methodPartInvoke); block.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), methodPartDecl)); //If the invoke's return value is used, get the lvalue PLvalue leftSide; if (node.Parent() is AALocalDecl) { leftSide = new ALocalLvalue(new TIdentifier("renameMe")); finalTrans.data.LocalLinks[(ALocalLvalue) leftSide] = (AALocalDecl) node.Parent(); finalTrans.data.LvalueTypes[leftSide] = new ANamedType(new TIdentifier("string"), null); PStm pStm = Util.GetAncestor<PStm>(node); AABlock pBlock = (AABlock) pStm.Parent(); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm) + 1, new ABlockStm(new TLBrace("{"), block)); node.Parent().RemoveChild(node); } else if (node.Parent() is AAssignmentExp) { AAssignmentExp assignExp = (AAssignmentExp) node.Parent(); leftSide = assignExp.GetLvalue(); leftSide.Apply(mover); PStm pStm = Util.GetAncestor<PStm>(node); pStm.ReplaceBy(new ABlockStm(new TLBrace("{"), block)); } else if (node.Parent() is AExpStm) { //No assignments needed leftSide = null; node.Parent().ReplaceBy(new ABlockStm(new TLBrace("{"), block)); } else { //Create a new local AALocalDecl leftSideDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(delegateMethod.GetReturnType(), finalTrans.data), new TIdentifier("delegateVar"), null); ALocalLvalue leftSideLink = new ALocalLvalue(new TIdentifier("delegateVar")); ALvalueExp leftSideLinkExp = new ALvalueExp(leftSideLink); PStm pStm = Util.GetAncestor<PStm>(node); AABlock pBlock = (AABlock)pStm.Parent(); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm), new ABlockStm(new TLBrace("{"), block)); node.ReplaceBy(leftSideLinkExp); finalTrans.data.LocalLinks[leftSideLink] = leftSideDecl; finalTrans.data.LvalueTypes[leftSideLink] = finalTrans.data.ExpTypes[leftSideLinkExp] = leftSideDecl.GetType(); leftSide = leftSideLink; block.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), leftSideDecl)); } ABlockStm elseBranch; //Make final else branch /* { * UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("<file>[<line>, <pos>]: No methods matched delegate.")); * IntToString(1/0); * return; * } */ { AABlock innerBlock = new AABlock(new ArrayList(), new TRBrace("}")); ASimpleInvokeExp playerGroupInvoke = new ASimpleInvokeExp(new TIdentifier("PlayerGroupAll"), new ArrayList()); AFieldLvalue messageAreaLink = new AFieldLvalue(new TIdentifier("c_messageAreaDebug")); ALvalueExp messageAreaLinkExp = new ALvalueExp(messageAreaLink); AStringConstExp stringConst = new AStringConstExp( new TStringLiteral("\"" + currentFile.GetName().Text.Replace('\\', '/') + "[" + node.GetToken().Line + ", " + node.GetToken().Pos + "]: Got a null delegate.\"")); ASimpleInvokeExp stringToTextInvoke = new ASimpleInvokeExp(new TIdentifier("StringToText"), new ArrayList() {stringConst}); ASimpleInvokeExp displayMessageInvoke = new ASimpleInvokeExp(new TIdentifier("UIDisplayMessage"), new ArrayList() { playerGroupInvoke, messageAreaLinkExp, stringToTextInvoke }); AIntConstExp intConst1 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst2 = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binop = new ABinopExp(intConst1, new ADivideBinop(new TDiv("/")), intConst2); ASimpleInvokeExp intToStringInvoke = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList() {binop}); innerBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), displayMessageInvoke)); innerBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), intToStringInvoke)); //innerBlock.GetStatements().Add(new AVoidReturnStm(new TReturn("return"))); elseBranch = new ABlockStm(new TLBrace("{"), innerBlock); finalTrans.data.SimpleMethodLinks[playerGroupInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == playerGroupInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[stringToTextInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringToTextInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[displayMessageInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == displayMessageInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[intToStringInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == intToStringInvoke.GetName().Text); finalTrans.data.FieldLinks[messageAreaLink] = finalTrans.data.Libraries.Fields.First(m => m.GetName().Text == messageAreaLink.GetName().Text); finalTrans.data.ExpTypes[playerGroupInvoke] = finalTrans.data.SimpleMethodLinks[playerGroupInvoke].GetReturnType(); finalTrans.data.LvalueTypes[messageAreaLink] = finalTrans.data.ExpTypes[messageAreaLinkExp] = finalTrans.data.FieldLinks[messageAreaLink].GetType(); finalTrans.data.ExpTypes[stringToTextInvoke] = finalTrans.data.SimpleMethodLinks[stringToTextInvoke].GetReturnType(); finalTrans.data.ExpTypes[stringConst] = finalTrans.data.ExpTypes[intToStringInvoke] = new ANamedType(new TIdentifier("string"), null); finalTrans.data.ExpTypes[displayMessageInvoke] = new AVoidType(); finalTrans.data.ExpTypes[intConst1] = finalTrans.data.ExpTypes[intConst2] = finalTrans.data.ExpTypes[binop] = new ANamedType(new TIdentifier("int"), null); } foreach (AMethodDecl method in methods) { /* * if (delegate == "...") * { * Foo(...); * } * else if (delegate == "...") * { * Bar(..., GetPointerPart(<reciever>); * } * else if(...) * ... */ AABlock innerBlock = new AABlock(new ArrayList(), new TRBrace("}")); ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier(method.GetName().Text), new ArrayList()); for (int i = 0; i < node.GetArgs().Count; i++) { PExp arg = (PExp) node.GetArgs()[i]; invoke.GetArgs().Add(Util.MakeClone(arg, finalTrans.data)); } //If we have a struct method, add the pointer from the delegate if (finalTrans.data.StructMethods.Any(str => str.Value.Contains(method))) { AStructDecl targetStr = finalTrans.data.StructMethods.First(str => str.Value.Contains(method)).Key; AMethodDecl getPointerDecl = GetPointerMethod(targetStr.GetDimention() != null); ASimpleInvokeExp getPointerInvoke = new ASimpleInvokeExp(new TIdentifier("renameMe"), new ArrayList() { Util.MakeClone(node.GetReceiver(), data) }); invoke.GetArgs().Add(getPointerInvoke); finalTrans.data.SimpleMethodLinks[getPointerInvoke] = getPointerDecl; finalTrans.data.ExpTypes[getPointerInvoke] = getPointerDecl.GetReturnType(); } finalTrans.data.SimpleMethodLinks[invoke] = method; finalTrans.data.ExpTypes[invoke] = method.GetReturnType(); if (leftSide == null) { innerBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), invoke)); } else { AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), Util.MakeClone(leftSide, finalTrans.data), invoke); finalTrans.data.ExpTypes[assignment] = finalTrans.data.ExpTypes[invoke]; innerBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment)); } ALocalLvalue methodPartLink = new ALocalLvalue(new TIdentifier("methodPart")); ALvalueExp methodPartLinkExp = new ALvalueExp(methodPartLink); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\"" + GetName(method) + "\"")); finalTrans.data.LocalLinks[methodPartLink] = methodPartDecl; finalTrans.data.LvalueTypes[methodPartLink] = finalTrans.data.ExpTypes[methodPartLinkExp] = finalTrans.data.ExpTypes[stringConst] = new ANamedType(new TIdentifier("string"), null); ABinopExp binop = new ABinopExp(methodPartLinkExp, new AEqBinop(new TEq("==")), stringConst); finalTrans.data.ExpTypes[binop] = new ANamedType(new TIdentifier("bool"), null); AIfThenElseStm ifThenElse = new AIfThenElseStm(new TLParen("("), binop, new ABlockStm(new TLBrace("{"), innerBlock), elseBranch); elseBranch = new ABlockStm(new TLBrace("{"), new AABlock(new ArrayList() { ifThenElse }, new TRBrace("}"))); } block.GetStatements().Add(elseBranch); }
public override void CaseAPointerLvalue(APointerLvalue node) { //Build the list currentPointer.Clear(); base.CaseAPointerLvalue(node); //Todo: insert runtime check here //if (currentPointer.Count == 0 || !setPointers.Contains(MakePointer(currentPointer))) if (!isSet) { PStm pStm = Util.GetAncestor<PStm>(node); if (pStm != null) { AABlock pBlock = (AABlock) pStm.Parent(); /* * if (<pointer> == null) * { * UIDisplayMessage(PlayerGroupAll, messageAreaDebug, StringToText(<filename>[<lineNr>:<pos>] + " null pointer exception")); * int i = 1 / 0; * } */ AASourceFile currentSourceFile = Util.GetAncestor<AASourceFile>(node); node.GetBase().Apply(new MoveMethodDeclsOut("pointerVar", data)); PExp pointer = Util.MakeClone(node.GetBase(), data); ABinopExp cond = new ABinopExp(pointer, new AEqBinop(new TEq("==")), new ANullExp()); AABlock ifBlock = new AABlock(); ASimpleInvokeExp playerGroupAllInvoke = new ASimpleInvokeExp(new TIdentifier("PlayerGroupAll"), new ArrayList()); AFieldLvalue messageAreaDebugLink = new AFieldLvalue(new TIdentifier("c_messageAreaDebug")); ALvalueExp messageAreaDebugLinkExp = new ALvalueExp(messageAreaDebugLink); ASimpleInvokeExp stringToTextInvoke = new ASimpleInvokeExp(new TIdentifier("StringToText"), new ArrayList() { new AStringConstExp( new TStringLiteral("\"" + currentSourceFile . GetName () . Text + "[" + node. GetTokens () . Line + "," + node. GetTokens () . Pos + "]: Null pointer exception\"")) }); ASimpleInvokeExp displayMessageInvoke = new ASimpleInvokeExp( new TIdentifier("UIDisplayMessage"), new ArrayList() {playerGroupAllInvoke, messageAreaDebugLinkExp, stringToTextInvoke}); ifBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), displayMessageInvoke)); ABinopExp iDeclInit = new ABinopExp(new AIntConstExp(new TIntegerLiteral("1")), new ADivideBinop(new TDiv("/")), new AIntConstExp(new TIntegerLiteral("0"))); AALocalDecl iDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("i"), iDeclInit); ifBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), iDecl)); pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm), new AIfThenStm(new TLParen("("), cond, new ABlockStm(new TLBrace("{"), ifBlock))); data.Locals[ifBlock] = new List<AALocalDecl>(){iDecl}; data.ExpTypes[cond.GetRight()] = new ANullType(); data.ExpTypes[cond] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[playerGroupAllInvoke] = new ANamedType(new TIdentifier("playergroup"), null); data.ExpTypes[messageAreaDebugLinkExp] = data.LvalueTypes[messageAreaDebugLink] = data.ExpTypes[iDeclInit] = data.ExpTypes[iDeclInit.GetLeft()] = data.ExpTypes[iDeclInit.GetRight()] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[stringToTextInvoke] = new ANamedType(new TIdentifier("text"), null); data.ExpTypes[(PExp) stringToTextInvoke.GetArgs()[0]] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[displayMessageInvoke] = new AVoidType(new TVoid("void")); data.SimpleMethodLinks[playerGroupAllInvoke] = data.Libraries.Methods.Find(m => m.GetName().Text == playerGroupAllInvoke.GetName().Text); data.SimpleMethodLinks[displayMessageInvoke] = data.Libraries.Methods.Find(m => m.GetName().Text == displayMessageInvoke.GetName().Text); data.SimpleMethodLinks[stringToTextInvoke] = data.Libraries.Methods.Find(m => m.GetName().Text == stringToTextInvoke.GetName().Text); data.FieldLinks[messageAreaDebugLink] = data.Libraries.Fields.Find(f => f.GetName().Text == messageAreaDebugLink.GetName().Text); if (currentPointer.Count > 0) { setPointers.Add(MakePointer(currentPointer)); } } } currentPointer.Add(new PointerPointer()); currentPointer = MakePointer(currentPointer); isSet = Contains(setPointers, currentPointer); isExposed = Contains(exposedPointers, currentPointer); //If the currentPointer is in null pointers, report error.. and then again - we might not reach this statement - warning, and runtime check //If the currentPointer is not in setPointers, insert runtime check }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { Item currentFile = GetIncludeItem(node); //If the method invocation is in a moved field, refference that field instead if (Util.GetAncestor<AFieldDecl>(node) != null) { Item i = allItems.OfType<FieldItem>().FirstOrDefault(item => item.FieldDecl == Util.GetAncestor<AFieldDecl>(node)); if (i != null) currentFile = i; } AMethodDecl decl = finalTrans.data.SimpleMethodLinks[node]; Item declItem = ((Item)allItems.OfType<MethodDeclItem>().FirstOrDefault(item => item.RealDecl == decl)) ?? allItems.OfType<IncludeItem>().First( item => item.Current == Util.GetAncestor<AASourceFile>(decl)); List<Item> cPath = currentFile.Path; List<Item> dPath = declItem.Path; for (int i = 0; i < Math.Min(cPath.Count, dPath.Count); i++) { Item cItem = cPath[i]; Item dItem = dPath[i]; if (cItem != dItem) {//We have a fork in the decls. make sure that the decl is before the used int cI = cPath[i - 1].Children.IndexOf(cItem); int dI = dPath[i - 1].Children.IndexOf(dItem); if (dI < cI) { break; } //Move the decl up before the used if (!(declItem is MethodDeclItem)) { declItem = new MethodDeclItem(decl, cPath[i - 1], new List<Item>()); allItems.Add(declItem); } else { declItem.Parent.Children.Remove(declItem); declItem.Parent = cPath[i - 1]; } cPath[i - 1].Children.Insert(cI, declItem); break; } if (i == cPath.Count - 1) { if (i == dPath.Count - 1) { //The decl and use is in same file. Ensure that the decl is before if (Util.TokenLessThan(decl.GetName(), node.GetName())) break; //Add the decl item declItem = new MethodDeclItem(decl, cPath[i], new List<Item>()); allItems.Add(declItem); cPath[i].Children.Add(declItem); break; } else { //The decl is included here or somewhere deeper. But above the use break; } } else if (i == dPath.Count - 1) { //We have reached the file where the decl is, but the use is included deeper, so it is above. Insert decl int cI = cPath[i].Children.IndexOf(cPath[i + 1]); declItem = new MethodDeclItem(decl, cPath[i], new List<Item>()); allItems.Add(declItem); cPath[i].Children.Insert(cI, declItem); break; } } base.CaseASimpleInvokeExp(node); }
private List<PStm> AssignDefault(PLvalue lvalue) { List<PStm> returner = new List<PStm>(); PType type = data.LvalueTypes[lvalue]; PExp rightSide = null; if (type is ANamedType) { ANamedType aType = (ANamedType)type; if (aType.IsPrimitive("string"))//aType.GetName().Text == "string") { rightSide = new AStringConstExp(new TStringLiteral("\"\"")); data.ExpTypes[rightSide] = new ANamedType(new TIdentifier("string"), null); } else if (aType.IsPrimitive(GalaxyKeywords.NullablePrimitives.words)) //GalaxyKeywords.NullablePrimitives.words.Contains(aType.GetName().Text)) { rightSide = new ANullExp(); data.ExpTypes[rightSide] = new ANamedType(new TIdentifier("null"), null); } else if (aType.IsPrimitive(new []{"int", "byte", "fixed"})) /*aType.GetName().Text == "int" || aType.GetName().Text == "byte" || aType.GetName().Text == "fixed")*/ { rightSide = new AIntConstExp(new TIntegerLiteral("0")); data.ExpTypes[rightSide] = type; } else if (aType.IsPrimitive("bool"))//aType.GetName().Text == "bool") { rightSide = new ABooleanConstExp(new AFalseBool()); data.ExpTypes[rightSide] = type; } else if (aType.IsPrimitive("color"))//aType.GetName().Text == "color") { PExp arg1 = new AIntConstExp(new TIntegerLiteral("0")); PExp arg2 = new AIntConstExp(new TIntegerLiteral("0")); PExp arg3 = new AIntConstExp(new TIntegerLiteral("0")); ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("Color"), new ArrayList() { arg1, arg2, arg3 }); rightSide = invoke; data.ExpTypes[rightSide] = type; data.ExpTypes[arg1] = data.ExpTypes[arg2] = data.ExpTypes[arg3] = new ANamedType(new TIdentifier("int"), null); data.SimpleMethodLinks[invoke] = data.Libraries.Methods.First(func => func.GetName().Text == invoke.GetName().Text); } else if (aType.IsPrimitive("char"))//aType.GetName().Text == "char") { //Dunno?! rightSide = new ACharConstExp(new TCharLiteral("'\0'")); data.ExpTypes[rightSide] = type; } else //Struct { AStructDecl str = data.StructTypeLinks[aType]; foreach (AALocalDecl localDecl in str.GetLocals()) { ALvalueExp reciever = new ALvalueExp(Util.MakeClone(lvalue, data)); AStructLvalue newLvalue = new AStructLvalue(reciever, new ADotDotType(new TDot(".")), new TIdentifier(localDecl.GetName().Text)); data.StructFieldLinks[newLvalue] = localDecl; data.ExpTypes[reciever] = type; data.LvalueTypes[newLvalue] = localDecl.GetType(); returner.AddRange(AssignDefault(newLvalue)); } return returner; } AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), Util.MakeClone(lvalue, data), rightSide); data.ExpTypes[assignment] = type; return new List<PStm>() { new AExpStm(new TSemicolon(";"), assignment) }; } if (type is AArrayTempType) { AArrayTempType aType = (AArrayTempType)type; for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++) { ALvalueExp reciever = new ALvalueExp(Util.MakeClone(lvalue, data)); AArrayLvalue newLvalue = new AArrayLvalue(new TLBracket("["), reciever, new AIntConstExp(new TIntegerLiteral(i.ToString()))); data.ExpTypes[reciever] = type; data.LvalueTypes[newLvalue] = aType.GetType(); data.ExpTypes[newLvalue.GetIndex()] = new ANamedType(new TIdentifier("int"), null); returner.AddRange(AssignDefault(newLvalue)); } return returner; } throw new Exception("Unexpected type. (LivenessAnalasys.AssignDefault), got " + type); }
public override void OutASimpleInvokeExp(ASimpleInvokeExp node) { if (data.SimpleMethodLinks.ContainsKey(node)) return; List<AMethodDecl> candidates = new List<AMethodDecl>(); List<AMethodDecl> implicitCandidates = new List<AMethodDecl>(); List<AMethodDecl> matchingNames = new List<AMethodDecl>(); List<PType> argTypes = new List<PType>(); foreach (PExp exp in node.GetArgs()) { argTypes.Add(data.ExpTypes[exp]); } PExp baseExp; bool matchResize; GetTargets(node.GetName().Text, node.GetName(), null, null, argTypes, candidates, out matchResize, implicitCandidates, matchingNames, out baseExp, null, data, errors); if (baseExp != null) { ANonstaticInvokeExp replacer = new ANonstaticInvokeExp(baseExp, new ADotDotType(new TDot(".")), node.GetName(), new ArrayList()); while (node.GetArgs().Count > 0) { replacer.GetArgs().Add(node.GetArgs()[0]); } node.ReplaceBy(replacer); baseExp.Apply(this); OutANonstaticInvokeExp(replacer); return; } AMethodDecl decl; if (candidates.Count == 0 && implicitCandidates.Count == 1) { //Do the implicit casts for (int i = 0; i < node.GetArgs().Count; i++) { PType argType = data.ExpTypes[(PExp)node.GetArgs()[i]]; AALocalDecl formal = (AALocalDecl)implicitCandidates[0].GetFormals()[i]; PType formalType = formal.GetType(); if (formal.GetOut() != null && !Assignable(formalType, argType) || formal.GetRef() != null && !(Assignable(argType, formalType) && Assignable(formalType, argType)) || formal.GetOut() == null && formal.GetRef() == null && !Assignable(argType, formalType)) { PExp exp = (PExp)node.GetArgs()[i]; ACastExp cast = new ACastExp(new TLParen("("), Util.MakeClone(formalType, data), null); exp.ReplaceBy(cast); cast.SetExp(exp); OutACastExp(cast); } } decl = implicitCandidates[0]; } else decl = candidates[0]; data.SimpleMethodLinks.Add(node, decl); data.ExpTypes.Add(node, decl.GetReturnType()); CheckInvoke(node, decl); base.OutASimpleInvokeExp(node); }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { Write(node.GetName().Text + "("); bool first = true; foreach (PExp exp in node.GetArgs()) { if (!first) Write(", "); exp.Apply(this); first = false; } Write(")"); }
public override void CaseAArrayLvalue(AArrayLvalue node) { hadPointer = false; node.GetIndex().Apply(this); if (hadPointer) {//The index is a dynamic int string typeName = ((ANamedType) data.ExpTypes[node.GetIndex()]).AsString(); node.GetIndex().ReplaceBy(CreateDynaicGetStm(typeName)); } node.GetBase().Apply(this); if (hadPointer) { //if (Util.GetAncestor<AAssignmentExp>(node) != null || Util.GetAncestor<APArrayLengthLvalue>(node) != null) { //Todo: Check if the index is within array (runtime) ASimpleInvokeExp intToString = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList()); intToString.GetArgs().Add(Util.MakeClone(node.GetIndex(), data)); ABinopExp binopExp1 = new ABinopExp(nameExp, 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("\"]\""))); data.ExpTypes[binopExp1] = data.ExpTypes[binopExp2] = data.ExpTypes[binopExp3] = data.ExpTypes[binopExp1.GetRight()] = data.ExpTypes[binopExp3.GetRight()] = data.ExpTypes[intToString] =new ANamedType(new TIdentifier("string"), null); data.SimpleMethodLinks[intToString] = data.Libraries.Methods.First(method => method.GetName().Text == intToString.GetName().Text); nameExp = binopExp3; } CheckDynamicLvalue(node); } }
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 static AMethodDecl CreateNewObjectMethod(Node node, SharedData data) { if (newObjectMethod != null) return newObjectMethod; /* Insert string CreateNewObject() { //Get next item nr int itemNr = DataTableGetInt(true, "Objects\\Count"); itemNr = itemNr + 1; DataTableSetInt(true, "Objects\\Count", itemNr); DataTableSetBool(true, "Objects\\" + IntToString(itemNr) + "\\Exists", true); return "Objects\\" + IntToString(itemNr); } */ AABlock methodBlock = new AABlock(); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("CreateNewObject"), new ArrayList(), methodBlock); ASimpleInvokeExp dataTableGetIntInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableGetInt"), new ArrayList()); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); dataTableGetIntInvoke.GetArgs().Add(trueConst1); AStringConstExp stringConst1 = new AStringConstExp(new TStringLiteral("\"Objects\\\\Count\"")); dataTableGetIntInvoke.GetArgs().Add(stringConst1); AALocalDecl itemNrDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("itemNr"), dataTableGetIntInvoke); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), itemNrDecl)); ALocalLvalue itemNrLink1 = new ALocalLvalue(new TIdentifier("itemNr")); ALocalLvalue itemNrLink2 = new ALocalLvalue(new TIdentifier("itemNr")); ALvalueExp itemNrLink2Exp = new ALvalueExp(itemNrLink2); AIntConstExp intConst = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop1 = new ABinopExp(itemNrLink2Exp, new APlusBinop(new TPlus("+")), intConst); AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), itemNrLink1, binop1); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment)); ASimpleInvokeExp dataTableSetIntInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSetInt"), new ArrayList()); ABooleanConstExp trueConst2 = new ABooleanConstExp(new ATrueBool()); dataTableSetIntInvoke.GetArgs().Add(trueConst2); AStringConstExp stringConst2 = new AStringConstExp(new TStringLiteral("\"Objects\\\\Count\"")); dataTableSetIntInvoke.GetArgs().Add(stringConst2); ALocalLvalue itemNrLink3 = new ALocalLvalue(new TIdentifier("itemNr")); ALvalueExp itemNrLink3Exp = new ALvalueExp(itemNrLink3); dataTableSetIntInvoke.GetArgs().Add(itemNrLink3Exp); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableSetIntInvoke)); ASimpleInvokeExp dataTableSetBoolInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSetBool"), new ArrayList()); ABooleanConstExp trueConst3 = new ABooleanConstExp(new ATrueBool()); dataTableSetBoolInvoke.GetArgs().Add(trueConst3); AStringConstExp stringConst3 = new AStringConstExp(new TStringLiteral("\"Objects\\\\\"")); ASimpleInvokeExp intToStringInvoke1 = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList()); ALocalLvalue itemNrLink4 = new ALocalLvalue(new TIdentifier("itemNr")); ALvalueExp itemNrLink4Exp = new ALvalueExp(itemNrLink4); intToStringInvoke1.GetArgs().Add(itemNrLink4Exp); ABinopExp binop2 = new ABinopExp(stringConst3, new APlusBinop(new TPlus("+")), intToStringInvoke1); AStringConstExp stringConst4 = new AStringConstExp(new TStringLiteral("\"\\\\Exists\"")); ABinopExp binop3 = new ABinopExp(binop2, new APlusBinop(new TPlus("+")), stringConst4); dataTableSetBoolInvoke.GetArgs().Add(binop3); ABooleanConstExp trueConst4 = new ABooleanConstExp(new ATrueBool()); dataTableSetBoolInvoke.GetArgs().Add(trueConst4); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableSetBoolInvoke)); AStringConstExp stringConst5 = new AStringConstExp(new TStringLiteral("\"Objects\\\\\"")); ASimpleInvokeExp intToStringInvoke2 = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList()); ALocalLvalue itemNrLink5 = new ALocalLvalue(new TIdentifier("itemNr")); ALvalueExp itemNrLink5Exp = new ALvalueExp(itemNrLink5); intToStringInvoke2.GetArgs().Add(itemNrLink5Exp); ABinopExp binop4 = new ABinopExp(stringConst5, new APlusBinop(new TPlus("+")), intToStringInvoke2); methodBlock.GetStatements().Add(new AValueReturnStm(new TReturn("return"), binop4)); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(method); data.Locals[methodBlock] = new List<AALocalDecl>() { itemNrDecl }; data.LocalLinks[itemNrLink1] = data.LocalLinks[itemNrLink2] = data.LocalLinks[itemNrLink3] = data.LocalLinks[itemNrLink4] = data.LocalLinks[itemNrLink5] = itemNrDecl; data.SimpleMethodLinks[dataTableSetIntInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableSetIntInvoke.GetName().Text); data.SimpleMethodLinks[dataTableGetIntInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableGetIntInvoke.GetName().Text); data.SimpleMethodLinks[dataTableSetBoolInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableSetBoolInvoke.GetName().Text); data.SimpleMethodLinks[intToStringInvoke1] = data.SimpleMethodLinks[intToStringInvoke2] = data.Libraries.Methods.First(m => m.GetName().Text == intToStringInvoke1.GetName().Text); data.ExpTypes[stringConst1] = data.ExpTypes[stringConst2] = data.ExpTypes[stringConst3] = data.ExpTypes[stringConst4] = data.ExpTypes[stringConst5] = data.ExpTypes[binop2] = data.ExpTypes[binop3] = data.ExpTypes[binop4] = data.ExpTypes[intToStringInvoke1] = data.ExpTypes[intToStringInvoke2] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[trueConst1] = data.ExpTypes[trueConst2] = data.ExpTypes[trueConst3] = data.ExpTypes[trueConst4] = new ANamedType(new TIdentifier("bool"), null); data.LvalueTypes[itemNrLink1] = data.LvalueTypes[itemNrLink2] = data.LvalueTypes[itemNrLink3] = data.LvalueTypes[itemNrLink4] = data.LvalueTypes[itemNrLink5] = data.ExpTypes[itemNrLink2Exp] = data.ExpTypes[itemNrLink3Exp] = data.ExpTypes[itemNrLink4Exp] = data.ExpTypes[itemNrLink5Exp] = data.ExpTypes[binop1] = data.ExpTypes[assignment] = data.ExpTypes[dataTableGetIntInvoke] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[dataTableSetBoolInvoke] = data.ExpTypes[dataTableSetIntInvoke] = new AVoidType(new TVoid("void")); newObjectMethod = method; return newObjectMethod; }
public static AMethodDecl CreateResizeArrayMethod(Node node, PType baseType, SharedData data) { //Search already created stuff, and return that if present. //All non struct baseTypes get the simple version ANamedType aBaseType = null; AStructDecl structDecl = null; if (Util.IsBulkCopy(baseType)) { aBaseType = (ANamedType)baseType; structDecl = data.StructTypeLinks[aBaseType]; if (resizeArrayMethods.ContainsKey(structDecl)) return resizeArrayMethods[structDecl]; } else if (simpleResizeArrayMethod != null) return simpleResizeArrayMethod; //Create /* void Resize(int newSize, string id) { int oldSize = DataTableGetInt(true, id + "\\Length"); while (oldSize > newSize) { //Delete everything up to now oldSize = oldSize - 1; DeleteStruct<name>(id + "[" + IntToString(oldSize) + "]");//If struct type DataTableValueRemove(true, id + "[" + IntToString(oldSize) + "]"); } DataTableSetInt(true, id + "\\Length", newSize); } */ AALocalDecl newSizeFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("newSize"), null); AALocalDecl idFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("id"), null); AABlock methodBlock = new AABlock(new ArrayList(), new TRBrace("}")); //int oldSize = DataTableGetInt(true, id + "\\Length"); ABooleanConstExp boolConstExp1 = new ABooleanConstExp(new ATrueBool()); AStringConstExp stringConstExp1 = new AStringConstExp(new TStringLiteral("\"\\\\Length\"")); ALocalLvalue idRef1 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idRef1Exp = new ALvalueExp(idRef1); ABinopExp binop1 = new ABinopExp(idRef1Exp, new APlusBinop(new TPlus("+")), stringConstExp1); ASimpleInvokeExp getSizeInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableGetInt"), new ArrayList(){boolConstExp1, binop1}); AALocalDecl oldSizeDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("oldSize"), getSizeInvoke); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), oldSizeDecl)); //while (oldSize > newSize) ALocalLvalue oldSizeRef1 = new ALocalLvalue(new TIdentifier("oldSize")); ALvalueExp oldSizeRef1Exp = new ALvalueExp(oldSizeRef1); ALocalLvalue newSizeRef1 = new ALocalLvalue(new TIdentifier("newSize")); ALvalueExp newSizeRef1Exp = new ALvalueExp(newSizeRef1); ABinopExp binop2 = new ABinopExp(oldSizeRef1Exp, new AGtBinop(new TGt(">")), newSizeRef1Exp); AABlock whileBlock = new AABlock(new ArrayList(), new TRBrace("}")); methodBlock.GetStatements().Add(new AWhileStm(new TLParen("("), binop2, new ABlockStm(new TLBrace("{"), whileBlock))); //oldSize = oldSize - 1; ALocalLvalue oldSizeRef2 = new ALocalLvalue(new TIdentifier("oldSize")); ALocalLvalue oldSizeRef3 = new ALocalLvalue(new TIdentifier("oldSize")); ALvalueExp oldSizeRef3Exp = new ALvalueExp(oldSizeRef3); AIntConstExp intConst1 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop3 = new ABinopExp(oldSizeRef3Exp, new AMinusBinop(new TMinus("-")), intConst1); AAssignmentExp assignment1 = new AAssignmentExp(new TAssign("="), oldSizeRef2, binop3); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment1)); //DeleteStruct<name>(id + "[" + IntToString(oldSize) + "]");//If struct type ALocalLvalue idRef2 = null; ALvalueExp idRef2Exp = null; AStringConstExp stringConstExp2 = null; AStringConstExp stringConstExp3 = null; ALocalLvalue oldSizeRef4 = null; ALvalueExp oldSizeRef4Exp = null; ASimpleInvokeExp intToString1 = null; ABinopExp binop4 = null; ABinopExp binop5 = null; ABinopExp binop6 = null; ASimpleInvokeExp deleteStructInvoke = null; if (aBaseType != null) { idRef2 = new ALocalLvalue(new TIdentifier("id")); idRef2Exp = new ALvalueExp(idRef2); stringConstExp2 = new AStringConstExp(new TStringLiteral("\"[\"")); stringConstExp3 = new AStringConstExp(new TStringLiteral("\"]\"")); oldSizeRef4 = new ALocalLvalue(new TIdentifier("oldSize")); oldSizeRef4Exp = new ALvalueExp(oldSizeRef4); intToString1 = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList() { oldSizeRef4Exp }); binop4 = new ABinopExp(intToString1, new APlusBinop(new TPlus("+")), stringConstExp3); binop5 = new ABinopExp(stringConstExp2, new APlusBinop(new TPlus("+")), binop4); binop6 = new ABinopExp(idRef2Exp, new APlusBinop(new TPlus("+")), binop5); deleteStructInvoke = new ASimpleInvokeExp(new TIdentifier("DeleteStruct" + aBaseType.AsIdentifierString()), new ArrayList() { binop6 }); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), deleteStructInvoke)); } //DataTableValueRemove(true, id + "[" + IntToString(oldSize) + "]"); ABooleanConstExp boolConstExp2 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idRef3 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idRef3Exp = new ALvalueExp(idRef3); AStringConstExp stringConstExp4 = new AStringConstExp(new TStringLiteral("\"[\"")); AStringConstExp stringConstExp5 = new AStringConstExp(new TStringLiteral("\"]\"")); ALocalLvalue oldSizeRef5 = new ALocalLvalue(new TIdentifier("oldSize")); ALvalueExp oldSizeRef5Exp = new ALvalueExp(oldSizeRef5); ASimpleInvokeExp intToString2 = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList(){oldSizeRef5Exp}); ABinopExp binop7 = new ABinopExp(intToString2, new APlusBinop(new TPlus("+")), stringConstExp5); ABinopExp binop8 = new ABinopExp(stringConstExp4, new APlusBinop(new TPlus("+")), binop7); ABinopExp binop9 = new ABinopExp(idRef3Exp, new APlusBinop(new TPlus("+")), binop8); ASimpleInvokeExp dataTableRemove = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() {boolConstExp2, binop9}); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableRemove)); //DataTableSetInt(true, id + "\\Length", newSize); ABooleanConstExp boolConstExp3 = new ABooleanConstExp(new ATrueBool()); AStringConstExp stringConstExp6 = new AStringConstExp(new TStringLiteral("\"\\\\Length\"")); ALocalLvalue idRef4 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idRef4Exp = new ALvalueExp(idRef4); ABinopExp binop10 = new ABinopExp(idRef4Exp, new APlusBinop(new TPlus("+")), stringConstExp6); ALocalLvalue newSizeRef2 = new ALocalLvalue(new TIdentifier("newSize")); ALvalueExp newSizeRef2Exp = new ALvalueExp(newSizeRef2); ASimpleInvokeExp setSizeInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSetInt"), new ArrayList() {boolConstExp3, binop10, newSizeRef2Exp}); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), setSizeInvoke)); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new AVoidType(new TVoid("void")), new TIdentifier("ResizeArray"), new ArrayList() { newSizeFormal, idFormal }, methodBlock); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(method); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, method)); data.LvalueTypes[oldSizeRef1] = data.LvalueTypes[oldSizeRef2] = data.LvalueTypes[oldSizeRef3] = //data.LvalueTypes[oldSizeRef4] = data.LvalueTypes[oldSizeRef5] = data.ExpTypes[oldSizeRef1Exp] = data.ExpTypes[oldSizeRef3Exp] = //data.ExpTypes[oldSizeRef4Exp] = data.ExpTypes[oldSizeRef5Exp] = data.LvalueTypes[newSizeRef1] = data.LvalueTypes[newSizeRef2] = data.ExpTypes[newSizeRef1Exp] = data.ExpTypes[newSizeRef2Exp] = data.ExpTypes[binop3] = data.ExpTypes[assignment1] = data.ExpTypes[getSizeInvoke] = new ANamedType(new TIdentifier("int"), null); data.LvalueTypes[idRef1] = //data.LvalueTypes[idRef2] = data.LvalueTypes[idRef3] = data.LvalueTypes[idRef4] = data.ExpTypes[idRef1Exp] = //data.ExpTypes[idRef2Exp] = data.ExpTypes[idRef3Exp] = data.ExpTypes[idRef4Exp] = data.ExpTypes[stringConstExp1] = //data.ExpTypes[stringConstExp2] = //data.ExpTypes[stringConstExp3] = data.ExpTypes[stringConstExp4] = data.ExpTypes[stringConstExp5] = data.ExpTypes[stringConstExp6] = data.ExpTypes[binop1] = //data.ExpTypes[binop4] = //data.ExpTypes[binop5] = //data.ExpTypes[binop6] = data.ExpTypes[binop7] = data.ExpTypes[binop8] = data.ExpTypes[binop9] = data.ExpTypes[binop10] = //data.ExpTypes[intToString1] = data.ExpTypes[intToString2] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[dataTableRemove] = //data.ExpTypes[deleteStructInvoke] = data.ExpTypes[setSizeInvoke] = new AVoidType(new TVoid("void")); data.ExpTypes[boolConstExp1] = data.ExpTypes[boolConstExp2] = data.ExpTypes[boolConstExp3] = data.ExpTypes[binop2] = new ANamedType(new TIdentifier("bool"), null); data.LocalLinks[oldSizeRef1] = data.LocalLinks[oldSizeRef2] = data.LocalLinks[oldSizeRef3] = data.LocalLinks[oldSizeRef5] = oldSizeDecl; data.LocalLinks[newSizeRef1] = data.LocalLinks[newSizeRef2] = newSizeFormal; data.LocalLinks[idRef1] = data.LocalLinks[idRef3] = data.LocalLinks[idRef4] = idFormal; data.SimpleMethodLinks[getSizeInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == getSizeInvoke.GetName().Text); data.SimpleMethodLinks[setSizeInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == setSizeInvoke.GetName().Text); data.SimpleMethodLinks[dataTableRemove] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableRemove.GetName().Text); data.SimpleMethodLinks[intToString2] = data.Libraries.Methods.First(m => m.GetName().Text == intToString2.GetName().Text); if (aBaseType == null) return simpleResizeArrayMethod = method; data.LvalueTypes[oldSizeRef4] = data.ExpTypes[oldSizeRef4Exp] = new ANamedType(new TIdentifier("int"), null); data.LvalueTypes[idRef2] = data.ExpTypes[idRef2Exp] = data.ExpTypes[stringConstExp2] = data.ExpTypes[stringConstExp3] = data.ExpTypes[binop4] = data.ExpTypes[binop5] = data.ExpTypes[binop6] = data.ExpTypes[intToString1] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[deleteStructInvoke] = new AVoidType(new TVoid("void")); data.LocalLinks[oldSizeRef4] = oldSizeDecl; data.LocalLinks[idRef2] = idFormal; data.SimpleMethodLinks[deleteStructInvoke] = CreateDeleteStructMethod(node, structDecl, data); data.SimpleMethodLinks[intToString1] = data.SimpleMethodLinks[intToString2]; method.SetName(new TIdentifier("Resize" + aBaseType.AsIdentifierString() + "Array")); resizeArrayMethods.Add(structDecl, method); return method; }
public static AMethodDecl CreateNewArrayMethod(Node node, SharedData data) { if (newArrayMethod != null) return newArrayMethod; if (newObjectMethod == null) CreateNewObjectMethod(node, data); /* Insert * string CreateNewArray(int length) { string id = CreateNewObject(); DataTableSetInt(true, id + "\\Length", length); return id; } */ AALocalDecl lengthDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("length"), null); AABlock methodBlock = new AABlock(); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("CreateNewArray"), new ArrayList() { lengthDecl }, methodBlock); ASimpleInvokeExp createNewObjectInvoke = new ASimpleInvokeExp(new TIdentifier("CreateNewObject"), new ArrayList()); AALocalDecl idDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("id"), createNewObjectInvoke); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), idDecl)); ASimpleInvokeExp dataTableSetIntInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSetInt"), new ArrayList()); ABooleanConstExp trueConst = new ABooleanConstExp(new ATrueBool()); dataTableSetIntInvoke.GetArgs().Add(trueConst); ALocalLvalue idLink1 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink1Exp = new ALvalueExp(idLink1); AStringConstExp lengthText = new AStringConstExp(new TStringLiteral("\"\\\\Length\"")); ABinopExp binopExp = new ABinopExp(idLink1Exp, new APlusBinop(new TPlus("+")), lengthText); dataTableSetIntInvoke.GetArgs().Add(binopExp); ALocalLvalue lenghtLink = new ALocalLvalue(new TIdentifier("length")); ALvalueExp lengthLinkExp = new ALvalueExp(lenghtLink); dataTableSetIntInvoke.GetArgs().Add(lengthLinkExp); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableSetIntInvoke)); ALocalLvalue idLink2 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink2Exp = new ALvalueExp(idLink2); methodBlock.GetStatements().Add(new AValueReturnStm(new TReturn("return"), idLink2Exp)); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(method); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, method)); data.Locals[methodBlock] = new List<AALocalDecl> { lengthDecl, idDecl }; data.LocalLinks[lenghtLink] = lengthDecl; data.LocalLinks[idLink1] = idDecl; data.LocalLinks[idLink2] = idDecl; data.SimpleMethodLinks[dataTableSetIntInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableSetIntInvoke.GetName().Text); data.ExpTypes[createNewObjectInvoke] = data.ExpTypes[lengthText] = data.LvalueTypes[idLink1] = data.LvalueTypes[idLink2] = data.ExpTypes[idLink1Exp] = data.ExpTypes[idLink2Exp] = data.ExpTypes[binopExp] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[trueConst] = new ANamedType(new TIdentifier("bool"), null); data.LvalueTypes[lenghtLink] = data.ExpTypes[lengthLinkExp] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[dataTableSetIntInvoke] = new AVoidType(new TVoid("void")); data.SimpleMethodLinks[createNewObjectInvoke] = newObjectMethod; newArrayMethod = method; return newArrayMethod; }
public static AMethodDecl CreateDeleteObjectMethod(Node node, SharedData data) { if (deleteObjectMethod != null) return deleteObjectMethod; /*Insert * void DeleteObject(string id) { DataTableValueRemove(true, id + "\\Exists"); DataTableValueRemove(true, id); } */ AALocalDecl idDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("id"), null); AABlock block = new AABlock(); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new AVoidType(new TVoid("void")), new TIdentifier("DeleteObject"), new ArrayList() {idDecl}, block); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idLink1 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink1Exp = new ALvalueExp(idLink1); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\"\\\\Exists\"")); ABinopExp binop = new ABinopExp(idLink1Exp, new APlusBinop(new TPlus("+")), stringConst); ASimpleInvokeExp dataTableValueRemove1 = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() { trueConst1, binop }); block.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableValueRemove1)); ABooleanConstExp trueConst2 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idLink2 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink2Exp = new ALvalueExp(idLink2); ASimpleInvokeExp dataTableValueRemove2 = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() { trueConst2, idLink2Exp }); block.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableValueRemove2)); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(method); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, method)); data.Locals[block] = new List<AALocalDecl> { idDecl }; data.LocalLinks[idLink1] = idDecl; data.LocalLinks[idLink2] = idDecl; data.SimpleMethodLinks[dataTableValueRemove1] = data.SimpleMethodLinks[dataTableValueRemove2] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableValueRemove1.GetName().Text); data.ExpTypes[stringConst] = data.LvalueTypes[idLink1] = data.LvalueTypes[idLink2] = data.ExpTypes[idLink1Exp] = data.ExpTypes[idLink2Exp] = data.ExpTypes[binop] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[trueConst1] = data.ExpTypes[trueConst2] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[dataTableValueRemove1] = data.ExpTypes[dataTableValueRemove2] = new AVoidType(new TVoid("void")); deleteObjectMethod = method; return deleteObjectMethod; }
public static AMethodDecl CreateDeleteArrayMethod(Node node, SharedData data) { if (deleteArrayMethod != null) return deleteArrayMethod; /* void DeleteArray(string id) { int length = DataTableGetInt(true, id + "\\Length"); while (length > 0) { length = length - 1; DataTableValueRemove(true, id + "[" + IntToString(length) + "]"); } DataTableValueRemove(true, id + "\\Length"); DataTableValueRemove(true, id + "\\Exists"); } */ AALocalDecl idDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("id"), null); AABlock block = new AABlock(); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new AVoidType(new TVoid("void")), new TIdentifier("DeleteArray"), new ArrayList() { idDecl }, block); ALocalLvalue idLink1 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink1Exp = new ALvalueExp(idLink1); ABinopExp binopExp1 = new ABinopExp(idLink1Exp, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"\\\\Length\""))); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); ASimpleInvokeExp dataTableGetIntInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableGetInt"), new ArrayList{trueConst1, binopExp1}); AALocalDecl lengthDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("length"), dataTableGetIntInvoke); block.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), lengthDecl)); ALocalLvalue lengthLink1 = new ALocalLvalue(new TIdentifier("length")); ALvalueExp lengthLink1Exp = new ALvalueExp(lengthLink1); ABinopExp binopExp2 = new ABinopExp(lengthLink1Exp, new AGtBinop(new TGt(">")), new AIntConstExp(new TIntegerLiteral("0"))); AABlock whileBlock = new AABlock(); block.GetStatements().Add(new AWhileStm(new TLParen("("), binopExp2, new ABlockStm(new TLBrace("{"), whileBlock))); ALocalLvalue lengthLink2 = new ALocalLvalue(new TIdentifier("length")); ALvalueExp lengthLink2Exp = new ALvalueExp(lengthLink2); ALocalLvalue lengthLink3 = new ALocalLvalue(new TIdentifier("length")); ABinopExp binopExp3 = new ABinopExp(lengthLink2Exp, new AMinusBinop(new TMinus("-")), new AIntConstExp(new TIntegerLiteral("1"))); AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), lengthLink3, binopExp3); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment)); ABooleanConstExp trueConst2 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idLink2 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink2Exp = new ALvalueExp(idLink2); ALocalLvalue lengthLink4 = new ALocalLvalue(new TIdentifier("length")); ALvalueExp lengthLink4Exp = new ALvalueExp(lengthLink4); ASimpleInvokeExp intToStringInvoke = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList(){lengthLink4Exp}); ABinopExp binopExp4 = new ABinopExp(idLink2Exp, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"[\""))); ABinopExp binopExp5 = new ABinopExp(binopExp4, new APlusBinop(new TPlus("+")), intToStringInvoke); ABinopExp binopExp6 = new ABinopExp(binopExp5, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"]\""))); ASimpleInvokeExp dataTableRemoveInvoke1 = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList(){trueConst2, binopExp6}); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableRemoveInvoke1)); ABooleanConstExp trueConst3 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idLink3 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink3Exp = new ALvalueExp(idLink3); ABinopExp binopExp7 = new ABinopExp(idLink3Exp, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"\\\\Length\""))); ASimpleInvokeExp dataTableRemoveInvoke2 = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() { trueConst3, binopExp7 }); block.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableRemoveInvoke2)); ABooleanConstExp trueConst4 = new ABooleanConstExp(new ATrueBool()); ALocalLvalue idLink4 = new ALocalLvalue(new TIdentifier("id")); ALvalueExp idLink4Exp = new ALvalueExp(idLink4); ABinopExp binopExp8 = new ABinopExp(idLink4Exp, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"\\\\Exists\""))); ASimpleInvokeExp dataTableRemoveInvoke3 = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() { trueConst4, binopExp8 }); block.GetStatements().Add(new AExpStm(new TSemicolon(";"), dataTableRemoveInvoke3)); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(method); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, method)); data.Locals[block] = new List<AALocalDecl> { idDecl, lengthDecl }; data.LocalLinks[idLink1] = data.LocalLinks[idLink2] = data.LocalLinks[idLink3] = data.LocalLinks[idLink4] = idDecl; data.LocalLinks[lengthLink1] = data.LocalLinks[lengthLink2] = data.LocalLinks[lengthLink3] = data.LocalLinks[lengthLink4] = lengthDecl; data.SimpleMethodLinks[dataTableRemoveInvoke1] = data.SimpleMethodLinks[dataTableRemoveInvoke2] = data.SimpleMethodLinks[dataTableRemoveInvoke3] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableRemoveInvoke1.GetName().Text); data.SimpleMethodLinks[dataTableGetIntInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == dataTableGetIntInvoke.GetName().Text); data.SimpleMethodLinks[intToStringInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == intToStringInvoke.GetName().Text); data.LvalueTypes[idLink1] = data.LvalueTypes[idLink2] = data.LvalueTypes[idLink3] = data.LvalueTypes[idLink4] = data.ExpTypes[idLink1Exp] = data.ExpTypes[idLink2Exp] = data.ExpTypes[idLink3Exp] = data.ExpTypes[idLink4Exp] = data.ExpTypes[binopExp1] = data.ExpTypes[binopExp4] = data.ExpTypes[binopExp5] = data.ExpTypes[binopExp6] = data.ExpTypes[binopExp7] = data.ExpTypes[binopExp8] = data.ExpTypes[binopExp1.GetRight()] = data.ExpTypes[binopExp4.GetRight()] = data.ExpTypes[binopExp6.GetRight()] = data.ExpTypes[binopExp7.GetRight()] = data.ExpTypes[binopExp8.GetRight()] = data.ExpTypes[intToStringInvoke] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[trueConst1] = data.ExpTypes[trueConst2] = data.ExpTypes[trueConst3] = data.ExpTypes[trueConst4] = data.ExpTypes[binopExp2] = new ANamedType(new TIdentifier("bool"), null); data.LvalueTypes[lengthLink1] = data.LvalueTypes[lengthLink2] = data.LvalueTypes[lengthLink3] = data.LvalueTypes[lengthLink4] = data.ExpTypes[lengthLink1Exp] = data.ExpTypes[lengthLink2Exp] = data.ExpTypes[lengthLink4Exp] = data.ExpTypes[binopExp3] = data.ExpTypes[binopExp2.GetRight()] = data.ExpTypes[binopExp3.GetRight()] = data.ExpTypes[dataTableGetIntInvoke] = data.ExpTypes[assignment] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[dataTableRemoveInvoke1] = data.ExpTypes[dataTableRemoveInvoke2] = data.ExpTypes[dataTableRemoveInvoke3] = new AVoidType(new TVoid("void")); deleteArrayMethod = method; return deleteArrayMethod; }
private AMethodDecl GetIntPointerMethod() { if (GetIntPointerPartMethod != null) return GetIntPointerPartMethod; /* * int GetIntPointerPart(string delegate) * { * return IntToString(GetPointerPart(delegate)); * } */ AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(finalTrans.mainEntry); AALocalDecl delegateFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("delegate"), null); ALocalLvalue delegateRef1 = new ALocalLvalue(new TIdentifier("delegate")); ALvalueExp delegateRef1Exp = new ALvalueExp(delegateRef1); ASimpleInvokeExp getPointerPartInvoke = new ASimpleInvokeExp(new TIdentifier("GetPointerPart"), new ArrayList() { delegateRef1Exp }); ASimpleInvokeExp StringToIntInvoke = new ASimpleInvokeExp(new TIdentifier("StringToInt"), new ArrayList() { getPointerPartInvoke }); GetIntPointerPartMethod = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("GetPointerPart", finalTrans.data.LineCounts[sourceFile] + 1, 1), new ArrayList() { delegateFormal }, new AABlock( new ArrayList() { new AValueReturnStm(new TReturn("return"), StringToIntInvoke) }, new TRBrace("}"))); sourceFile.GetDecl().Add(GetIntPointerPartMethod); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, GetIntPointerPartMethod)); finalTrans.data.LocalLinks[delegateRef1] = delegateFormal; finalTrans.data.LvalueTypes[delegateRef1] = finalTrans.data.ExpTypes[delegateRef1Exp] = finalTrans.data.ExpTypes[getPointerPartInvoke] = new ANamedType(new TIdentifier("string"), null); finalTrans.data.ExpTypes[StringToIntInvoke] = new ANamedType(new TIdentifier("int"), null); finalTrans.data.SimpleMethodLinks[getPointerPartInvoke] = GetStringPointerMethod(); finalTrans.data.SimpleMethodLinks[StringToIntInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == StringToIntInvoke.GetName().Text); return GetIntPointerPartMethod; }
public override void CaseAPArrayLengthLvalue(APArrayLengthLvalue node) { base.CaseAPArrayLengthLvalue(node); ABinopExp binopExp = new ABinopExp(nameExp, new APlusBinop(new TPlus("+")), new AStringConstExp(new TStringLiteral("\"\\\\Length\""))); ABooleanConstExp trueConst = new ABooleanConstExp(new ATrueBool()); ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("DataTableGetInt"), new ArrayList(){trueConst, binopExp}); ALvalueExp parent = (ALvalueExp) node.Parent(); parent.ReplaceBy(invoke); data.ExpTypes[binopExp] = data.ExpTypes[binopExp.GetRight()] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[trueConst] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[invoke] = new ANamedType(new TIdentifier("int"), null); data.SimpleMethodLinks[invoke] = data.Libraries.Methods.First(m => m.GetName().Text == invoke.GetName().Text); nameExp = null; hadPointer = false; }
private AMethodDecl GetMethodMethod() { if (GetMethodPartMethod != null) return GetMethodPartMethod; /* string GetMethodPart(string delegate) { int i = StringFind(delegate, ":", false); if (i == -1) { return delegate; } return StringSub(delegate, 1, i - 1); } */ AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(finalTrans.mainEntry); AALocalDecl delegateFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("delegate"), null); ALocalLvalue delegateRef1 = new ALocalLvalue(new TIdentifier("delegate")); ALocalLvalue delegateRef2 = new ALocalLvalue(new TIdentifier("delegate")); ALocalLvalue delegateRef3 = new ALocalLvalue(new TIdentifier("delegate")); ALvalueExp delegateRef1Exp = new ALvalueExp(delegateRef1); ALvalueExp delegateRef2Exp = new ALvalueExp(delegateRef2); ALvalueExp delegateRef3Exp = new ALvalueExp(delegateRef3); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\":\"")); ABooleanConstExp booleanConst = new ABooleanConstExp(new AFalseBool()); AIntConstExp intConst1 = new AIntConstExp(new TIntegerLiteral("-1")); AIntConstExp intConst2 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst3 = new AIntConstExp(new TIntegerLiteral("1")); ASimpleInvokeExp stringFindInvoke = new ASimpleInvokeExp(new TIdentifier("StringFind"), new ArrayList() {delegateRef1Exp, stringConst, booleanConst}); AALocalDecl iDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("i"), stringFindInvoke); ALocalLvalue iRef1 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef2 = new ALocalLvalue(new TIdentifier("i")); ALvalueExp iRef1Exp = new ALvalueExp(iRef1); ALvalueExp iRef2Exp = new ALvalueExp(iRef2); ABinopExp binop1 = new ABinopExp(iRef1Exp, new AEqBinop(new TEq("==")), intConst1); AIfThenStm ifThen = new AIfThenStm(new TLParen("("), binop1, new ABlockStm(new TLBrace("{"), new AABlock( new ArrayList() { new AValueReturnStm(new TReturn("return"), delegateRef2Exp) }, new TRBrace("}")))); ABinopExp binop2 = new ABinopExp(iRef2Exp, new AMinusBinop(new TMinus("-")), intConst3); ASimpleInvokeExp stringSubInvoke = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() {delegateRef3Exp, intConst2, binop2}); GetMethodPartMethod = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("GetMethodPart", finalTrans.data.LineCounts[sourceFile] + 1, 1), new ArrayList() { delegateFormal }, new AABlock( new ArrayList() { new ALocalDeclStm(new TSemicolon(";"), iDecl), ifThen, new AValueReturnStm(new TReturn("return"), stringSubInvoke) }, new TRBrace("}"))); sourceFile.GetDecl().Add(GetMethodPartMethod); finalTrans.data.LocalLinks[delegateRef1] = finalTrans.data.LocalLinks[delegateRef2] = finalTrans.data.LocalLinks[delegateRef3] = delegateFormal; finalTrans.data.LocalLinks[iRef1] = finalTrans.data.LocalLinks[iRef2] = iDecl; finalTrans.data.LvalueTypes[delegateRef1] = finalTrans.data.LvalueTypes[delegateRef2] = finalTrans.data.LvalueTypes[delegateRef3] = finalTrans.data.ExpTypes[delegateRef1Exp] = finalTrans.data.ExpTypes[delegateRef2Exp] = finalTrans.data.ExpTypes[delegateRef3Exp] = finalTrans.data.ExpTypes[stringConst] = finalTrans.data.ExpTypes[stringSubInvoke] = new ANamedType(new TIdentifier("string"), null); finalTrans.data.LvalueTypes[iRef1] = finalTrans.data.LvalueTypes[iRef2] = finalTrans.data.ExpTypes[iRef1Exp] = finalTrans.data.ExpTypes[iRef2Exp] = finalTrans.data.ExpTypes[stringFindInvoke] = finalTrans.data.ExpTypes[intConst1] = finalTrans.data.ExpTypes[intConst2] = finalTrans.data.ExpTypes[intConst3] = finalTrans.data.ExpTypes[binop2] = new ANamedType(new TIdentifier("int"), null); finalTrans.data.ExpTypes[booleanConst] = finalTrans.data.ExpTypes[binop1] = new ANamedType(new TIdentifier("bool"), null); finalTrans.data.SimpleMethodLinks[stringFindInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringFindInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[stringSubInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringSubInvoke.GetName().Text); return GetMethodPartMethod; }
private static void AddRemoves(PExp exp, PType type, AABlock block, SharedData data) { if (Util.IsBulkCopy(type)) { if (type is ANamedType) { ANamedType aType = (ANamedType)type; AStructDecl structDecl = data.StructTypeLinks[aType]; foreach (AALocalDecl localDecl in structDecl.GetLocals()) { ABinopExp newExp = new ABinopExp(exp, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"." + localDecl.GetName().Text + "\""))); data.ExpTypes[newExp] = data.ExpTypes[newExp.GetRight()] = new ANamedType(new TIdentifier("string"), null); AddRemoves(newExp, localDecl.GetType(), block, data); } } else {//Is array type. Can Only be a constant array type AArrayTempType aType = (AArrayTempType)type; for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++) { ABinopExp newExp = new ABinopExp(exp, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"[" + i + "]\""))); data.ExpTypes[newExp] = data.ExpTypes[newExp.GetRight()] = new ANamedType(new TIdentifier("string"), null); AddRemoves(newExp, aType.GetType(), block, data); } } } else { exp = Util.MakeClone(exp, data); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); ASimpleInvokeExp removeInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableValueRemove"), new ArrayList() { trueConst1, exp }); block.GetStatements().Add(new AExpStm(new TSemicolon(";"), removeInvoke)); data.ExpTypes[trueConst1] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[removeInvoke] = new AVoidType(new TVoid("void")); data.SimpleMethodLinks[removeInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == removeInvoke.GetName().Text); } }
private AMethodDecl GetStringPointerMethod() { if (GetStringPointerPartMethod != null) return GetStringPointerPartMethod; /* * string GetPointerPart(string delegate) * { * return StringSub(delegate, StringFind(delegate, ":", false) + 1, StringLength(delegate)); * } */ AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(finalTrans.mainEntry); AALocalDecl delegateFormal = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("delegate"), null); ALocalLvalue delegateRef1 = new ALocalLvalue(new TIdentifier("delegate")); ALocalLvalue delegateRef2 = new ALocalLvalue(new TIdentifier("delegate")); ALocalLvalue delegateRef3 = new ALocalLvalue(new TIdentifier("delegate")); ALvalueExp delegateRef1Exp = new ALvalueExp(delegateRef1); ALvalueExp delegateRef2Exp = new ALvalueExp(delegateRef2); ALvalueExp delegateRef3Exp = new ALvalueExp(delegateRef3); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\":\"")); ABooleanConstExp booleanConst = new ABooleanConstExp(new AFalseBool()); ASimpleInvokeExp stringFindInvoke = new ASimpleInvokeExp(new TIdentifier("StringFind"), new ArrayList(){delegateRef2Exp, stringConst, booleanConst}); AIntConstExp intConst = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop = new ABinopExp(stringFindInvoke, new APlusBinop(new TPlus("+")), intConst); ASimpleInvokeExp stringLengthInvoke = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() { delegateRef3Exp }); ASimpleInvokeExp stringSubInvoke = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList(){delegateRef1Exp, binop, stringLengthInvoke}); GetStringPointerPartMethod = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("GetPointerPart", finalTrans.data.LineCounts[sourceFile] + 1, 1), new ArrayList() {delegateFormal}, new AABlock( new ArrayList() {new AValueReturnStm(new TReturn("return"), stringSubInvoke)}, new TRBrace("}"))); sourceFile.GetDecl().Add(GetStringPointerPartMethod); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(sourceFile, GetStringPointerPartMethod)); finalTrans.data.LocalLinks[delegateRef1] = finalTrans.data.LocalLinks[delegateRef2] = finalTrans.data.LocalLinks[delegateRef3] = delegateFormal; finalTrans.data.LvalueTypes[delegateRef1] = finalTrans.data.LvalueTypes[delegateRef2] = finalTrans.data.LvalueTypes[delegateRef3] = finalTrans.data.ExpTypes[delegateRef1Exp] = finalTrans.data.ExpTypes[delegateRef2Exp] = finalTrans.data.ExpTypes[delegateRef3Exp] = finalTrans.data.ExpTypes[stringConst] = finalTrans.data.ExpTypes[stringSubInvoke] = new ANamedType(new TIdentifier("string"), null); finalTrans.data.ExpTypes[booleanConst] = new ANamedType(new TIdentifier("bool"), null); finalTrans.data.ExpTypes[intConst] = finalTrans.data.ExpTypes[binop] = finalTrans.data.ExpTypes[stringFindInvoke] = finalTrans.data.ExpTypes[stringLengthInvoke] = new ANamedType(new TIdentifier("int"), null); finalTrans.data.SimpleMethodLinks[stringFindInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringFindInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[stringLengthInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringLengthInvoke.GetName().Text); finalTrans.data.SimpleMethodLinks[stringSubInvoke] = finalTrans.data.Libraries.Methods.First(m => m.GetName().Text == stringSubInvoke.GetName().Text); return GetStringPointerPartMethod; }
private static AMethodDecl CreateGeneralNullCheckMethod(Node node, SharedData data) { if (generalCompareNullMethod != null) return generalCompareNullMethod; /* * bool IsNull(string pointer) * { * if (pointer == null) * { * return true; * } * return !DataTableGetBool(true, pointer + "\\Exists"); * } */ AALocalDecl pointerDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("pointer"), null); ALocalLvalue pointerRef1 = new ALocalLvalue(new TIdentifier("pointer")); ALocalLvalue pointerRef2 = new ALocalLvalue(new TIdentifier("pointer")); ALvalueExp pointerRef1Exp = new ALvalueExp(pointerRef1); ALvalueExp pointerRef2Exp = new ALvalueExp(pointerRef2); ANullExp nullExp = new ANullExp(); ABooleanConstExp boolConst1 = new ABooleanConstExp(new ATrueBool()); ABooleanConstExp boolConst2 = new ABooleanConstExp(new ATrueBool()); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\"\\\\Exists\"")); ABinopExp binop1 = new ABinopExp(pointerRef1Exp, new AEqBinop(new TEq("==")), nullExp); ABinopExp binop2 = new ABinopExp(pointerRef2Exp, new APlusBinop(new TPlus("+")), stringConst); ASimpleInvokeExp dataTableGetBoolCall = new ASimpleInvokeExp(new TIdentifier("DataTableGetBool"), new ArrayList(){boolConst2, binop2}); AUnopExp unopExp = new AUnopExp(new AComplementUnop(new TComplement("!")), dataTableGetBoolCall); generalCompareNullMethod = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("bool"), null), new TIdentifier("IsNull"), new ArrayList() {pointerDecl}, new AABlock( new ArrayList() { new AIfThenStm(new TLParen("("), binop1, new ABlockStm(new TLBrace("{"), new AABlock( new ArrayList() { new AValueReturnStm (new TReturn ("return"), boolConst1) }, new TRBrace("}")))), new AValueReturnStm(new TReturn("return"), unopExp) }, new TRBrace("}"))); AASourceFile sourceFile = Util.GetAncestor<AASourceFile>(node); sourceFile.GetDecl().Add(generalCompareNullMethod); data.LocalLinks[pointerRef1] = data.LocalLinks[pointerRef2] = pointerDecl; data.LvalueTypes[pointerRef1] = data.LvalueTypes[pointerRef2] = data.ExpTypes[pointerRef1Exp] = data.ExpTypes[pointerRef2Exp] = data.ExpTypes[stringConst] = data.ExpTypes[binop2] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[binop1] = data.ExpTypes[boolConst1] = data.ExpTypes[boolConst2] = data.ExpTypes[dataTableGetBoolCall] = data.ExpTypes[unopExp] = new ANamedType(new TIdentifier("string"), null); foreach (AMethodDecl methodDecl in data.Libraries.Methods) { if (methodDecl.GetName().Text == dataTableGetBoolCall.GetName().Text) { data.SimpleMethodLinks[dataTableGetBoolCall] = methodDecl; break; } } return generalCompareNullMethod; }
public override void OutACastExp(ACastExp node) { string toType = ((AAName)((ANamedType) node.GetType()).GetName()).AsString(); string fromType; PType fromPType = data.ExpTypes[node.GetExp()]; AStructDecl toEnum = null; AStructDecl fromEnum = null; if (data.StructTypeLinks.ContainsKey((ANamedType)node.GetType())) { AStructDecl str = data.StructTypeLinks[(ANamedType)node.GetType()]; if (data.Enums.ContainsKey(str)) toEnum = str; } if (fromPType is ANamedType) { fromType = ((AAName)((ANamedType)fromPType).GetName()).AsString(); //Namespace ignored if (data.StructTypeLinks.ContainsKey((ANamedType) fromPType)) { AStructDecl str = data.StructTypeLinks[(ANamedType) fromPType]; if (data.Enums.ContainsKey(str)) fromEnum = str; } } else { errors.Add(new ErrorCollection.Error(node.GetToken(), currentSourceFile, LocRM.GetString("ErrorText121"))); throw new ParserException(node.GetToken(), "Invalid cast"); } if (toEnum != null && (fromType == "int" || fromType == "byte")) { ANamedType type = new ANamedType(new TIdentifier(toEnum.GetName().Text), null); data.StructTypeLinks[type] = toEnum; data.ExpTypes[node.GetExp()] = type; node.ReplaceBy(node.GetExp()); return; } if (fromEnum != null && (toType == "int" || toType == "byte")) { int enumDefinitions = 0; foreach (PLocalDecl local in fromEnum.GetLocals()) { if (local is AALocalDecl) enumDefinitions++; } string typeName = enumDefinitions > 255 ? "int" : "byte"; ANamedType type = new ANamedType(new TIdentifier(typeName), null); data.ExpTypes[node.GetExp()] = new ANamedType(new TIdentifier(typeName), null); node.ReplaceBy(node.GetExp()); return; } if (fromEnum != null && toType == "string") { AMethodDecl targetMethod = data.StructMethods[fromEnum][0]; ASimpleInvokeExp invokeExp = new ASimpleInvokeExp(new TIdentifier("toString"), new ArrayList(){node.GetExp()}); data.SimpleMethodLinks[invokeExp] = targetMethod; data.ExpTypes[invokeExp] = targetMethod.GetReturnType(); node.ReplaceBy(invokeExp); return; } ASimpleInvokeExp replacementMethod = null; switch (toType) { case "string": switch (fromType) { case "wave": replacementMethod = new ASimpleInvokeExp(new TIdentifier("AIWaveToString"), new ArrayList{node.GetExp()}); break; case "fixed"://Implicit AFieldLvalue precisionArg = new AFieldLvalue(new TIdentifier("c_fixedPrecisionAny")); ALvalueExp exp = new ALvalueExp(precisionArg); data.FieldLinks[precisionArg] = data.Libraries.Fields.First(field => field.GetName().Text == precisionArg.GetName().Text); replacementMethod = new ASimpleInvokeExp(new TIdentifier("FixedToString"), new ArrayList { node.GetExp(), exp}); break; case "int"://Implicit case "byte"://Implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList { node.GetExp()}); break; case "bool"://Implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("libNtve_gf_ConvertBooleanToString"), new ArrayList { node.GetExp() }); break; case "color"://Implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("libNtve_gf_ConvertColorToString"), new ArrayList { node.GetExp() }); break; } break; case "text": switch (fromType) { case "wave": replacementMethod = new ASimpleInvokeExp(new TIdentifier("AIWaveToText"), new ArrayList { node.GetExp() }); break; case "fixed"://Implicit AFieldLvalue precisionArg = new AFieldLvalue(new TIdentifier("c_fixedPrecisionAny")); ALvalueExp exp = new ALvalueExp(precisionArg); data.FieldLinks[precisionArg] = data.Libraries.Fields.First(field => field.GetName().Text == precisionArg.GetName().Text); replacementMethod = new ASimpleInvokeExp(new TIdentifier("FixedToText"), new ArrayList { node.GetExp(), exp }); break; case "int"://Implicit case "byte": replacementMethod = new ASimpleInvokeExp(new TIdentifier("IntToText"), new ArrayList { node.GetExp() }); break; case "bool"://Implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("libNtve_gf_ConvertBooleanToText"), new ArrayList { node.GetExp() }); break; case "string"://Implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("StringToText"), new ArrayList { node.GetExp() }); break; } break; case "int": switch (fromType) { case "bool": replacementMethod = new ASimpleInvokeExp(new TIdentifier("BoolToInt"), new ArrayList {node.GetExp()}); break; case "fixed": replacementMethod = new ASimpleInvokeExp(new TIdentifier("FixedToInt"), new ArrayList { node.GetExp() }); break; case "string": replacementMethod = new ASimpleInvokeExp(new TIdentifier("StringToInt"), new ArrayList { node.GetExp() }); break; } break; case "fixed": switch (fromType) { case "int"://Already implicit replacementMethod = new ASimpleInvokeExp(new TIdentifier("IntToFixed"), new ArrayList { node.GetExp() }); break; case "string": replacementMethod = new ASimpleInvokeExp(new TIdentifier("StringToFixed"), new ArrayList { node.GetExp() }); break; } break; case "bool": switch (fromType) { case "int": case "byte": case "fixed": //Replace by //exp != 0 AIntConstExp zero = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binop = new ABinopExp(node.GetExp(), new ANeBinop(new TNeq("!=")), zero); node.ReplaceBy(binop); binop.Apply(this); return; } break; } if (replacementMethod == null) { errors.Add(new ErrorCollection.Error(node.GetToken(), currentSourceFile, LocRM.GetString("ErrorText122") + fromType + LocRM.GetString("ErrorText123") + toType)); throw new ParserException(node.GetToken(), LocRM.GetString("ErrorText121")); } data.SimpleMethodLinks[replacementMethod] = data.Libraries.Methods.First(method => method.GetName().Text == replacementMethod.GetName().Text); data.ExpTypes[replacementMethod] = data.SimpleMethodLinks[replacementMethod].GetReturnType(); node.ReplaceBy(replacementMethod); for (int i = 1; i < replacementMethod.GetArgs().Count; i++) { ((Node)replacementMethod.GetArgs()[i]).Apply(this); } }
private static AMethodDecl CreateNewObjectMethodP(Node node, TIntegerLiteral intLiteral, string prefix, GlobalStructVars vars, SharedData data) { if (intLiteral == null) return CreateNewObjectMethod(node, data); //if (createStructMethod.ContainsKey(structDecl)) // return createStructMethod[structDecl]; /* int CreateStr() { int i = Str_index; while (Str_used[i / 31] & 1 << (i % 31)) { i = i + 1; if (i >= 42) { i = 0; } if (i == Str_index) { UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Error: Unable to allocate more than 42 dynamic Str types")); IntToString(1/0); } } Str_used[i / 31] = Str_used[i / 31] + Power2(i % 31); Str_index = i; <<if it is being compared with null at any point in time>> <<usedBits := floor(log2(42))+1>> <<bitsLeft := 31 - usedBits>> <<biggestIdentifier := 2^(bitsLeft + 1) - 1>> identifierArray[i] = identifierNext; i = (i << bitsLeft) + identifierNext; identifierNext = identifierNext%biggestIdentifier + 1; return i; } */ AASourceFile file = Util.GetAncestor<AASourceFile>(node); AIntConstExp intConst1 = new AIntConstExp(new TIntegerLiteral("31")); AIntConstExp intConst2 = new AIntConstExp(new TIntegerLiteral("31")); AIntConstExp intConst3 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst4 = new AIntConstExp(new TIntegerLiteral(intLiteral.Text)); AIntConstExp intConst5 = new AIntConstExp(new TIntegerLiteral("0")); AIntConstExp intConst6 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst7 = new AIntConstExp(new TIntegerLiteral("0")); AIntConstExp intConst8 = new AIntConstExp(new TIntegerLiteral("31")); AIntConstExp intConst9 = new AIntConstExp(new TIntegerLiteral("31")); AIntConstExp intConst10 = new AIntConstExp(new TIntegerLiteral("31")); AIntConstExp intConst11 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst12 = new AIntConstExp(new TIntegerLiteral("1")); AFieldLvalue strIndexRef1 = new AFieldLvalue(new TIdentifier(vars.Index.GetName().Text)); AFieldLvalue strIndexRef2 = new AFieldLvalue(new TIdentifier(vars.Index.GetName().Text)); AFieldLvalue strIndexRef3 = new AFieldLvalue(new TIdentifier(vars.Index.GetName().Text)); ALvalueExp strIndexRef1Exp = new ALvalueExp(strIndexRef1); ALvalueExp strIndexRef2Exp = new ALvalueExp(strIndexRef2); AFieldLvalue strUsedRef1 = new AFieldLvalue(new TIdentifier(vars.Used.GetName().Text)); AFieldLvalue strUsedRef2 = new AFieldLvalue(new TIdentifier(vars.Used.GetName().Text)); AFieldLvalue strUsedRef3 = new AFieldLvalue(new TIdentifier(vars.Used.GetName().Text)); ALvalueExp strUsedRef1Exp = new ALvalueExp(strUsedRef1); ALvalueExp strUsedRef2Exp = new ALvalueExp(strUsedRef2); ALvalueExp strUsedRef3Exp = new ALvalueExp(strUsedRef3); AALocalDecl iDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("i"), strIndexRef1Exp); ALocalLvalue iRef1 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef2 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef3 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef4 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef5 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef6 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef7 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef8 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef9 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef10 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef11 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue iRef12 = new ALocalLvalue(new TIdentifier("i")); ALvalueExp iRef1Exp = new ALvalueExp(iRef1); ALvalueExp iRef2Exp = new ALvalueExp(iRef2); ALvalueExp iRef4Exp = new ALvalueExp(iRef4); ALvalueExp iRef5Exp = new ALvalueExp(iRef5); ALvalueExp iRef7Exp = new ALvalueExp(iRef7); ALvalueExp iRef8Exp = new ALvalueExp(iRef8); ALvalueExp iRef9Exp = new ALvalueExp(iRef9); ALvalueExp iRef10Exp = new ALvalueExp(iRef10); ALvalueExp iRef11Exp = new ALvalueExp(iRef11); ALvalueExp iRef12Exp = new ALvalueExp(iRef12); ABinopExp binop1 = new ABinopExp(iRef1Exp, new ADivideBinop(new TDiv("/")), intConst1); ABinopExp binop2 = new ABinopExp(iRef2Exp, new AModuloBinop(new TMod("%")), intConst2); ABinopExp binop3 = new ABinopExp(null, new AAndBinop(new TAnd("&")), null); ABinopExp binop4 = new ABinopExp(iRef4Exp, new APlusBinop(new TPlus("+")), intConst3); ABinopExp binop5 = new ABinopExp(iRef5Exp, new AGeBinop(new TGteq(">=")), intConst4); ABinopExp binop6 = new ABinopExp(iRef7Exp, new AEqBinop(new TEq("==")), strIndexRef2Exp); ABinopExp binop7 = new ABinopExp(intConst6, new ADivideBinop(new TDiv("/")), intConst7); ABinopExp binop8 = new ABinopExp(iRef8Exp, new ADivideBinop(new TDiv("/")), intConst8); ABinopExp binop9 = new ABinopExp(iRef9Exp, new ADivideBinop(new TDiv("/")), intConst9); ABinopExp binop10 = new ABinopExp(iRef10Exp, new AModuloBinop(new TMod("%")), intConst10); ABinopExp binop11 = new ABinopExp(null, new APlusBinop(new TPlus("+")), null); ABinopExp binop12 = new ABinopExp(intConst11, new ALBitShiftBinop(new TLBitShift("<<")), binop2); ABinopExp binop13 = new ABinopExp(intConst12, new ALBitShiftBinop(new TLBitShift("<<")), binop10); binop3.SetRight(binop12); binop11.SetRight(binop13); //ASimpleInvokeExp power2Invoke1 = new ASimpleInvokeExp(new TIdentifier("Power2"), new ArrayList() { binop2 }); //ASimpleInvokeExp power2Invoke2 = new ASimpleInvokeExp(new TIdentifier("Power2"), new ArrayList() { binop10 }); //binop3.SetRight(power2Invoke1); //binop11.SetRight(power2Invoke2); AArrayLvalue arrayIndex1 = new AArrayLvalue(new TLBracket("["), strUsedRef1Exp, binop1); AArrayLvalue arrayIndex2 = new AArrayLvalue(new TLBracket("["), strUsedRef2Exp, binop8); AArrayLvalue arrayIndex3 = new AArrayLvalue(new TLBracket("["), strUsedRef3Exp, binop9); ALvalueExp arrayIndex1Exp = new ALvalueExp(arrayIndex1); ALvalueExp arrayIndex3Exp = new ALvalueExp(arrayIndex3); binop3.SetLeft(arrayIndex1Exp); binop11.SetLeft(arrayIndex3Exp); AAssignmentExp assignement1 = new AAssignmentExp(new TAssign("="), iRef3, binop4); AAssignmentExp assignement2 = new AAssignmentExp(new TAssign("="), iRef6, intConst5); AAssignmentExp assignement3 = new AAssignmentExp(new TAssign("="), arrayIndex2, binop11); AAssignmentExp assignement4 = new AAssignmentExp(new TAssign("="), strIndexRef3, iRef11Exp); ASimpleInvokeExp playerGroupAllInvoke = new ASimpleInvokeExp(new TIdentifier("PlayerGroupAll"), new ArrayList()); AFieldLvalue messageAreaDebugRef = new AFieldLvalue(new TIdentifier("c_messageAreaDebug")); ALvalueExp messageAreaDebugRefExp = new ALvalueExp(messageAreaDebugRef); AStringConstExp stringConst = new AStringConstExp( new TStringLiteral("\"Galaxy++ Error: Unable to allocate more than " + intLiteral.Text + " dynamic " + prefix + " types.\"")); ASimpleInvokeExp stringToTextInvoke = new ASimpleInvokeExp(new TIdentifier("StringToText"), new ArrayList() { stringConst }); ASimpleInvokeExp displayMessageInvoke = new ASimpleInvokeExp(new TIdentifier("UIDisplayMessage"), new ArrayList() { playerGroupAllInvoke, messageAreaDebugRefExp, stringToTextInvoke }); ASimpleInvokeExp intToStringInvoke = new ASimpleInvokeExp(new TIdentifier("IntToString"), new ArrayList() { binop7 }); AABlock methodBlock = new AABlock( new ArrayList() { new ALocalDeclStm(new TSemicolon(";"), iDecl), new AWhileStm(new TLParen("("), binop3, new ABlockStm(new TLBrace("{"), new AABlock( new ArrayList() { new AExpStm (new TSemicolon (";"), assignement1), new AIfThenStm (new TLParen ("("), binop5, new ABlockStm (new TLBrace ("{"), new AABlock (new ArrayList () { new AExpStm (new TSemicolon (";"), assignement2) }, new TRBrace ("}")))), new AIfThenStm (new TLParen ("("), binop6, new ABlockStm (new TLBrace ("{"), new AABlock (new ArrayList () { new AExpStm (new TSemicolon (";"), displayMessageInvoke), new AExpStm (new TSemicolon (";"), intToStringInvoke) }, new TRBrace ("}")))) }, new TRBrace( "}")))), new AExpStm(new TSemicolon(";"), assignement3), new AExpStm(new TSemicolon(";"), assignement4) }, new TRBrace("}")); if (vars.IdentifierArray != null) { /* <<if it is being compared with null at any point in time>> <<usedBits := floor(log2(42))+1>> <<bitsLeft := 31 - usedBits>> <<biggestIdentifier := 2^(bitsLeft + 1) - 1>> identifierArray[i] = identifierNext; i = (i << bitsLeft) + identifierNext; identifierNext = identifierNext%biggestIdentifier + 1; */ int usedLimit = int.Parse(intLiteral.Text); int usedBits = usedLimit == 0 ? 0 : ((int)Math.Floor(Math.Log(usedLimit, 2)) + 1); int bitsLeft = 31 - usedBits; int biggestIdentifier = (1 << (bitsLeft + 1)) - 1; AIntConstExp bitsLeftConst = new AIntConstExp(new TIntegerLiteral(bitsLeft.ToString())); AIntConstExp biggestIdentifierConst = new AIntConstExp(new TIntegerLiteral(biggestIdentifier.ToString())); AIntConstExp oneIntConst = new AIntConstExp(new TIntegerLiteral("1")); ALocalLvalue secondIRef1 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue secondIRef2 = new ALocalLvalue(new TIdentifier("i")); ALocalLvalue secondIRef3 = new ALocalLvalue(new TIdentifier("i")); ALvalueExp secondIRef2Exp = new ALvalueExp(secondIRef2); ALvalueExp secondIRef3Exp = new ALvalueExp(secondIRef3); AFieldLvalue identierNExtRef1 = new AFieldLvalue(new TIdentifier("identiferNext")); AFieldLvalue identierNExtRef2 = new AFieldLvalue(new TIdentifier("identiferNext")); AFieldLvalue identierNExtRef3 = new AFieldLvalue(new TIdentifier("identiferNext")); AFieldLvalue identierNExtRef4 = new AFieldLvalue(new TIdentifier("identiferNext")); ALvalueExp identierNExtRef1Exp = new ALvalueExp(identierNExtRef1); ALvalueExp identierNExtRef3Exp = new ALvalueExp(identierNExtRef3); ALvalueExp identierNExtRef4Exp = new ALvalueExp(identierNExtRef4); AFieldLvalue identifierArrayRef = new AFieldLvalue(new TIdentifier("identifierArray")); ALvalueExp identifierArrayRefExp = new ALvalueExp(identifierArrayRef); AArrayLvalue arrayLvalue = new AArrayLvalue(new TLBracket("["), identifierArrayRefExp, secondIRef3Exp); AAssignmentExp secondAssignment3 = new AAssignmentExp(new TAssign("="), arrayLvalue, identierNExtRef4Exp); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), secondAssignment3)); ABinopExp secondBinop1 = new ABinopExp(secondIRef2Exp, new ALBitShiftBinop(new TLBitShift("<<")), bitsLeftConst); ABinopExp secondBinop2 = new ABinopExp(secondBinop1, new APlusBinop(new TPlus("+")), identierNExtRef1Exp); AAssignmentExp secondAssignment1 = new AAssignmentExp(new TAssign("="), secondIRef1, secondBinop2); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), secondAssignment1)); ABinopExp secondBinop3 = new ABinopExp(identierNExtRef3Exp, new AModuloBinop(new TMod("%")), biggestIdentifierConst); ABinopExp secondBinop4 = new ABinopExp(secondBinop3, new APlusBinop(new TPlus("+")), oneIntConst); AAssignmentExp secondAssignment2 = new AAssignmentExp(new TAssign("="), identierNExtRef2, secondBinop4); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), secondAssignment2)); data.LvalueTypes[secondIRef1] = data.LvalueTypes[secondIRef2] = data.ExpTypes[bitsLeftConst] = data.ExpTypes[biggestIdentifierConst] = data.ExpTypes[oneIntConst] = data.ExpTypes[secondIRef2Exp] = data.LvalueTypes[identierNExtRef1] = data.LvalueTypes[identierNExtRef2] = data.LvalueTypes[identierNExtRef3] = data.ExpTypes[identierNExtRef1Exp] = data.ExpTypes[identierNExtRef3Exp] = data.ExpTypes[secondBinop1] = data.ExpTypes[secondBinop2] = data.ExpTypes[secondAssignment1] = data.ExpTypes[secondBinop3] = data.ExpTypes[secondBinop4] = data.ExpTypes[secondAssignment2] = data.LvalueTypes[secondIRef3] = data.LvalueTypes[identierNExtRef4] = data.ExpTypes[secondIRef3Exp] = data.ExpTypes[identierNExtRef4Exp] = data.LvalueTypes[arrayLvalue] = data.ExpTypes[secondAssignment3] = new ANamedType(new TIdentifier("int"), null); data.LvalueTypes[identifierArrayRef] = data.ExpTypes[identifierArrayRefExp] = vars.IdentifierArray.GetType(); data.LocalLinks[secondIRef1] = data.LocalLinks[secondIRef2] = data.LocalLinks[secondIRef3] = iDecl; data.FieldLinks[identierNExtRef1] = data.FieldLinks[identierNExtRef2] = data.FieldLinks[identierNExtRef3] = data.FieldLinks[identierNExtRef4] = vars.IdentifierNext; data.FieldLinks[identifierArrayRef] = vars.IdentifierArray; } methodBlock.GetStatements().Add(new AValueReturnStm(new TReturn("return"), iRef12Exp)); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("Create" + prefix, data.LineCounts[file] + 18, 0), new ArrayList(), methodBlock); file.GetDecl().Add(method); data.Methods.Add(new SharedData.DeclItem<AMethodDecl>(file, method)); data.LocalLinks[iRef1] = data.LocalLinks[iRef2] = data.LocalLinks[iRef3] = data.LocalLinks[iRef4] = data.LocalLinks[iRef5] = data.LocalLinks[iRef6] = data.LocalLinks[iRef7] = data.LocalLinks[iRef8] = data.LocalLinks[iRef9] = data.LocalLinks[iRef10] = data.LocalLinks[iRef11] = data.LocalLinks[iRef12] = iDecl; data.FieldLinks[strUsedRef1] = data.FieldLinks[strUsedRef2] = data.FieldLinks[strUsedRef3] = vars.Used; data.FieldLinks[strIndexRef1] = data.FieldLinks[strIndexRef2] = data.FieldLinks[strIndexRef3] = vars.Index; //data.SimpleMethodLinks[power2Invoke1] = // data.SimpleMethodLinks[power2Invoke2] = CreatePower2Method(node, data); data.FieldLinks[messageAreaDebugRef] = data.Libraries.Fields.First(f => f.GetName().Text == messageAreaDebugRef.GetName().Text); data.SimpleMethodLinks[displayMessageInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == displayMessageInvoke.GetName().Text); data.SimpleMethodLinks[playerGroupAllInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == playerGroupAllInvoke.GetName().Text); data.SimpleMethodLinks[stringToTextInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == stringToTextInvoke.GetName().Text); data.SimpleMethodLinks[intToStringInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == intToStringInvoke.GetName().Text); data.ExpTypes[intConst1] = data.ExpTypes[intConst2] = data.ExpTypes[intConst3] = data.ExpTypes[intConst4] = data.ExpTypes[intConst5] = data.ExpTypes[intConst6] = data.ExpTypes[intConst7] = data.ExpTypes[intConst8] = data.ExpTypes[intConst9] = data.ExpTypes[intConst10] = data.ExpTypes[intConst11] = data.ExpTypes[intConst12] = data.LvalueTypes[strIndexRef1] = data.LvalueTypes[strIndexRef2] = data.LvalueTypes[strIndexRef3] = data.ExpTypes[strIndexRef1Exp] = data.ExpTypes[strIndexRef2Exp] = data.LvalueTypes[iRef1] = data.LvalueTypes[iRef2] = data.LvalueTypes[iRef3] = data.LvalueTypes[iRef4] = data.LvalueTypes[iRef5] = data.LvalueTypes[iRef6] = data.LvalueTypes[iRef7] = data.LvalueTypes[iRef8] = data.LvalueTypes[iRef9] = data.LvalueTypes[iRef10] = data.LvalueTypes[iRef11] = data.LvalueTypes[iRef12] = data.ExpTypes[iRef1Exp] = data.ExpTypes[iRef2Exp] = data.ExpTypes[iRef4Exp] = data.ExpTypes[iRef5Exp] = data.ExpTypes[iRef7Exp] = data.ExpTypes[iRef8Exp] = data.ExpTypes[iRef9Exp] = data.ExpTypes[iRef10Exp] = data.ExpTypes[iRef11Exp] = data.ExpTypes[iRef12Exp] = data.LvalueTypes[arrayIndex1] = data.LvalueTypes[arrayIndex2] = data.LvalueTypes[arrayIndex3] = data.ExpTypes[arrayIndex1Exp] = data.ExpTypes[arrayIndex3Exp] = data.ExpTypes[binop1] = data.ExpTypes[binop2] = data.ExpTypes[binop3] = data.ExpTypes[binop4] = data.ExpTypes[binop7] = data.ExpTypes[binop8] = data.ExpTypes[binop9] = data.ExpTypes[binop10] = data.ExpTypes[binop11] = data.ExpTypes[binop12] = data.ExpTypes[binop13] = //data.ExpTypes[power2Invoke1] = //data.ExpTypes[power2Invoke2] = data.ExpTypes[intToStringInvoke] = data.ExpTypes[assignement1] = data.ExpTypes[assignement2] = data.ExpTypes[assignement3] = data.ExpTypes[assignement4] = data.LvalueTypes[messageAreaDebugRef] = data.ExpTypes[messageAreaDebugRefExp] = new ANamedType(new TIdentifier("int"), null); data.LvalueTypes[strUsedRef1] = data.LvalueTypes[strUsedRef2] = data.LvalueTypes[strUsedRef3] = data.ExpTypes[strUsedRef1Exp] = data.ExpTypes[strUsedRef2Exp] = data.ExpTypes[strUsedRef3Exp] = vars.Used.GetType(); data.ExpTypes[binop5] = data.ExpTypes[binop6] = new ANamedType(new TIdentifier("int"), null); data.ExpTypes[stringConst] = data.ExpTypes[intToStringInvoke] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[stringToTextInvoke] = new ANamedType(new TIdentifier("text"), null); data.ExpTypes[playerGroupAllInvoke] = new ANamedType(new TIdentifier("playergroup"), null); data.ExpTypes[displayMessageInvoke] = new AVoidType(new TVoid("void")); return method; }
private void CheckInvoke(ASimpleInvokeExp node, AMethodDecl target) { if (target.GetInline() != null) { AMethodDecl pMethod = Util.GetAncestor<AMethodDecl>(node); AConstructorDecl pConstructor = Util.GetAncestor<AConstructorDecl>(node); ADeconstructorDecl pDeconstructor = Util.GetAncestor<ADeconstructorDecl>(node); if (pMethod == null && !Util.HasAncestor<AConstructorDecl>(node) && !Util.HasAncestor<ADeconstructorDecl>(node) && !Util.HasAncestor<APropertyDecl>(node)) { errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText131"))); } else if (pMethod != null && !InlineMethodCalls[pMethod].Contains(target)) InlineMethodCalls[pMethod].Add(target); } //For each formal marked as ref or out, the argument must be a non-const variable for (int i = 0; i < node.GetArgs().Count; i++) { AALocalDecl formal = (AALocalDecl)target.GetFormals()[i]; if (formal.GetRef() != null || formal.GetOut() != null) { PExp exp = (PExp)node.GetArgs()[i]; while (true) { PLvalue lvalue; if (exp is ALvalueExp) { lvalue = ((ALvalueExp)exp).GetLvalue(); } else if (exp is AAssignmentExp) { lvalue = ((AAssignmentExp)exp).GetLvalue(); } else { errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText129") + (i + 1) + LocRM.GetString("ErrorText130"))); break; } if (lvalue is ALocalLvalue) { if (data.LocalLinks[(ALocalLvalue)lvalue].GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText129") + (i + 1) + LocRM.GetString("ErrorText132"))); break; } if (lvalue is AFieldLvalue) { if (data.FieldLinks[(AFieldLvalue)lvalue].GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText129") + (i + 1) + LocRM.GetString("ErrorText132"))); break; } if (lvalue is AStructFieldLvalue) { if (data.StructMethodFieldLinks[(AStructFieldLvalue)lvalue].GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText129") + (i + 1) + LocRM.GetString("ErrorText132"))); break; } if (lvalue is AThisLvalue) break; if (lvalue is AStructLvalue) { exp = ((AStructLvalue)lvalue).GetReceiver(); continue; } if (lvalue is AArrayLvalue) { exp = ((AArrayLvalue)lvalue).GetBase(); continue; } if (lvalue is APointerLvalue) { exp = ((APointerLvalue)lvalue).GetBase(); continue; } throw new Exception("Unexpected lvalue"); } } } }
private PExp CreateDynaicSetStm(string type, PExp target, PExp arg) { string upperType = char.ToUpper(type[0]) + type.Substring(1); //Create a data table get string exp ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("DataTableSet" + upperType), new ArrayList()); invoke.GetArgs().Add(new ABooleanConstExp(new ATrueBool())); invoke.GetArgs().Add(target); invoke.GetArgs().Add(arg); data.ExpTypes[invoke] = new AVoidType(new TVoid("void")); data.ExpTypes[(PExp)invoke.GetArgs()[0]] = new ANamedType(new TIdentifier("bool"), null); data.SimpleMethodLinks[invoke] = data.Libraries.Methods.First(method => method.GetName().Text == invoke.GetName().Text); return invoke; }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { InASimpleInvokeExp(node); { Object[] temp = new Object[node.GetArgs().Count]; node.GetArgs().CopyTo(temp, 0); for (int i = temp.Length - 1; i >= 0; i--) { ((PExp)temp[i]).Apply(this); } } if (node.GetName() != null) { node.GetName().Apply(this); } OutASimpleInvokeExp(node); }
private void MakeAssignmentRightDynamic(PLvalue leftSide, PExp rightSide, PType type, AABlock block, ref int index) { if (Util.IsBulkCopy(type)) { if (type is ANamedType) { ANamedType aType = (ANamedType)type; AStructDecl structDecl = data.StructTypeLinks[aType]; foreach (AALocalDecl localDecl in structDecl.GetLocals()) { AStructLvalue newleftSide = new AStructLvalue(new ALvalueExp(leftSide), new ADotDotType(new TDot(".")), new TIdentifier(localDecl.GetName().Text)); ABinopExp newrightSide = new ABinopExp(rightSide, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"." + localDecl.GetName().Text + "\""))); data.ExpTypes[newrightSide] = data.ExpTypes[newrightSide.GetRight()] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[newleftSide.GetReceiver()] = type; data.LvalueTypes[newleftSide] = localDecl.GetType(); data.StructFieldLinks[newleftSide] = localDecl; MakeAssignmentRightDynamic(newleftSide, newrightSide, localDecl.GetType(), block, ref index); } } else {//Is array type. Can Only be a constant array type AArrayTempType aType = (AArrayTempType)type; for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++) { AArrayLvalue newleftSide = new AArrayLvalue(new TLBracket("["), new ALvalueExp(leftSide), new AIntConstExp(new TIntegerLiteral(i.ToString()))); ABinopExp newrightSide = new ABinopExp(rightSide, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"[" + i + "]\""))); data.ExpTypes[newrightSide] = data.ExpTypes[newrightSide.GetRight()] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[newleftSide.GetBase()] = type; data.ExpTypes[newleftSide.GetIndex()] = new ANamedType(new TIdentifier("int"), null); data.LvalueTypes[newleftSide] = aType.GetType(); MakeAssignmentRightDynamic(newleftSide, newrightSide, aType.GetType(), block, ref index); } } } else { ANamedType aType;// = type is APointerType ? new ANamedType(new TIdentifier("string"), null) : (ANamedType)type; if (type is APointerType) { if (Util.IsIntPointer(type, ((APointerType)type).GetType(), data)) aType = new ANamedType(new TIdentifier("int"), null); else aType = new ANamedType(new TIdentifier("string"), null); } else { aType = (ANamedType) type; } string capitalType = Util.Capitalize(aType.AsIdentifierString());//Char.ToUpper(aType.GetName().Text[0]) + aType.GetName().Text.Substring(1); leftSide = Util.MakeClone(leftSide, data); rightSide = Util.MakeClone(rightSide, data); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); //ABooleanConstExp trueConst2 = new ABooleanConstExp(new ATrueBool()); ASimpleInvokeExp innerInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableGet" + capitalType), new ArrayList() { trueConst1, rightSide }); //ASimpleInvokeExp outerInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSet" + capitalType), new ArrayList() { trueConst2, leftSide, innerInvoke }); AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), leftSide, innerInvoke); block.GetStatements().Insert(index, new AExpStm(new TSemicolon(";"), assignment)); index++; data.ExpTypes[trueConst1] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[innerInvoke] = aType; data.ExpTypes[assignment] = aType; data.SimpleMethodLinks[innerInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == innerInvoke.GetName().Text); } }
//Rename method invocations public override void OutASimpleInvokeExp(ASimpleInvokeExp node) { AMethodDecl method = finalTrans.data.SimpleMethodLinks[node]; if (method == null) method = null; node.GetName().Text = finalTrans.data.SimpleMethodLinks[node].GetName().Text; }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { Value += node.GetName().Text + "("; bool first = true; foreach (PExp arg in node.GetArgs()) { if (!first) Value += ", "; else first = false; arg.Apply(this); } Value += ")"; }