AS3: local registers and parameters take names from debug informations

This commit is contained in:
Jindra Pet��k
2011-07-12 17:56:51 +02:00
parent b560b92e46
commit 6106a6e6ca
12 changed files with 85 additions and 25 deletions
+9 -5
View File
@@ -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);
@@ -650,6 +650,19 @@ public class AVM2Code {
private int toSourceCount = 0;
public HashMap<Integer,String> getLocalRegNamesFromDebug(ABC abc){
HashMap<Integer,String> localRegNames= new HashMap<Integer,String>();
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<Integer, TreeItem> localRegs, Stack<TreeItem> stack, Stack<TreeItem> 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<String> loopStack = new Stack<String>();
@@ -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));
}
}
@@ -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 {
@@ -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);
}
}
@@ -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) {
@@ -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<Integer,String> 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<Integer,String> 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();
}
@@ -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<Integer,String> localRegNames=new HashMap<Integer,String>();
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;
}
@@ -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);
}
@@ -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);
}
@@ -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);
@@ -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;
}