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 CaseASimpleInvokeExp(ASimpleInvokeExp node) { AMethodDecl target = data.SimpleMethodLinks[node]; for (int i = 0; i < node.GetArgs().Count; i++) { PExp arg = (PExp)node.GetArgs()[i]; currentLocal = null; arg.Apply(this); if (currentLocal != null && target.GetFormals().Cast<AALocalDecl>().ToList()[i].GetRef() != null) { ALocalLvalue local = currentLocal; target.Apply(this); if (target.GetFormals().Cast<AALocalDecl>().ToList()[i].GetRef() != null) { AALocalDecl decl = data.LocalLinks[local]; NeededRefs[Util.GetAncestor<AMethodDecl>(node)].Add(decl); } } } }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { PExp expNode = (PExp)node; PType type = data.ExpTypes[expNode]; if (type is APointerType) type = new ANamedType(new TIdentifier("string"), null); ALocalLvalue local = new ALocalLvalue(new TIdentifier("tempName", 0, 0)); ALvalueExp exp = new ALvalueExp(local); PStm stm = Util.GetAncestor<PStm>(node); AABlock block = (AABlock)stm.Parent(); node.ReplaceBy(exp); AALocalDecl localDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(type, data), new TIdentifier(varName, 0, 0), expNode); ALocalDeclStm newStm = new ALocalDeclStm(new TSemicolon(";"), localDecl); block.GetStatements().Insert(block.GetStatements().IndexOf(stm), newStm); NewStatements.Add(newStm); data.LvalueTypes[local] = type; data.ExpTypes[exp] = type; data.LocalLinks[local] = localDecl; //localDecl.Apply(this); exp.Apply(this); return; }
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 OutAAProgram(AAProgram node) { if (strings.Count == 0) return; //Obfuscate all strings List<string> obfuscated = new List<string>(); foreach (AStringConstExp stringConstExp in strings) { TStringLiteral token = stringConstExp.GetStringLiteral(); string s = token.Text.Substring(1, token.Text.Length - 2); obfuscated.Add(Obfuscate(s)); } //Set invokes instead of string constants, and move varaiabes down List<AFieldDecl> ignoredFields = new List<AFieldDecl>(); List<AFieldDecl> moveFieldsIn = new List<AFieldDecl>(); Dictionary<AFieldDecl, AMethodDecl> fieldMethods = new Dictionary<AFieldDecl, AMethodDecl>(); for (int i = 0; i < strings.Count; i++) { AStringConstExp stringExp = strings[i]; Token token = stringExp.GetStringLiteral(); bool inDeobfuscator = Util.GetAncestor<AMethodDecl>(stringExp) == finalTrans.data.DeobfuscateMethod; if (inDeobfuscator) { AFieldDecl field = finalTrans.data.UnobfuscatedStrings[stringExp]; AStringConstExp newStringConst = new AStringConstExp(stringExp.GetStringLiteral()); field.SetInit(newStringConst); AFieldLvalue fieldRef = new AFieldLvalue(new TIdentifier(field.GetName().Text, token.Line, token.Pos)); finalTrans.data.FieldLinks[fieldRef] = field; stringExp.ReplaceBy(new ALvalueExp(fieldRef)); } else { AFieldDecl field; if (!finalTrans.data.ObfuscatedStrings.ContainsKey(stringExp)) { int line = -finalTrans.data.ObfuscatedStrings.Count - 1; field = new AFieldDecl(new APublicVisibilityModifier(), null, new TConst("const", line, 0), new ANamedType(new TIdentifier("string", line, 1), null), new TIdentifier("Galaxy_pp_stringO" + finalTrans.data.ObfuscatedStrings.Count), null); //If the strings are the same - point them to same field bool newField = true; foreach (AStringConstExp oldStringConstExp in finalTrans.data.ObfuscatedStrings.Keys) { if (stringExp.GetStringLiteral().Text == oldStringConstExp.GetStringLiteral().Text) { field = finalTrans.data.ObfuscatedStrings[oldStringConstExp]; newField = false; break; } } if (newField) { AASourceFile file = (AASourceFile)finalTrans.data.DeobfuscateMethod.Parent(); file.GetDecl().Insert(file.GetDecl().IndexOf(finalTrans.data.DeobfuscateMethod) + 1, field); finalTrans.data.Fields.Add(new SharedData.DeclItem<AFieldDecl>(file, field)); } finalTrans.data.ObfuscatedStrings.Add(stringExp, field); } field = finalTrans.data.ObfuscatedStrings[stringExp]; string obfuscatedString = obfuscated[i]; ASimpleInvokeExp invoke = new ASimpleInvokeExp(); invoke.SetName(new TIdentifier(finalTrans.data.DeobfuscateMethod.GetName().Text, stringExp.GetStringLiteral().Line, stringExp.GetStringLiteral().Pos)); AStringConstExp newStringConst = new AStringConstExp(new TStringLiteral("\"" + obfuscatedString + "\"")); invoke.GetArgs().Add(newStringConst); finalTrans.data.SimpleMethodLinks[invoke] = finalTrans.data.DeobfuscateMethod; if (Util.GetAncestor<PStm>(stringExp) == null && false) { ignoredFields.Add(field); /*if (Util.GetAncestor<ASimpleInvokeExp>(stringExp) == null) stringExp.ReplaceBy(invoke);*/ //Add obfuscate call to this location); continue; /*ASimpleInvokeExp invoke = new ASimpleInvokeExp(); invoke.SetName(new TIdentifier(finalTrans.data.DeobfuscateMethod.GetName().Text, stringExp.GetStringLiteral().Line, stringExp.GetStringLiteral().Pos)); AStringConstExp newStringConst = new AStringConstExp(new TStringLiteral("\"" + obfuscatedString + "\"")); invoke.GetArgs().Add(newStringConst); stringExp.ReplaceBy(invoke); finalTrans.data.SimpleMethodLinks[invoke] = finalTrans.data.DeobfuscateMethod; continue;*/ } if (field.GetInit() == null) { /*field.SetInit(invoke); field.SetConst(null);*/ if ( stringExp.GetStringLiteral().Text.Remove(0, 1).Substring(0, stringExp.GetStringLiteral().Text. Length - 2) == "") { //Make method /* string <field>Method() { return ""; } * */ ANullExp nullExp = new ANullExp(); field.SetInit(nullExp); field.SetConst(null); AStringConstExp stringConst = new AStringConstExp(new TStringLiteral("\"\"")); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("Get" + field.GetName()), new ArrayList(), new AABlock( new ArrayList() { new AValueReturnStm(new TReturn("return"), stringConst) }, new TRBrace("}"))); AASourceFile pFile = (AASourceFile)field.Parent(); pFile.GetDecl().Insert(pFile.GetDecl().IndexOf(field) + 1, method); finalTrans.data.ExpTypes[stringConst] = new ANamedType(new TIdentifier("string"), null); finalTrans.data.ExpTypes[nullExp] = new ANamedType(new TIdentifier("null"), null); fieldMethods[field] = method; } else { //Make method /* string <field>Method() { if (field == null) { field = Invoke; } if (field == null) { return Invoke; } return field; } */ ANullExp nullExp1 = new ANullExp(); field.SetInit(nullExp1); field.SetConst(null); ANullExp nullExp2 = new ANullExp(); AFieldLvalue fieldRef1 = new AFieldLvalue(new TIdentifier(field.GetName().Text)); AFieldLvalue fieldRef2 = new AFieldLvalue(new TIdentifier(field.GetName().Text)); AFieldLvalue fieldRef3 = new AFieldLvalue(new TIdentifier(field.GetName().Text)); ALvalueExp fieldRef1Exp = new ALvalueExp(fieldRef1); ALvalueExp fieldRef3Exp = new ALvalueExp(fieldRef3); ABinopExp binop1 = new ABinopExp(fieldRef1Exp, new AEqBinop(new TEq("==")), nullExp2); AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), fieldRef2, invoke); AIfThenStm ifStm1 = new AIfThenStm(new TLParen("("), binop1, new ABlockStm(new TLBrace("{"), new AABlock( new ArrayList() { new AExpStm(new TSemicolon(";"), assignment) }, new TRBrace("}")))); /*ANullExp nullExp3 = new ANullExp(); AFieldLvalue fieldRef4 = new AFieldLvalue(new TIdentifier(field.GetName().Text)); ALvalueExp fieldRef4Exp = new ALvalueExp(fieldRef4); AStringConstExp invokeArgClone = new AStringConstExp(new TStringLiteral("\"" + obfuscatedString + "\"")); ASimpleInvokeExp invokeClone = new ASimpleInvokeExp(new TIdentifier(invoke.GetName().Text), new ArrayList() { invokeArgClone }); finalTrans.data.SimpleMethodLinks[invokeClone] = finalTrans.data.DeobfuscateMethod; ABinopExp binop2 = new ABinopExp(fieldRef4Exp, new AEqBinop(new TEq("==")), nullExp3); AIfThenStm ifStm2 = new AIfThenStm(new TLParen("("), binop2, new ABlockStm(new TLBrace("{"), new AABlock( new ArrayList() { new AValueReturnStm(new TReturn("return"), invokeClone) }, new TRBrace("}"))));*/ AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("Get" + field.GetName()), new ArrayList(), new AABlock( new ArrayList() { ifStm1, //ifStm2, new AValueReturnStm(new TReturn("return"), fieldRef3Exp) }, new TRBrace("}"))); AASourceFile pFile = (AASourceFile) field.Parent(); pFile.GetDecl().Insert(pFile.GetDecl().IndexOf(field) + 1, method); finalTrans.data.FieldLinks[fieldRef1] = finalTrans.data.FieldLinks[fieldRef2] = finalTrans.data.FieldLinks[fieldRef3] = /*finalTrans.data.FieldLinks[fieldRef4] = */field; finalTrans.data.LvalueTypes[fieldRef1] = finalTrans.data.LvalueTypes[fieldRef2] = finalTrans.data.LvalueTypes[fieldRef3] = //finalTrans.data.LvalueTypes[fieldRef4] = finalTrans.data.ExpTypes[fieldRef1Exp] = finalTrans.data.ExpTypes[fieldRef3Exp] = //finalTrans.data.ExpTypes[fieldRef4Exp] = finalTrans.data.ExpTypes[assignment] = field.GetType(); finalTrans.data.ExpTypes[nullExp1] = finalTrans.data.ExpTypes[nullExp2] = /*finalTrans.data.ExpTypes[nullExp3] =*/ new ANamedType(new TIdentifier("null"), null); finalTrans.data.ExpTypes[binop1] = /*finalTrans.data.ExpTypes[binop2] = */new ANamedType(new TIdentifier("bool"), null); fieldMethods[field] = method; } /* AFieldLvalue fieldRef = new AFieldLvalue(new TIdentifier(field.GetName().Text, token.Line, token.Pos)); finalTrans.data.FieldLinks[fieldRef] = field;*/ //stringExp.ReplaceBy(new ALvalueExp(fieldRef)); } ASimpleInvokeExp invoke2 = new ASimpleInvokeExp(new TIdentifier(fieldMethods[field].GetName().Text), new ArrayList()); finalTrans.data.SimpleMethodLinks[invoke2] = fieldMethods[field]; stringExp.ReplaceBy(invoke2); //If we are in a field, move it in if (Util.GetAncestor<AFieldDecl>(invoke2) != null) moveFieldsIn.Add(Util.GetAncestor<AFieldDecl>(invoke2)); } } foreach (AFieldDecl field in finalTrans.data.ObfuscationFields) { if (field.GetInit() == null && field.Parent() != null) { field.Parent().RemoveChild(field); } } //A constant field, or a field used by a constant field cannot be moved in List<AFieldDecl> constantFields = new List<AFieldDecl>(); foreach (SharedData.DeclItem<AFieldDecl> field in finalTrans.data.Fields) { if (field.Decl.GetConst() != null) constantFields.Add(field.Decl); } for (int i = 0; i < constantFields.Count; i++) { GetFieldLvalues lvalues = new GetFieldLvalues(); constantFields[i].Apply(lvalues); foreach (AFieldLvalue lvalue in lvalues.Lvalues) { AFieldDecl field = finalTrans.data.FieldLinks[lvalue]; if (!constantFields.Contains(field)) constantFields.Add(field); } } moveFieldsIn.RemoveAll(constantFields.Contains); Dictionary<AFieldDecl, List<AFieldDecl>> dependancies = new Dictionary<AFieldDecl, List<AFieldDecl>>(); //Order the fields so any dependancies are instansiated first foreach (AFieldDecl field in moveFieldsIn) { dependancies.Add(field, new List<AFieldDecl>()); GetFieldLvalues lvalues = new GetFieldLvalues(); field.Apply(lvalues); foreach (AFieldLvalue lvalue in lvalues.Lvalues) { AFieldDecl dependancy = finalTrans.data.FieldLinks[lvalue]; if (!dependancies[field].Contains(dependancy)) dependancies[field].Add(dependancy); } } List<PStm> newStatements = new List<PStm>(); while (dependancies.Keys.Count > 0) { AFieldDecl field = dependancies.FirstOrDefault(f1 => f1.Value.Count == 0).Key ?? dependancies.Keys.First(f => true); AFieldLvalue fieldRef = new AFieldLvalue(new TIdentifier(field.GetName().Text)); AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), fieldRef, field.GetInit()); field.SetInit(null); newStatements.Add(new AExpStm(new TSemicolon(";"), assignment)); finalTrans.data.FieldLinks[fieldRef] = field; finalTrans.data.LvalueTypes[fieldRef] = finalTrans.data.ExpTypes[assignment] = field.GetType(); foreach (KeyValuePair<AFieldDecl, List<AFieldDecl>> dependancy in dependancies) { if (dependancy.Value.Contains(field)) dependancy.Value.Remove(field); } dependancies.Remove(field); } AABlock initBody = (AABlock) finalTrans.mainEntry.GetBlock(); for (int i = newStatements.Count - 1; i >= 0; i--) { initBody.GetStatements().Insert(0, newStatements[i]); } }
internal Args_Cast(ASimpleInvokeExp obj) { this.obj = obj; }
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); }
public static void Apply(AAProgram ast, FinalTransformations finalTrans) { //Build list of file dependacies Phase1 phase1 = new Phase1(finalTrans); ast.Apply(phase1); var dependancies = phase1.dependancies; if (dependancies.Keys.Count == 0) return; AASourceFile root = Util.GetAncestor<AASourceFile>(finalTrans.mainEntry) ?? dependancies.Keys.FirstOrDefault(file => !file.GetName().Text.Contains("\\")) ?? dependancies.Keys.First(file => true); //Remove files unreachable from root //On second thought, dont. there might be static refferences the other way which needs to be included /*{ List<AASourceFile> reachable = GetReachable(root, dependancies); AASourceFile[] keys = new AASourceFile[dependancies.Count]; dependancies.Keys.CopyTo(keys, 0); foreach (AASourceFile key in keys) { if (!reachable.Contains(key)) dependancies.Remove(key); } }*/ //Push common depancies up /* * root -> (item1 -> (item3), item2 -> (item4 -> (item3))) * * root -> (item3, item1, item2 -> (item4)) */ //Add unreachable to the root while (true) { List<AASourceFile> reachable = new List<AASourceFile>(); GetReachable(root, dependancies, ref reachable); if (reachable.Count == dependancies.Count + (reachable.Contains(null) ? 1 : 0)) break; AASourceFile[] keys = new AASourceFile[dependancies.Count]; dependancies.Keys.CopyTo(keys, 0); foreach (AASourceFile key in keys) { if (!reachable.Contains(key)) { AASourceFile k = key; //See if you can find another unreachable file which need this file Dictionary<AASourceFile, int> decendantCounts = new Dictionary<AASourceFile, int>(); decendantCounts.Add(k, CountDecendants(k, dependancies, new List<AASourceFile>())); while (true) { AASourceFile file = null; foreach (KeyValuePair<AASourceFile, List<AASourceFile>> dependancy in dependancies) { if (decendantCounts.ContainsKey(dependancy.Key)) continue; if (!dependancy.Value.Contains(k)) continue; file = dependancy.Key; break; } //AASourceFile file = dependancies.FirstOrDefault(item => item.Value.Contains(k)).Key; if (file == null) break; decendantCounts.Add(file, CountDecendants(file, dependancies, new List<AASourceFile>())); k = file; } foreach (KeyValuePair<AASourceFile, int> decendantItem in decendantCounts) { if (decendantItem.Value > decendantCounts[k]) k = decendantItem.Key; } dependancies[root].Add(k); break; } } } //It is moved down here because cycles are not removed in unreachable RemoveCycles(root, dependancies, new List<AASourceFile> { root }); //Convert to tree to make it easier List<Item> allItems = new List<Item>(); IncludeItem rootIncludeItem = MakeTree(root, dependancies, allItems, null); bool[] removed = new bool[allItems.Count]; for (int i = 0; i < removed.Length; i++) removed[i] = false; int removedCount = 0; //Ensure that each include is only included one place for (int i = 0; i < allItems.Count; i++) { if (removed[i]) continue; IncludeItem item1 = (IncludeItem)allItems[i]; for (int j = i + 1; j < allItems.Count; j++) { if (removed[j]) continue; IncludeItem item2 = (IncludeItem)allItems[j]; if (item1.Current == item2.Current) { List<Item> path1 = item1.Path; List<Item> path2 = item2.Path; for (int k = 0; k < Math.Min(path1.Count, path2.Count); k++) { if (path1[k] != path2[k]) { int insertAt = Math.Min(path1[k - 1].Children.IndexOf(path1[k]), path2[k - 1].Children.IndexOf(path2[k])); item1.Parent.Children.Remove(item1); LinkedList<IncludeItem> toRemove = new LinkedList<IncludeItem>(); toRemove.AddLast(item2); while (toRemove.Count > 0) { IncludeItem item = toRemove.First.Value; toRemove.RemoveFirst(); item.Parent.Children.Remove(item); //allItems.Remove(item); removedCount++; removed[item.ListIndex] = true; foreach (IncludeItem child in item.Children) { toRemove.AddLast(child); } } //j--; path1[k - 1].Children.Insert(insertAt, item1); item1.Parent = path1[k - 1]; break; } } } } } List<Item> newAllItems = new List<Item>(allItems.Count - removedCount); for (int i = 0; i < allItems.Count; i++) if (!removed[i]) newAllItems.Add(allItems[i]); allItems = newAllItems; //Move the null node to nr [0] foreach (IncludeItem item in allItems) { if (item.Current == null) { int itemIndex = item.Parent.Children.IndexOf(item); Item item0 = item.Parent.Children[0]; item.Parent.Children[0] = item; item.Parent.Children[itemIndex] = item0; break; } } //Insert method decls and move structs & fields up as needed ast.Apply(new Phase2(finalTrans, allItems)); //Insert the headers in the files if (Options.Compiler.OneOutputFile) { //for (int i = 0; i < allItems.Count; i++) int i = 0; while (allItems.Count > 0) { if (allItems[i] is IncludeItem) { IncludeItem includeItem = (IncludeItem) allItems[i]; //Dont want the standard lib if (includeItem.Current == null) { i++; continue; } //If it has children with children, then pick another first if (includeItem.Children.Any(child => child.Children.Count > 0)) { i++; continue; } if (includeItem.Children.Count == 0) { if (includeItem.Parent == null) break; i++; continue; } i = 0; //Put all children into this while (includeItem.Children.Count > 0) { int childNr = includeItem.Children.Count - 1; allItems.Remove(includeItem.Children[childNr]); if (includeItem.Children[childNr] is FieldItem) { FieldItem aItem = (FieldItem)includeItem.Children[childNr]; Node node = aItem.FieldDecl; node.Parent().RemoveChild(node); includeItem.Current.GetDecl().Insert(0, node); } else if (includeItem.Children[childNr] is StructItem) { StructItem aItem = (StructItem)includeItem.Children[childNr]; Node node = aItem.StructDecl; node.Parent().RemoveChild(node); includeItem.Current.GetDecl().Insert(0, node); } else if (includeItem.Children[childNr] is MethodDeclItem) { MethodDeclItem aItem = (MethodDeclItem)includeItem.Children[childNr]; AMethodDecl aNode = new AMethodDecl(); if (aItem.RealDecl.GetStatic() != null) aNode.SetStatic(new TStatic("static")); aNode.SetReturnType(Util.MakeClone(aItem.RealDecl.GetReturnType(), finalTrans.data)); aNode.SetName(new TIdentifier(aItem.RealDecl.GetName().Text)); foreach (AALocalDecl formal in aItem.RealDecl.GetFormals()) { AALocalDecl clone = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(formal.GetType(), finalTrans.data), new TIdentifier(formal.GetName().Text), null); aNode.GetFormals().Add(clone); } includeItem.Current.GetDecl().Insert(0, aNode); } else if (includeItem.Children[childNr] is IncludeItem) { IncludeItem aChild = (IncludeItem)includeItem.Children[childNr]; if (aChild.Current == null) { AIncludeDecl node = new AIncludeDecl(new TInclude("include"), new TStringLiteral("\"TriggerLibs/NativeLib\"")); includeItem.Current.GetDecl().Insert(0, node); } else { PDecl[] decls = new PDecl[aChild.Current.GetDecl().Count]; aChild.Current.GetDecl().CopyTo(decls, 0); for (int k = decls.Length - 1; k >= 0; k--) { includeItem.Current.GetDecl().Insert(0, decls[k]); } aChild.Current.Parent().RemoveChild(aChild.Current); //i = -1; } } includeItem.Children.RemoveAt(childNr); } } } } else foreach (IncludeItem includeItem in allItems.OfType<IncludeItem>()) { for (int i = includeItem.Children.Count - 1; i >= 0; i--) { Node node; if (includeItem.Children[i] is IncludeItem) { IncludeItem aItem = (IncludeItem) includeItem.Children[i]; node = new AIncludeDecl(new TInclude("include"), new TStringLiteral("\"" + (aItem.Current == null ? "TriggerLibs/NativeLib" : aItem.Current.GetName().Text.Replace("\\", "/")) + "\"")); if (aItem.Current == null && finalTrans.mainEntry != null) { //Search for user defined initlib bool foundInvoke = false; foreach (ASimpleInvokeExp invokeExp in finalTrans.data.SimpleMethodLinks.Keys) { if(invokeExp.GetName().Text == "libNtve_InitLib" && invokeExp.GetArgs().Count == 0) { /*finalTrans.errors.Add(new ErrorCollection.Error(invokeExp.GetName(), Util.GetAncestor<AASourceFile>( invokeExp), "You are invoking libNtve_InitLib() yourself somewhere. It will not be auto inserted.", true));*/ foundInvoke = true; break; } } if (!foundInvoke) { //Init the lib ASimpleInvokeExp initExp = new ASimpleInvokeExp(); initExp.SetName(new TIdentifier("libNtve_InitLib")); finalTrans.data.ExpTypes[initExp] = new AVoidType(new TVoid("void")); foreach (AMethodDecl method in finalTrans.data.Libraries.Methods) { if (method.GetName().Text == "libNtve_InitLib" && method.GetFormals().Count == 0) { finalTrans.data.SimpleMethodLinks[initExp] = method; } } AABlock block = (AABlock) finalTrans.mainEntry.GetBlock(); block.GetStatements().Insert(0, new AExpStm(new TSemicolon(";"), initExp)); } } } else if (includeItem.Children[i] is FieldItem) { FieldItem aItem = (FieldItem)includeItem.Children[i]; node = aItem.FieldDecl; node.Parent().RemoveChild(node); } else if (includeItem.Children[i] is StructItem) { StructItem aItem = (StructItem)includeItem.Children[i]; node = aItem.StructDecl; node.Parent().RemoveChild(node); } else if (includeItem.Children[i] is MethodDeclItem) { MethodDeclItem aItem = (MethodDeclItem)includeItem.Children[i]; AMethodDecl aNode = new AMethodDecl(); if (aItem.RealDecl.GetStatic() != null) aNode.SetStatic(new TStatic("static")); aNode.SetReturnType(Util.MakeClone(aItem.RealDecl.GetReturnType(), finalTrans.data)); aNode.SetName(new TIdentifier(aItem.RealDecl.GetName().Text)); foreach (AALocalDecl formal in aItem.RealDecl.GetFormals()) { AALocalDecl clone = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, Util.MakeClone(formal.GetType(), finalTrans.data), new TIdentifier(formal.GetName().Text), null); aNode.GetFormals().Add(clone); } node = aNode; } else throw new Exception("FixIncludes.Apply: Unexpected item type"); includeItem.Current.GetDecl().Insert(0, node); } } }
public virtual void InASimpleInvokeExp(ASimpleInvokeExp node) { DefaultIn(node); }
public virtual void CaseASimpleInvokeExp(ASimpleInvokeExp node) { DefaultCase(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(")"); }
ArrayList New377() { ArrayList nodeList = new ArrayList(); ArrayList nodeArrayList4 = (ArrayList) Pop(); ArrayList nodeArrayList3 = (ArrayList) Pop(); ArrayList nodeArrayList2 = (ArrayList) Pop(); ArrayList nodeArrayList1 = (ArrayList) Pop(); TypedList listNode4 = new TypedList(); TIdentifier tidentifierNode2 = (TIdentifier)nodeArrayList1[0]; TypedList listNode3 = (TypedList)nodeArrayList3[0]; if ( listNode3 != null ) { listNode4.AddAll(listNode3); } ASimpleInvokeExp pexpNode1 = new ASimpleInvokeExp ( tidentifierNode2, listNode4 ); nodeList.Add(pexpNode1); return nodeList; }
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 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 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; }
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 (currentMethod == null) return; AMethodDecl decl = data.SimpleMethodLinks[node]; if (!UsedMethods[currentMethod].Contains(decl)) UsedMethods[currentMethod].Add(decl); }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { Invokes.Add(node); }
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); }
public override void OutABinopExp(ABinopExp node) { PBinop binop = node.GetBinop(); PExp left = node.GetLeft(); PType leftType = data.ExpTypes[left]; string leftTypeString = Util.TypeToString(leftType); PExp right = node.GetRight(); PType rightType = data.ExpTypes[right]; string rightTypeString = Util.TypeToString(rightType); bool wasDefined = false; Token token = null; while (true) { if (binop is APlusBinop) { token = ((APlusBinop) binop).GetToken(); //Check that types are okay for + if (!new[] {"int", "fixed", "string", "text", "byte", "point"}.Any(c => c == leftTypeString)) { errors.Add(new ErrorCollection.Error(token, currentSourceFile, LocRM.GetString("ErrorText103") + leftTypeString)); throw new ParserException(null, null); } if (!new[] {"int", "fixed", "string", "text", "byte", "point"}.Any(c => c == rightTypeString)) { errors.Add(new ErrorCollection.Error(token, currentSourceFile, LocRM.GetString("ErrorText103") + rightTypeString)); throw new ParserException(null, null); } //If you are using string or text, both sides must be same type if ((leftTypeString == "string" && rightTypeString != "string") || (leftTypeString == "text" && rightTypeString != "text") || (leftTypeString == "point" && rightTypeString != "point") || (rightTypeString == "string" && leftTypeString != "string") || (rightTypeString == "text" && leftTypeString != "text") || (rightTypeString == "point" && leftTypeString != "point")) { if (ImplicitAssignable(leftType, rightType)) { ANamedType namedTo = (ANamedType) rightType; ACastExp cast = new ACastExp(new TLParen("("), new ANamedType( new TIdentifier(((AAName) namedTo.GetName()).AsString()), null), node.GetLeft()); node.SetLeft(cast); OutACastExp(cast); leftType = rightType; } else if (ImplicitAssignable(rightType, leftType)) { ANamedType namedTo = (ANamedType) leftType; ACastExp cast = new ACastExp(new TLParen("("), new ANamedType( new TIdentifier(((AAName) namedTo.GetName()).AsString()), null), node.GetRight()); node.SetRight(cast); OutACastExp(cast); rightType = leftType; } else { //Not valid break; } } wasDefined = true; PType type = leftType; if (rightTypeString == "fixed") type = rightType; data.ExpTypes[node] = type; } else if (binop is AMinusBinop || binop is ATimesBinop || binop is ADivideBinop || binop is AModuloBinop) { token = null; if (binop is AMinusBinop) token = ((AMinusBinop) binop).GetToken(); else if (binop is ATimesBinop) token = ((ATimesBinop) binop).GetToken(); else if (binop is ADivideBinop) token = ((ADivideBinop) binop).GetToken(); else if (binop is AModuloBinop) token = ((AModuloBinop) binop).GetToken(); //Check that types are okay for whatever if (!new[] {"int", "fixed", "byte", "point"}.Any(c => c == leftTypeString)) { //Not valid break; } if (!new[] {"int", "fixed", "byte", "point"}.Any(c => c == rightTypeString)) { //Not valid break; } if ((leftTypeString == "point" || rightTypeString == "point") && !(leftTypeString == "point" && rightTypeString == "point" && binop is AMinusBinop)) { //Not valid break; } wasDefined = true; PType type = leftType; if (rightTypeString == "fixed") type = rightType; if (rightTypeString == "int" && leftTypeString == "byte") type = rightType; data.ExpTypes[node] = type; } else if (binop is AEqBinop || binop is ANeBinop || binop is ALtBinop || binop is ALeBinop || binop is AGtBinop || binop is AGeBinop) { token = null; if (binop is AEqBinop) token = ((AEqBinop) binop).GetToken(); else if (binop is ANeBinop) token = ((ANeBinop) binop).GetToken(); else if (binop is ALtBinop) token = ((ALtBinop) binop).GetToken(); else if (binop is ALeBinop) token = ((ALeBinop) binop).GetToken(); else if (binop is AGtBinop) token = ((AGtBinop) binop).GetToken(); else if (binop is AGeBinop) token = ((AGeBinop) binop).GetToken(); //Unless types are int and fixed, they must be the same type, or null and a nullable type if (leftTypeString == "void" || rightTypeString == "void" || !( GalaxyKeywords.NullablePrimitives.words.Any(s => s == leftTypeString) && rightTypeString == "null" || leftTypeString == "null" && GalaxyKeywords.NullablePrimitives.words.Any(s => s == rightTypeString) || (leftTypeString == "int" || leftTypeString == "fixed" || leftTypeString == "byte") && (rightTypeString == "int" || rightTypeString == "fixed" || rightTypeString == "byte") || leftTypeString == rightTypeString && !(IsDynamic(leftType) || IsDynamic(rightType)) || (binop is AEqBinop || binop is ANeBinop) && ( leftTypeString == rightTypeString || leftTypeString == "null" && IsDynamic(rightType) || IsDynamic(leftType) && rightTypeString == "null" || Util.TypesEqual(leftType, rightType, data) ) || leftType is ANamedType && data.DelegateTypeLinks.ContainsKey((ANamedType) leftType) && (rightTypeString == "null" || rightType is ANamedType && data.DelegateTypeLinks.ContainsKey((ANamedType) rightType)) || rightType is ANamedType && data.DelegateTypeLinks.ContainsKey((ANamedType) rightType) && leftTypeString == "null" ) ) { //Not valid break; } wasDefined = true; data.ExpTypes[node] = new ANamedType(new TIdentifier("bool"), null); } else if (binop is AAndBinop || binop is AOrBinop || binop is AXorBinop || binop is ALBitShiftBinop || binop is ARBitShiftBinop) { token = null; if (binop is AAndBinop) token = ((AAndBinop) binop).GetToken(); else if (binop is AOrBinop) token = ((AOrBinop) binop).GetToken(); else if (binop is AXorBinop) token = ((AXorBinop) binop).GetToken(); else if (binop is ALBitShiftBinop) token = ((ALBitShiftBinop) binop).GetToken(); else if (binop is ARBitShiftBinop) token = ((ARBitShiftBinop) binop).GetToken(); if ( !((leftTypeString == "int" || leftTypeString == "byte") && (rightTypeString == "int" || rightTypeString == "byte") && (binop is ALBitShiftBinop || binop is ARBitShiftBinop || leftTypeString == rightTypeString))) { if (rightTypeString == "int" && leftTypeString == "byte" && left is AIntConstExp) { data.ExpTypes[left] = leftType = new ANamedType(new TIdentifier("int"), null); leftTypeString = "int"; } else if (leftTypeString == "int" && rightTypeString == "byte" && right is AIntConstExp) { data.ExpTypes[right] = rightType = new ANamedType(new TIdentifier("int"), null); rightTypeString = "int"; } else { //Not valid break; } } wasDefined = true; data.ExpTypes[node] = leftType; if (rightTypeString == "int") data.ExpTypes[node] = rightType; } else if (binop is ALazyAndBinop || binop is ALazyOrBinop) { token = null; if (binop is ALazyAndBinop) token = ((ALazyAndBinop) binop).GetToken(); else if (binop is ALazyOrBinop) token = ((ALazyOrBinop) binop).GetToken(); if (leftTypeString != "bool" || rightTypeString != "bool") { errors.Add(new ErrorCollection.Error(token, currentSourceFile, token.Text + LocRM.GetString("ErrorText104") + token.Text + " bool). Got (" + leftTypeString + " " + token.Text + " " + rightTypeString + ")")); throw new ParserException(null, null); } wasDefined = true; data.ExpTypes[node] = leftType; } else throw new Exception("Unexpected binop (This should never happen)"); break; } List<AMethodDecl> possibleOperators = new List<AMethodDecl>(); List<IList> visibleDecls = Util.GetVisibleDecls(node, true); List<string> currentNamespace = Util.GetFullNamespace(node); AASourceFile currentFile = Util.GetAncestor<AASourceFile>(node); foreach (IList declList in visibleDecls) { bool sameNS = false; bool sameFile = false; if (declList.Count > 0) { sameNS = Util.NamespacesEquals(currentNamespace, Util.GetFullNamespace((PDecl) declList[0])); sameFile = currentFile == Util.GetAncestor<AASourceFile>((PDecl) declList[0]); } foreach (PDecl decl in declList) { if (decl is AMethodDecl) { AMethodDecl method = (AMethodDecl) decl; if (method.GetName().Text == token.Text) { if (method.GetVisibilityModifier() is APrivateVisibilityModifier && !sameNS) continue; if (method.GetStatic() != null && !sameFile) continue; //Check that parameters are assignable bool add = true; bool matchImplicit = false; List<PType> argTypes = new List<PType>(){leftType, rightType}; for (int i = 0; i < argTypes.Count; i++) { PType argType = argTypes[i]; AALocalDecl formal = (AALocalDecl)method.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)) { add = false; if (formal.GetOut() == null && formal.GetRef() == null && ImplicitAssignable(argType, formalType)) { matchImplicit = true; } else { matchImplicit = false; break; } } } if (!add && !matchImplicit) continue; if (add) possibleOperators.Add(method); } } } } if (possibleOperators.Count == 0 && !wasDefined) { errors.Add(new ErrorCollection.Error(token, LocRM.GetString("ErrorText105") + leftTypeString + " " + token.Text + " " + rightTypeString + ")")); throw new ParserException(token, "TypeChecking.OutABinopExp"); } if (possibleOperators.Count + (wasDefined ? 1 : 0) > 1) { List<ErrorCollection.Error> subErrors = new List<ErrorCollection.Error>(); foreach (AMethodDecl method in possibleOperators) { subErrors.Add(new ErrorCollection.Error(method.GetName(), LocRM.GetString("ErrorText106"))); } if (wasDefined) subErrors.Add(new ErrorCollection.Error(token, LocRM.GetString("ErrorText107") + token.Text)); errors.Add(new ErrorCollection.Error(token, LocRM.GetString("ErrorText108") + leftTypeString + " " + token.Text + " " + rightTypeString + LocRM.GetString("ErrorText109"), false, subErrors.ToArray())); throw new ParserException(token, "TypeChecking.OutABinopExp"); } if (wasDefined) return; AMethodDecl op = possibleOperators[0]; ASimpleInvokeExp replacer = new ASimpleInvokeExp(new TIdentifier(op.GetName().Text), new ArrayList(){node.GetLeft(), node.GetRight()}); node.ReplaceBy(replacer); data.SimpleMethodLinks[replacer] = op; data.ExpTypes[replacer] = op.GetReturnType(); //base.OutABinopExp(node); }
public virtual void OutASimpleInvokeExp(ASimpleInvokeExp node) { DefaultOut(node); }
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); } }
public override void InASimpleInvokeExp(ASimpleInvokeExp node) { AMethodDecl decl = finalTrans.data.SimpleMethodLinks[node]; AddDepency(Util.GetAncestor<AASourceFile>(node), Util.GetAncestor<AASourceFile>(decl)); }
public override void OutANonstaticInvokeExp(ANonstaticInvokeExp node) { List<AMethodDecl> candidates = new List<AMethodDecl>(); List<AMethodDecl> implicitCandidates = new List<AMethodDecl>(); List<AMethodDecl> matchingNames = new List<AMethodDecl>(); List<AMethodDecl> delegateCandidates = new List<AMethodDecl>(); List<PType> argTypes = new List<PType>(); foreach (PExp exp in node.GetArgs()) { argTypes.Add(data.ExpTypes[exp]); } PExp baseExp; bool needsVistit = false; Node reciever = node.GetReceiver(); bool visitBaseExp = false; if (node.GetReceiver() is ALvalueExp && ((ALvalueExp)node.GetReceiver()).GetLvalue() is AAmbiguousNameLvalue) { visitBaseExp = true; reciever = ((AAmbiguousNameLvalue) ((ALvalueExp) node.GetReceiver()).GetLvalue()).GetAmbiguous(); } bool matchResize; GetTargets(node.GetName().Text, node.GetName(), reciever, null, argTypes, candidates, out matchResize, implicitCandidates, matchingNames, out baseExp, delegateCandidates, data, errors); if (visitBaseExp && baseExp != null) { node.GetArgs().Add(baseExp); baseExp.Apply(this); node.GetArgs().Remove(baseExp); } if (matchResize) { AArrayResizeExp replacer = new AArrayResizeExp(node.GetName(), baseExp, (PExp) node.GetArgs()[0]); node.ReplaceBy(replacer); data.ExpTypes[replacer] = new ANamedType(new TIdentifier("void"), null); return; } if (implicitCandidates.Count > 0) { //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); } } } if (delegateCandidates.Count > 0) {//Target is a delegate invoke ADelegateInvokeExp replacer = new ADelegateInvokeExp(node.GetName(), baseExp, new ArrayList()); while (node.GetArgs().Count > 0) { replacer.GetArgs().Add(node.GetArgs()[0]); } data.ExpTypes[replacer] = delegateCandidates[0].GetReturnType(); node.ReplaceBy(replacer); return; } AMethodDecl candidate = candidates.Count == 1 ? candidates[0] : implicitCandidates[0]; if (baseExp == null) { //Replace with a simple invoke to it. ASimpleInvokeExp replacementInvoke = new ASimpleInvokeExp(node.GetName(), new ArrayList()); while (node.GetArgs().Count > 0) { replacementInvoke.GetArgs().Add(node.GetArgs()[0]); } data.SimpleMethodLinks[replacementInvoke] = candidate; data.ExpTypes[replacementInvoke] = candidate.GetReturnType(); node.ReplaceBy(replacementInvoke); CheckInvoke(replacementInvoke, candidate); return; } node.SetReceiver(baseExp); data.StructMethodLinks[node] = candidate; data.ExpTypes[node] = candidate.GetReturnType(); if (candidate.GetInline() != null) { AMethodDecl pMethod = Util.GetAncestor<AMethodDecl>(node); AConstructorDecl pConstructor = Util.GetAncestor<AConstructorDecl>(node); APropertyDecl pProperty = Util.GetAncestor<APropertyDecl>(node); if (pMethod == null && pConstructor == null && pProperty == null && !Util.HasAncestor<ADeconstructorDecl>(node)) { errors.Add(new ErrorCollection.Error(node.GetName(), currentSourceFile, LocRM.GetString("ErrorText133"))); } else if (pMethod != null && !InlineMethodCalls[pMethod].Contains(candidate)) InlineMethodCalls[pMethod].Add(candidate); } base.OutANonstaticInvokeExp(node); }
//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 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); }
private AMethodDecl CreateStringDeobfuscator() { AASourceFile file = (AASourceFile) finalTrans.mainEntry.Parent(); //Create fields for the string constants AStringConstExp emptyStringConst = new AStringConstExp(new TStringLiteral("\"\"")); AFieldDecl emptyStringField = new AFieldDecl(new APublicVisibilityModifier(), null, new TConst("const"), new ANamedType(new TIdentifier("string"), null), new TIdentifier("fOobar"), emptyStringConst); file.GetDecl().Add(emptyStringField); data.Fields.Add(new SharedData.DeclItem<AFieldDecl>(file, emptyStringField)); AFieldLvalue emptyStringRef1 = new AFieldLvalue(new TIdentifier(emptyStringField.GetName().Text)); AFieldLvalue emptyStringRef2 = new AFieldLvalue(new TIdentifier(emptyStringField.GetName().Text)); AFieldLvalue emptyStringRef3 = new AFieldLvalue(new TIdentifier(emptyStringField.GetName().Text)); ALvalueExp emptyStringRef1Exp = new ALvalueExp(emptyStringRef1); ALvalueExp emptyStringRef2Exp = new ALvalueExp(emptyStringRef2); ALvalueExp emptyStringRef3Exp = new ALvalueExp(emptyStringRef3); AStringConstExp colonStringConst = new AStringConstExp(new TStringLiteral("\":\"")); AFieldDecl colonStringField = new AFieldDecl(new APublicVisibilityModifier(), null, new TConst("const"), new ANamedType(new TIdentifier("string"), null), new TIdentifier("foObar"), colonStringConst); file.GetDecl().Add(colonStringField); data.Fields.Add(new SharedData.DeclItem<AFieldDecl>(file, colonStringField)); AFieldLvalue colonStringRef = new AFieldLvalue(new TIdentifier(colonStringField.GetName().Text)); ALvalueExp colonStringRefExp = new ALvalueExp(colonStringRef); /* string output = ""; string ch; int length = StringLength(s); int phase1 = (length - 1)%3; int phase2 = (length - 1)%2; */ AALocalDecl stringParam = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("fo0bar"), emptyStringRef1Exp); ALocalLvalue stringParamRef1 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef2 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef3 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef4 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef5 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef6 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef7 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALocalLvalue stringParamRef8 = new ALocalLvalue(new TIdentifier(stringParam.GetName().Text)); ALvalueExp stringParamRef1Exp = new ALvalueExp(stringParamRef1); ALvalueExp stringParamRef2Exp = new ALvalueExp(stringParamRef2); ALvalueExp stringParamRef4Exp = new ALvalueExp(stringParamRef4); ALvalueExp stringParamRef5Exp = new ALvalueExp(stringParamRef5); ALvalueExp stringParamRef7Exp = new ALvalueExp(stringParamRef7); ALvalueExp stringParamRef8Exp = new ALvalueExp(stringParamRef8); AABlock methodBlock = new AABlock(new ArrayList(), new TRBrace("}")); AALocalDecl outputDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("foobar"), emptyStringRef1Exp); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), outputDecl)); ALocalLvalue outputRef1 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef2 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef3 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef4 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef5 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef6 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef7 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef8 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef9 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef10 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef11 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef12 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALocalLvalue outputRef13 = new ALocalLvalue(new TIdentifier(outputDecl.GetName().Text)); ALvalueExp outputRef2Exp = new ALvalueExp(outputRef2); ALvalueExp outputRef4Exp = new ALvalueExp(outputRef4); ALvalueExp outputRef5Exp = new ALvalueExp(outputRef5); ALvalueExp outputRef6Exp = new ALvalueExp(outputRef6); ALvalueExp outputRef7Exp = new ALvalueExp(outputRef7); ALvalueExp outputRef8Exp = new ALvalueExp(outputRef8); ALvalueExp outputRef10Exp = new ALvalueExp(outputRef10); ALvalueExp outputRef11Exp = new ALvalueExp(outputRef11); ALvalueExp outputRef12Exp = new ALvalueExp(outputRef12); ALvalueExp outputRef13Exp = new ALvalueExp(outputRef13); AALocalDecl chDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("f0obar"), null); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), chDecl)); ALocalLvalue chRef1 = new ALocalLvalue(new TIdentifier(chDecl.GetName().Text)); ALocalLvalue chRef2 = new ALocalLvalue(new TIdentifier(chDecl.GetName().Text)); ALocalLvalue chRef3 = new ALocalLvalue(new TIdentifier(chDecl.GetName().Text)); ALocalLvalue chRef4 = new ALocalLvalue(new TIdentifier(chDecl.GetName().Text)); ALocalLvalue chRef5 = new ALocalLvalue(new TIdentifier(chDecl.GetName().Text)); ALvalueExp chRef3Exp = new ALvalueExp(chRef3); ALvalueExp chRef4Exp = new ALvalueExp(chRef4); ALvalueExp chRef5Exp = new ALvalueExp(chRef5); ASimpleInvokeExp stringLengthInvoke1 = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() { stringParamRef1Exp }); AALocalDecl lengthDecl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("f0Obar"), stringLengthInvoke1); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), lengthDecl)); ALocalLvalue lengthRef1 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef2 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef3 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef4 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef5 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef6 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef7 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALocalLvalue lengthRef8 = new ALocalLvalue(new TIdentifier(lengthDecl.GetName().Text)); ALvalueExp lengthRef1Exp = new ALvalueExp(lengthRef1); ALvalueExp lengthRef2Exp = new ALvalueExp(lengthRef2); ALvalueExp lengthRef3Exp = new ALvalueExp(lengthRef3); ALvalueExp lengthRef4Exp = new ALvalueExp(lengthRef4); ALvalueExp lengthRef5Exp = new ALvalueExp(lengthRef5); ALvalueExp lengthRef6Exp = new ALvalueExp(lengthRef6); ALvalueExp lengthRef7Exp = new ALvalueExp(lengthRef7); AIntConstExp intConstp1Init1 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConstp1Init2 = new AIntConstExp(new TIntegerLiteral("3")); ABinopExp binopExpP1InitMinus = new ABinopExp(lengthRef1Exp, new AMinusBinop(new TMinus("-")), intConstp1Init1); ABinopExp binopExpP1InitMod = new ABinopExp(binopExpP1InitMinus, new AModuloBinop(new TMod("%")), intConstp1Init2); AALocalDecl phase1Decl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("fO0bar"), binopExpP1InitMod); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), phase1Decl)); ALocalLvalue phase1Ref1 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref2 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref3 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref4 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref5 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref6 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref7 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref8 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref9 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref10 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALocalLvalue phase1Ref11 = new ALocalLvalue(new TIdentifier(phase1Decl.GetName().Text)); ALvalueExp phase1Ref1Exp = new ALvalueExp(phase1Ref1); ALvalueExp phase1Ref2Exp = new ALvalueExp(phase1Ref2); ALvalueExp phase1Ref4Exp = new ALvalueExp(phase1Ref4); ALvalueExp phase1Ref5Exp = new ALvalueExp(phase1Ref5); ALvalueExp phase1Ref7Exp = new ALvalueExp(phase1Ref7); ALvalueExp phase1Ref9Exp = new ALvalueExp(phase1Ref9); ALvalueExp phase1Ref10Exp = new ALvalueExp(phase1Ref10); ALvalueExp phase1Ref11Exp = new ALvalueExp(phase1Ref11); AIntConstExp intConstp2Init1 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConstp2Init2 = new AIntConstExp(new TIntegerLiteral("2")); ABinopExp binopExpP2InitMinus = new ABinopExp(lengthRef2Exp, new AMinusBinop(new TMinus("-")), intConstp2Init1); ABinopExp binopExpP2InitMod = new ABinopExp(binopExpP2InitMinus, new AModuloBinop(new TMod("%")), intConstp2Init2); AALocalDecl phase2Decl = new AALocalDecl(new APublicVisibilityModifier(), null, null, null, null, new ANamedType(new TIdentifier("int"), null), new TIdentifier("carl"), binopExpP2InitMod); methodBlock.GetStatements().Add(new ALocalDeclStm(new TSemicolon(";"), phase2Decl)); ALocalLvalue phase2Ref1 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref2 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref3 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref4 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref5 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref6 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref7 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref8 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALocalLvalue phase2Ref9 = new ALocalLvalue(new TIdentifier(phase2Decl.GetName().Text)); ALvalueExp phase2Ref1Exp = new ALvalueExp(phase2Ref1); ALvalueExp phase2Ref2Exp = new ALvalueExp(phase2Ref2); ALvalueExp phase2Ref4Exp = new ALvalueExp(phase2Ref4); ALvalueExp phase2Ref5Exp = new ALvalueExp(phase2Ref5); ALvalueExp phase2Ref7Exp = new ALvalueExp(phase2Ref7); ALvalueExp phase2Ref9Exp = new ALvalueExp(phase2Ref9); /* while(length > 0) { if(phase2 == 0) { ch = StringSub(s, 1, 1); s = StringReplace(s, "", 1, 1); } else { if(phase2 == 1) { ch = StringSub(s, length, length); s = StringReplace(s, "", length, length); } } if(phase1 == 0) { output = ch + output; } else { if(phase1 == 1) { output = StringSub(output, 1, (StringLength(output) + 1)/2) + ch + StringSub(output, (StringLength(output) + 1)/2 + 1, StringLength(output)); } else { output = output + ch; } } phase1 = phase1 - 1; if(phase1 < 0) { phase1 = phase1 + 3; } phase2 = phase2 - 1; if(phase2 < 0) { phase2 = phase2 + 2; } length = StringLength(s); } */ AABlock whileBlock = new AABlock(new ArrayList(), new TRBrace("}")); AIntConstExp intConstWhileCond = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binopWhileCond = new ABinopExp(lengthRef3Exp, new AGtBinop(new TGt(">")), intConstWhileCond); methodBlock.GetStatements().Add(new AWhileStm(new TLParen("("), binopWhileCond, new ABlockStm(new TLBrace("{"), whileBlock))); /* if(phase2 == 0) { ch = StringSub(s, 1, 1); s = StringReplace(s, "", 1, 1); } else { if(phase2 == 1) { ch = StringSub(s, length, length); s = StringReplace(s, "", length, length); } } */ AIntConstExp intConstIf1Cond = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binopIf1Cond = new ABinopExp(phase2Ref1Exp, new AEqBinop(new TEq("==")), intConstIf1Cond); AABlock thenBlock = new AABlock(); AABlock elseBlock = new AABlock(); whileBlock.GetStatements().Add(new AIfThenElseStm(new TLParen("("), binopIf1Cond, new ABlockStm(new TLBrace("{"), thenBlock), new ABlockStm(new TLBrace("{"), elseBlock))); //ch = StringSub(s, 1, 1); AIntConstExp intConst1 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst2 = new AIntConstExp(new TIntegerLiteral("1")); ASimpleInvokeExp invokeStringSub1 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() {stringParamRef2Exp, intConst1, intConst2}); AAssignmentExp assignment1 = new AAssignmentExp(new TAssign("="), chRef1, invokeStringSub1); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment1)); //s = StringReplace(s, "", 1, 1); AIntConstExp intConst3 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst4 = new AIntConstExp(new TIntegerLiteral("1")); ASimpleInvokeExp invokeStringReplace1 = new ASimpleInvokeExp(new TIdentifier("StringReplace"), new ArrayList() { stringParamRef4Exp, emptyStringRef2Exp, intConst3, intConst4 }); AAssignmentExp assignment2 = new AAssignmentExp(new TAssign("="), stringParamRef3, invokeStringReplace1); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment2)); //if(phase2 == 1) AIntConstExp intConst5 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop1 = new ABinopExp(phase2Ref2Exp, new AEqBinop(new TEq("==")), intConst5); thenBlock = new AABlock(); elseBlock.GetStatements().Add(new AIfThenStm(new TLParen("("), binop1, new ABlockStm(new TLBrace("{"), thenBlock))); //ch = StringSub(s, length, length); ASimpleInvokeExp invokeStringSub2 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() { stringParamRef5Exp, lengthRef3Exp, lengthRef4Exp }); AAssignmentExp assignment3 = new AAssignmentExp(new TAssign("="), chRef2, invokeStringSub2); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment3)); //s = StringReplace(s, "", length, length); ASimpleInvokeExp invokeStringReplace2 = new ASimpleInvokeExp(new TIdentifier("StringReplace"), new ArrayList() { stringParamRef7Exp, emptyStringRef3Exp, lengthRef5Exp, lengthRef6Exp }); AAssignmentExp assignment4 = new AAssignmentExp(new TAssign("="), stringParamRef6, invokeStringReplace2); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment4)); //if(phase1 == 0) AIntConstExp intConst6 = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binop2 = new ABinopExp(phase1Ref1Exp, new AEqBinop(new TEq("==")), intConst6); thenBlock = new AABlock(); elseBlock = new AABlock(); whileBlock.GetStatements().Add(new AIfThenElseStm(new TLParen("("), binop2, new ABlockStm(new TLBrace("{"), thenBlock), new ABlockStm(new TLBrace("{"), elseBlock))); //output = ch + output; ABinopExp binop3 = new ABinopExp(chRef3Exp, new APlusBinop(new TPlus("+")), outputRef2Exp); AAssignmentExp assignment5 = new AAssignmentExp(new TAssign("="), outputRef1, binop3); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment5)); //if(phase1 == 1) AABlock cBlock = elseBlock; AIntConstExp intConst7 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop4 = new ABinopExp(phase1Ref2Exp, new AEqBinop(new TEq("==")), intConst7); thenBlock = new AABlock(); elseBlock = new AABlock(); cBlock.GetStatements().Add(new AIfThenElseStm(new TLParen("("), binop4, new ABlockStm(new TLBrace("{"), thenBlock), new ABlockStm(new TLBrace("{"), elseBlock))); //output = StringSub(output, 1, (StringLength(output) + 1)/2) + ch + StringSub(output, (StringLength(output) + 1)/2 + 1, StringLength(output)); AIntConstExp intConst8 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst9 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst10 = new AIntConstExp(new TIntegerLiteral("2")); AIntConstExp intConst11 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst12 = new AIntConstExp(new TIntegerLiteral("2")); AIntConstExp intConst13 = new AIntConstExp(new TIntegerLiteral("1")); ASimpleInvokeExp invokeStringLength1 = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() {outputRef5Exp}); ABinopExp binop5 = new ABinopExp(invokeStringLength1, new APlusBinop(new TPlus("+")), intConst9); ABinopExp binop6 = new ABinopExp(binop5, new ADivideBinop(new TDiv("/")), intConst10); ASimpleInvokeExp invokeStringSub3 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() { outputRef4Exp, intConst8, binop6}); ABinopExp binop7 = new ABinopExp(invokeStringSub3, new APlusBinop(new TPlus("+")), chRef4Exp); ASimpleInvokeExp invokeStringLength2 = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() { outputRef7Exp }); ABinopExp binop8 = new ABinopExp(invokeStringLength2, new APlusBinop(new TPlus("+")), intConst11); ABinopExp binop9 = new ABinopExp(binop8, new ADivideBinop(new TDiv("/")), intConst12); ABinopExp binop10 = new ABinopExp(binop9, new APlusBinop(new TPlus("+")), intConst13); ASimpleInvokeExp invokeStringLength3 = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() { outputRef8Exp }); ASimpleInvokeExp invokeStringSub4 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() { outputRef6Exp, binop10, invokeStringLength3 }); ABinopExp binop11 = new ABinopExp(binop7, new APlusBinop(new TPlus("+")), invokeStringSub4); AAssignmentExp assignment6 = new AAssignmentExp(new TAssign("="), outputRef3, binop11); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment6)); //output = output + ch; ABinopExp binop12 = new ABinopExp(outputRef10Exp, new APlusBinop(new TPlus("+")), chRef5Exp); AAssignmentExp assignment7 = new AAssignmentExp(new TAssign("="), outputRef9, binop12); elseBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment7)); //phase1 = phase1 - 1; AIntConstExp intConst14 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop13 = new ABinopExp(phase1Ref4Exp, new AMinusBinop(new TMinus("-")), intConst14); AAssignmentExp assignment8 = new AAssignmentExp(new TAssign("="), phase1Ref3, binop13); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment8)); //if(phase1 < 0) AIntConstExp intConst15 = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binop14 = new ABinopExp(phase1Ref5Exp, new ALtBinop(new TLt("<")), intConst15); thenBlock = new AABlock(); whileBlock.GetStatements().Add(new AIfThenStm(new TLParen("("), binop14, new ABlockStm(new TLBrace("{"), thenBlock))); //phase1 = phase1 + 3; AIntConstExp intConst16 = new AIntConstExp(new TIntegerLiteral("3")); ABinopExp binop15 = new ABinopExp(phase1Ref7Exp, new APlusBinop(new TPlus("+")), intConst16); AAssignmentExp assignment9 = new AAssignmentExp(new TAssign("="), phase1Ref6, binop15); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment9)); //phase2 = phase2 - 1; AIntConstExp intConst17 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop16 = new ABinopExp(phase2Ref4Exp, new AMinusBinop(new TMinus("-")), intConst17); AAssignmentExp assignment10 = new AAssignmentExp(new TAssign("="), phase2Ref3, binop16); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment10)); //if(phase2 < 0) AIntConstExp intConst18 = new AIntConstExp(new TIntegerLiteral("0")); ABinopExp binop17 = new ABinopExp(phase2Ref5Exp, new ALtBinop(new TLt("<")), intConst18); thenBlock = new AABlock(); whileBlock.GetStatements().Add(new AIfThenStm(new TLParen("("), binop17, new ABlockStm(new TLBrace("{"), thenBlock))); //phase2 = phase2 + 2; AIntConstExp intConst19 = new AIntConstExp(new TIntegerLiteral("2")); ABinopExp binop18 = new ABinopExp(phase2Ref7Exp, new APlusBinop(new TPlus("+")), intConst19); AAssignmentExp assignment11 = new AAssignmentExp(new TAssign("="), phase2Ref6, binop18); thenBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment11)); //length = StringLength(s); ASimpleInvokeExp invokeStringLength4 = new ASimpleInvokeExp(new TIdentifier("StringLength"), new ArrayList() { stringParamRef8Exp }); AAssignmentExp assignment12 = new AAssignmentExp(new TAssign("="), lengthRef8, invokeStringLength4); whileBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment12)); /* phase1 = StringFind(output, ":", false); phase2 = StringToInt(StringSub(output, 1, phase1 - 1)); return StringSub(output, phase1 + 1, phase2 + phase1); */ ABooleanConstExp boolConst1 = new ABooleanConstExp(new AFalseBool()); ASimpleInvokeExp invokeStringFind = new ASimpleInvokeExp(new TIdentifier("StringFind"), new ArrayList() {outputRef11Exp, colonStringRefExp, boolConst1}); AAssignmentExp assignment13 = new AAssignmentExp(new TAssign("="), phase1Ref8, invokeStringFind); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment13)); //phase2 = StringToInt(StringSub(output, 1, phase1 - 1)); AIntConstExp intConst20 = new AIntConstExp(new TIntegerLiteral("1")); AIntConstExp intConst21 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop19 = new ABinopExp(phase1Ref9Exp, new AMinusBinop(new TMinus("-")), intConst21); ASimpleInvokeExp invokeStringSub5 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() { outputRef12Exp, intConst20, binop19}); ASimpleInvokeExp invokeStringToInt = new ASimpleInvokeExp(new TIdentifier("StringToInt"), new ArrayList() { invokeStringSub5 }); AAssignmentExp assignment14 = new AAssignmentExp(new TAssign("="), phase2Ref8, invokeStringToInt); methodBlock.GetStatements().Add(new AExpStm(new TSemicolon(";"), assignment14)); //return StringSub(output, phase1 + 1, phase2 + phase1); AIntConstExp intConst22 = new AIntConstExp(new TIntegerLiteral("1")); ABinopExp binop20 = new ABinopExp(phase1Ref10Exp, new APlusBinop(new TPlus("+")), intConst22); ABinopExp binop21 = new ABinopExp(phase2Ref9Exp, new APlusBinop(new TPlus("+")), phase1Ref11Exp); ASimpleInvokeExp invokeStringSub6 = new ASimpleInvokeExp(new TIdentifier("StringSub"), new ArrayList() { outputRef12Exp, binop20, binop21 }); methodBlock.GetStatements().Add(new AValueReturnStm(new TReturn("return"), invokeStringSub6)); AMethodDecl method = new AMethodDecl(new APublicVisibilityModifier(), null, null, null, null, null, new ANamedType(new TIdentifier("string"), null), new TIdentifier("Galaxypp_Deobfuscate"), new ArrayList() {stringParam}, methodBlock); //Fix data refferences.. I got tired here. 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"); } } } }
public override void OutASimpleInvokeExp(ASimpleInvokeExp node) { if (currentMethod == null) return; AMethodDecl targetMethod = data.SimpleMethodLinks[node]; if (node.Parent() is APointerLvalue || node.Parent() is AStructLvalue) { //Move node out MoveOut(node, targetMethod.GetReturnType()); } //Only if it is not a library method if (Util.HasAncestor<AAProgram>(node)) { if (!dependancies[currentMethod].Contains(targetMethod)) dependancies[currentMethod].Add(targetMethod); } }
public override void CaseASimpleInvokeExp(ASimpleInvokeExp node) { IsConst = false; }