diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index bb1f2a949..41e13c7fc 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -597,11 +597,15 @@ public class ABC { } } } - String constructorParams = method_info[instance_info[i].iinit_index].getParamStr(constants); + String constructorParams = ""; + String bodyStr = ""; int bodyIndex = findBodyIndex(instance_info[i].iinit_index); if (bodyIndex != -1) { bodyStr = addTabs(bodies[bodyIndex].toString(pcode,false, i, this, constants, method_info, highlight), 3); + constructorParams=method_info[instance_info[i].iinit_index].getParamStr(constants,bodies[bodyIndex],this); + }else{ + constructorParams=method_info[instance_info[i].iinit_index].getParamStr(constants,null,this); } String toPrint = IDENT_STRING + IDENT_STRING + modifier + "function " + constants.constant_multiname[instance_info[i].name_index].getName(constants) + "(" + constructorParams + ") {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; if (highlight) { @@ -621,12 +625,12 @@ public class ABC { if (bodyIndex != -1) { bodyStr = addTabs(bodies[bodyIndex].toString(pcode,true, i, this, constants, method_info, highlight), 3); } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info, true) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; + toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info, this,true) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; } if (t instanceof TraitSlotConst) { TraitSlotConst ts = (TraitSlotConst) t; - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, true) + ";"; + toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this,true) + ";"; } if (highlight) { toPrint = Highlighting.hilighTrait(toPrint, ti); @@ -640,7 +644,7 @@ public class ABC { String toPrint = ""; if (t instanceof TraitSlotConst) { TraitSlotConst ts = (TraitSlotConst) t; - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, false) + ";"; + toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this,false) + ";"; } if (t instanceof TraitMethodGetterSetter) { @@ -650,7 +654,7 @@ public class ABC { if (bodyIndex != -1) { bodyStr = addTabs(bodies[bodyIndex].toString(pcode,false, i, this, constants, method_info, highlight), 3); } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info, false) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; + toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info,this, false) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; } if (highlight) { toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + ti); diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java index 5ab515d93..9a3124845 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java @@ -650,6 +650,19 @@ public class AVM2Code { private int toSourceCount = 0; +public HashMap getLocalRegNamesFromDebug(ABC abc){ + HashMap localRegNames= new HashMap(); + for(AVM2Instruction ins:code) + { + if (ins.definition instanceof DebugIns) { + if(ins.operands[0]==1){ + localRegNames.put(ins.operands[2]+1, abc.constants.constant_string[ins.operands[1]]); + } + } + } + return localRegNames; + } + private ConvertOutput toSource(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, Stack scopeStack, ABC abc, ConstantPool constants, MethodInfo method_info[], MethodBody body, int start, int end) throws ConvertException { boolean debugMode = false; if (debugMode) @@ -1369,7 +1382,7 @@ public class AVM2Code { String sub = ""; int level = 0; for (int t = 0; t < body.traits.traits.length; t++) { - sub += body.traits.traits[t].convert(constants, method_info) + ";\r\n"; + sub += body.traits.traits[t].convert(constants, method_info,abc) + ";\r\n"; } try { Stack loopStack = new Stack(); diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java index ddd02a7e4..864a6c0d0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewFunctionIns.java @@ -45,6 +45,6 @@ public class NewFunctionIns extends InstructionDefinition { if (mybody != null) { bodyStr = mybody.toString(false,isStatic, classIndex, abc, constants, method_info, false); } - stack.push(new NewFunctionTreeItem(ins, method_info[methodIndex].getParamStr(constants), method_info[methodIndex].getReturnTypeStr(constants), bodyStr)); + stack.push(new NewFunctionTreeItem(ins, method_info[methodIndex].getParamStr(constants,body,abc), method_info[methodIndex].getReturnTypeStr(constants), bodyStr)); } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java index 7185dfb65..5fdd71f22 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java @@ -45,9 +45,9 @@ public class TraitsListModel implements ListModel { public Object getElementAt(int index) { if (index < abc.class_info[classIndex].static_traits.traits.length) { - return abc.class_info[classIndex].static_traits.traits[index].convert(abc.constants, abc.method_info, true); + return abc.class_info[classIndex].static_traits.traits[index].convert(abc.constants, abc.method_info, abc,true); } else if (index < abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { - return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convert(abc.constants, abc.method_info, false); + return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convert(abc.constants, abc.method_info, abc,false); } else if (index == abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { return STR_INSTANCE_INITIALIZER; } else { diff --git a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java index a74fd1fd2..93dc4663a 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.types.traits.Traits; @@ -37,7 +38,7 @@ public class ClassInfo { return "method_index=" + cinit_index + "\r\n" + static_traits.toString(constants); } - public String getStaticVarsStr(ConstantPool constants) { - return static_traits.convert(constants, "\tstatic "); + public String getStaticVarsStr(ConstantPool constants,ABC abc) { + return static_traits.convert(constants, "\tstatic ",abc); } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java index d1b9d90ee..fc7711a5a 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.types.traits.Traits; import com.jpexs.asdec.helpers.Helper; @@ -73,8 +74,8 @@ public class InstanceInfo { return modifiers + objType + constants.constant_multiname[name_index].getName(constants) + supIndexStr; } - public String getInstanceVarsStr(ConstantPool constants) { - return instance_traits.convert(constants, "\t"); + public String getInstanceVarsStr(ConstantPool constants,ABC abc) { + return instance_traits.convert(constants, "\t",abc); } public Multiname getName(ConstantPool constants) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java index 1256e270c..62edf60ed 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java @@ -24,6 +24,7 @@ import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; import com.jpexs.asdec.abc.types.traits.Traits; +import java.util.HashMap; public class MethodBody implements Cloneable { @@ -46,6 +47,14 @@ public class MethodBody implements Cloneable { return s; } + private String replaceDebugRegNames(String code,HashMap debugRegNames) + { + for(Integer key:debugRegNames.keySet()) + { + code = code.replace(InstructionDefinition.localRegName(key), debugRegNames.get(key)); + } + return code; + } private String replaceParams(String code, ABC abc) { for (int i = 1; i <= abc.method_info[this.method_info].param_types.length; i++) { String paramName="param"+i; @@ -74,8 +83,14 @@ public class MethodBody implements Cloneable { s+=code.toASMSource(constants, this); }else{ try { + HashMap localRegNames=code.getLocalRegNamesFromDebug(abc); s += code.toSource(isStatic, classIndex, abc, constants, method_info, this, hilight); - s = replaceParams(s, abc); + if(!localRegNames.isEmpty()) + { + s=replaceDebugRegNames(s,localRegNames); + }else{ + s = replaceParams(s, abc); + } } catch (Exception ex) { s = "//error:" + ex.toString(); } diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java b/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java index 1c6b48202..cc25ae2bd 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java @@ -19,8 +19,10 @@ package com.jpexs.asdec.abc.types; import com.jpexs.asdec.Main; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.helpers.Helper; +import java.util.HashMap; public class MethodInfo { @@ -173,13 +175,21 @@ public class MethodInfo { return constants.constant_string[name_index]; } - public String getParamStr(ConstantPool constants) { + public String getParamStr(ConstantPool constants,MethodBody body,ABC abc) { + HashMap localRegNames=new HashMap(); + if(body!=null) + { + localRegNames=body.code.getLocalRegNamesFromDebug(abc); + } String paramStr = ""; for (int i = 0; i < param_types.length; i++) { if (i > 0) { paramStr += ", "; } - if ((paramNames.length > i) && (paramNames[i] != 0) && Main.PARAM_NAMES_ENABLE) { + if(!localRegNames.isEmpty()) + { + paramStr+=localRegNames.get(i+1); + }else if ((paramNames.length > i) && (paramNames[i] != 0) && Main.PARAM_NAMES_ENABLE) { paramStr += constants.constant_string[paramNames[i]]; } else { paramStr += "param" + (i + 1); @@ -197,7 +207,14 @@ public class MethodInfo { } } if(flagNeed_rest()){ - paramStr+=", ... rest"; + paramStr+=", ... "; + if(!localRegNames.isEmpty()) + { + paramStr+=localRegNames.get(param_types.length+1); + }else{ + paramStr+="rest"; + } + } return paramStr; } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java index 92036495b..7fa17db61 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java @@ -18,7 +18,9 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.types.MethodBody; import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.abc.types.Multiname; import com.jpexs.asdec.abc.types.Namespace; @@ -77,11 +79,11 @@ public class Trait { return constants.constant_multiname[name_index].toString(constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } - public String convert(ConstantPool constants, MethodInfo[] methodInfo) { - return convert(constants, methodInfo, false); + public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc) { + return convert(constants, methodInfo, abc,false); } - public String convert(ConstantPool constants, MethodInfo[] methodInfo, boolean isStatic) { + public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc,boolean isStatic) { return constants.constant_multiname[name_index].toString(constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java index ecdcf161c..54b407689 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java @@ -18,7 +18,9 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.types.MethodBody; import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.helpers.Helper; @@ -34,13 +36,14 @@ public class TraitMethodGetterSetter extends Trait { } @Override - public String convert(ConstantPool constants, MethodInfo[] methodInfo, boolean isStatic) { + public String convert(ConstantPool constants, MethodInfo[] methodInfo,ABC abc, boolean isStatic) { String modifier = getModifiers(constants, isStatic) + " "; if (modifier.equals(" ")) modifier = ""; String addKind = ""; if (kindType == TRAIT_GETTER) addKind = "get "; if (kindType == TRAIT_SETTER) addKind = "set "; - return modifier + "function " + addKind + getMethodName(constants) + "(" + methodInfo[method_info].getParamStr(constants) + ") : " + methodInfo[method_info].getReturnTypeStr(constants); + MethodBody body=abc.findBody(method_info); + return modifier + "function " + addKind + getMethodName(constants) + "(" + methodInfo[method_info].getParamStr(constants,body,abc) + ") : " + methodInfo[method_info].getReturnTypeStr(constants); } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java index 630e1723f..a970c3b0d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java @@ -18,8 +18,10 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; +import com.jpexs.asdec.abc.types.MethodBody; import com.jpexs.asdec.abc.types.MethodInfo; import com.jpexs.asdec.abc.types.ValueKind; import com.jpexs.asdec.helpers.Helper; @@ -66,7 +68,7 @@ public class TraitSlotConst extends Trait { } @Override - public String convert(ConstantPool constants, MethodInfo[] methodInfo, boolean isStatic) { + public String convert(ConstantPool constants, MethodInfo[] methodInfo,ABC abc, boolean isStatic) { String modifier = getModifiers(constants, isStatic) + " "; if (modifier.equals(" ")) modifier = ""; return modifier + getNameValueStr(constants); diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java index d102695f3..2f53c116d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java @@ -18,7 +18,9 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.types.MethodBody; public class Traits { @@ -44,11 +46,11 @@ public class Traits { return s; } - public String convert(ConstantPool constants, String prefix) { + public String convert(ConstantPool constants, String prefix,ABC abc) { String s = ""; for (int t = 0; t < traits.length; t++) { if (t > 0) s += "\r\n"; - s += prefix + traits[t].convert(constants, null); + s += prefix + traits[t].convert(constants, null,abc); } return s; }