diff --git a/trunk/src/com/jpexs/asdec/SWFInputStream.java b/trunk/src/com/jpexs/asdec/SWFInputStream.java index 063bd6a8f..4f2d9e1f5 100644 --- a/trunk/src/com/jpexs/asdec/SWFInputStream.java +++ b/trunk/src/com/jpexs/asdec/SWFInputStream.java @@ -342,20 +342,12 @@ public class SWFInputStream extends InputStream { * @throws IOException */ public long readSB(int nBits) throws IOException { - long uval = readUB(nBits); + int uval = (int)readUB(nBits); - if ((uval & (1 << (nBits - 1))) > 0) uval |= (0xffffffff << nBits); + int shift = 32-nBits; + // sign extension + uval = (uval << shift) >> shift; return uval; - /*int sign = (int) (uval >> (nBits - 1)); - if (sign == 1) { - long mask = 0; - for (int k = 0; k < nBits; k++) { - mask = mask + (1 << k); - } - return -(((~uval) & mask) + 1); - } else { - return uval; - } */ } @@ -728,8 +720,8 @@ public class SWFInputStream extends InputStream { } int NTranslateBits = (int) readUB(5); ret.translateNBits = NTranslateBits; - ret.translateX = readSB(NTranslateBits); - ret.translateY = readSB(NTranslateBits); + ret.translateX = (int)readSB(NTranslateBits); + ret.translateY = (int)readSB(NTranslateBits); alignByte(); return ret; } diff --git a/trunk/src/com/jpexs/asdec/SWFOutputStream.java b/trunk/src/com/jpexs/asdec/SWFOutputStream.java index 71225298e..7c67899dc 100644 --- a/trunk/src/com/jpexs/asdec/SWFOutputStream.java +++ b/trunk/src/com/jpexs/asdec/SWFOutputStream.java @@ -369,27 +369,40 @@ public class SWFOutputStream extends OutputStream { write(data); } + + /** + * Get needed bits + * @param number + * @param bits 1 for signed,0 if unsigned + * @return + */ + public static int getNeededBits(int number, int bits) + { + number=Math.abs(number); + int val = 1; + for (int x = 1; val <= number && !(bits > 32); x <<= 1) + { + val = val | x; + bits++; + } + + if (bits > 32) + { + assert false : ("minBits " + bits + " must not exceed 32"); + } + return bits; + } + + /** * Calculates number of bits needed for representing unsigned value * * @param v Unsigned value * @return Number of bits */ - public static int getNeededBitsU(long v) { + public static int getNeededBitsU(int v) { - int n = 32; - long m = 0x80000000; - if (v == 0x00000000) n = 0; - else - while (!((v & m) > 0)) { - n--; - m >>= 1; - } - return n; - /*if (value == 0) { - return 1; - } - return Long.toBinaryString(value).length();*/ + return getNeededBits(v,0); } /** @@ -398,42 +411,8 @@ public class SWFOutputStream extends OutputStream { * @param v Signed value * @return Number of bits */ - public static int getNeededBitsS(long v) { - int n = 33; - long m = 0x80000000; - if ((v & m) == m) { - if (v == 0xffffffff) n = 1; - else - while ((v & m) == m) { - n--; - m >>= 1; - } - } else { - if (v == 0x00000000) n = 1; - else - while ((v & m) == 0) { - n--; - m >>= 1; - } - } - return n; - /*if (value == 0) { - return 1; - } - if (value == -1) { - return 2; - } - if (value < 0) { - String str = Long.toBinaryString(value); - for (int i = 0; i < str.length(); i++) { - if (str.charAt(i) == '0') { - return str.length() - 1 - i + 2; - } - } - return 1; - } else { - return Long.toBinaryString(value).length() + 1; - } */ + public static int getNeededBitsS(int v) { + return getNeededBits(v,1); } @@ -455,17 +434,17 @@ public class SWFOutputStream extends OutputStream { */ public static int getNeededBitsF(double value) { if (value == -1) return 18; - long val = (long) (value * (1 << 16)); + int val = (int) (value * (1 << 16)); return getNeededBitsS(val); } - private int enlargeBitCountU(int currentBitCount, long value) { + private int enlargeBitCountU(int currentBitCount, int value) { int neededNew = getNeededBitsU(value); if (neededNew > currentBitCount) return neededNew; return currentBitCount; } - private int enlargeBitCountS(int currentBitCount, long value) { + private int enlargeBitCountS(int currentBitCount, int value) { int neededNew = getNeededBitsS(value); if (neededNew > currentBitCount) return neededNew; return currentBitCount; @@ -545,7 +524,7 @@ public class SWFOutputStream extends OutputStream { writeSB(Nbits, value.greenMultTerm); writeSB(Nbits, value.blueMultTerm); writeSB(Nbits, value.alphaMultTerm); - } + } if (value.hasAddTerms) { writeSB(Nbits, value.redAddTerm); writeSB(Nbits, value.greenAddTerm); diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index 30ccaccc3..420d3c230 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -15,7 +15,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - package com.jpexs.asdec.abc; import com.jpexs.asdec.Main; @@ -39,862 +38,855 @@ import javax.swing.JOptionPane; public class ABC { - public int major_version = 0; - public int minor_version = 0; - public ConstantPool constants; - public MethodInfo method_info[]; - public MetadataInfo metadata_info[]; - public InstanceInfo instance_info[]; - public ClassInfo class_info[]; - public ScriptInfo script_info[]; - public MethodBody bodies[]; - public long stringOffsets[]; - public static String IDENT_STRING = " "; - - public static final int MINORwithDECIMAL = 17; - - private int fixNamesStrategy=0; - private final int STRATEGY_FIX_NAMES=1; - private final int STRATEGY_IGNORE=2; - - private void fixNameWithStrategy(int index){ - if(fixNamesStrategy==0){ - if(!isValidName(index,false)){ - int val=JOptionPane.showOptionDialog(null, "Decompiler found unusual name '"+constants.constant_string[index]+"' for a variable/class which can cause problems when decompiling.\r\nDo you want the decompiler to fix it?", "Decompilation", 0, JOptionPane.INFORMATION_MESSAGE, null, new String[]{"Yes","Yes to all","No","No to all"}, "Yes to all"); - if(val==JOptionPane.CLOSED_OPTION){ - val=2; //NO - } - if((val==0)||(val==1)) //YES,YES TO ALL - { - isValidName(index,true); - } - if(val==1) //YES TO ALL - { - fixNamesStrategy=STRATEGY_FIX_NAMES; - } - if(val==3){ //NO TO ALL - fixNamesStrategy=STRATEGY_IGNORE; - } - } - }else - if(fixNamesStrategy==STRATEGY_FIX_NAMES) - { - isValidName(index,true); - }else if(fixNamesStrategy==STRATEGY_IGNORE){ + public int major_version = 0; + public int minor_version = 0; + public ConstantPool constants; + public MethodInfo method_info[]; + public MetadataInfo metadata_info[]; + public InstanceInfo instance_info[]; + public ClassInfo class_info[]; + public ScriptInfo script_info[]; + public MethodBody bodies[]; + public long stringOffsets[]; + public static String IDENT_STRING = " "; + public static final int MINORwithDECIMAL = 17; + private int fixNamesStrategy = 0; + private final int STRATEGY_FIX_NAMES = 1; + private final int STRATEGY_IGNORE = 2; + public static final boolean AUTOINIT_STATIC_VARIABLES = false; + private void fixNameWithStrategy(int index) { + if (fixNamesStrategy == 0) { + if (!isValidName(index, false)) { + int val = JOptionPane.showOptionDialog(null, "Decompiler found unusual name '" + constants.constant_string[index] + "' for a variable/class which can cause problems when decompiling.\r\nDo you want the decompiler to fix it?", "Decompilation", 0, JOptionPane.INFORMATION_MESSAGE, null, new String[]{"Yes", "Yes to all", "No", "No to all"}, "Yes to all"); + if (val == JOptionPane.CLOSED_OPTION) { + val = 2; //NO } - } + if ((val == 0) || (val == 1)) //YES,YES TO ALL + { + isValidName(index, true); + } + if (val == 1) //YES TO ALL + { + fixNamesStrategy = STRATEGY_FIX_NAMES; + } + if (val == 3) { //NO TO ALL + fixNamesStrategy = STRATEGY_IGNORE; + } + } + } else if (fixNamesStrategy == STRATEGY_FIX_NAMES) { + isValidName(index, true); + } else if (fixNamesStrategy == STRATEGY_IGNORE) { + } + } public ABC(InputStream is) throws IOException { - ABCInputStream ais = new ABCInputStream(is); - minor_version = ais.readU16(); - major_version = ais.readU16(); - constants = new ConstantPool(); - //constant integers - int constant_int_pool_count = ais.readU30(); - constants.constant_int = new long[constant_int_pool_count]; - for (int i = 1; i < constant_int_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_int[i] = ais.readS32(); - } + ABCInputStream ais = new ABCInputStream(is); + minor_version = ais.readU16(); + major_version = ais.readU16(); + constants = new ConstantPool(); + //constant integers + int constant_int_pool_count = ais.readU30(); + constants.constant_int = new long[constant_int_pool_count]; + for (int i = 1; i < constant_int_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_int[i] = ais.readS32(); + } - //constant unsigned integers - int constant_uint_pool_count = ais.readU30(); - constants.constant_uint = new long[constant_uint_pool_count]; - for (int i = 1; i < constant_uint_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_uint[i] = ais.readU32(); - } + //constant unsigned integers + int constant_uint_pool_count = ais.readU30(); + constants.constant_uint = new long[constant_uint_pool_count]; + for (int i = 1; i < constant_uint_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_uint[i] = ais.readU32(); + } - //constant double - int constant_double_pool_count = ais.readU30(); - constants.constant_double = new double[constant_double_pool_count]; - for (int i = 1; i < constant_double_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_double[i] = ais.readDouble(); - } + //constant double + int constant_double_pool_count = ais.readU30(); + constants.constant_double = new double[constant_double_pool_count]; + for (int i = 1; i < constant_double_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_double[i] = ais.readDouble(); + } - //constant decimal - if(minor_version >= MINORwithDECIMAL) - { - int constant_decimal_pool_count = ais.readU30(); - constants.constant_decimal = new Decimal[constant_decimal_pool_count]; - for (int i = 1; i < constant_decimal_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_decimal[i] = ais.readDecimal(); - } - }else{ - constants.constant_decimal=new Decimal[0]; - } + //constant decimal + if (minor_version >= MINORwithDECIMAL) { + int constant_decimal_pool_count = ais.readU30(); + constants.constant_decimal = new Decimal[constant_decimal_pool_count]; + for (int i = 1; i < constant_decimal_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_decimal[i] = ais.readDecimal(); + } + } else { + constants.constant_decimal = new Decimal[0]; + } - //constant string - int constant_string_pool_count = ais.readU30(); - constants.constant_string = new String[constant_string_pool_count]; - stringOffsets = new long[constant_string_pool_count]; - constants.constant_string[0] = ""; - for (int i = 1; i < constant_string_pool_count; i++) { //index 0 not used. Values 1..n-1 - long pos = ais.getPosition(); - constants.constant_string[i] = ais.readString(); - stringOffsets[i] = pos; - } + //constant string + int constant_string_pool_count = ais.readU30(); + constants.constant_string = new String[constant_string_pool_count]; + stringOffsets = new long[constant_string_pool_count]; + constants.constant_string[0] = ""; + for (int i = 1; i < constant_string_pool_count; i++) { //index 0 not used. Values 1..n-1 + long pos = ais.getPosition(); + constants.constant_string[i] = ais.readString(); + stringOffsets[i] = pos; + } - //constant namespace - int constant_namespace_pool_count = ais.readU30(); - constants.constant_namespace = new Namespace[constant_namespace_pool_count]; - for (int i = 1; i < constant_namespace_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_namespace[i] = ais.readNamespace(); - fixNameWithStrategy(constants.constant_namespace[i].name_index); - } + //constant namespace + int constant_namespace_pool_count = ais.readU30(); + constants.constant_namespace = new Namespace[constant_namespace_pool_count]; + for (int i = 1; i < constant_namespace_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_namespace[i] = ais.readNamespace(); + fixNameWithStrategy(constants.constant_namespace[i].name_index); + } - //constant namespace set - int constant_namespace_set_pool_count = ais.readU30(); - constants.constant_namespace_set = new NamespaceSet[constant_namespace_set_pool_count]; - for (int i = 1; i < constant_namespace_set_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_namespace_set[i] = new NamespaceSet(); - int namespace_count = ais.readU30(); - constants.constant_namespace_set[i].namespaces = new int[namespace_count]; - for (int j = 0; j < namespace_count; j++) { - constants.constant_namespace_set[i].namespaces[j] = ais.readU30(); - } - } + //constant namespace set + int constant_namespace_set_pool_count = ais.readU30(); + constants.constant_namespace_set = new NamespaceSet[constant_namespace_set_pool_count]; + for (int i = 1; i < constant_namespace_set_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_namespace_set[i] = new NamespaceSet(); + int namespace_count = ais.readU30(); + constants.constant_namespace_set[i].namespaces = new int[namespace_count]; + for (int j = 0; j < namespace_count; j++) { + constants.constant_namespace_set[i].namespaces[j] = ais.readU30(); + } + } - - - //constant multiname - int constant_multiname_pool_count = ais.readU30(); - //System.out.println("Reading "+constant_multiname_pool_count+" multinames"); - constants.constant_multiname = new Multiname[constant_multiname_pool_count]; - for (int i = 1; i < constant_multiname_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_multiname[i] = ais.readMultiname(); - fixNameWithStrategy(constants.constant_multiname[i].name_index); - } - //method info - int methods_count = ais.readU30(); - method_info = new MethodInfo[methods_count]; - for (int i = 0; i < methods_count; i++) { //index 0 not used. Values 1..n-1 - method_info[i] = ais.readMethodInfo(); - } - - //metadata info - int metadata_count = ais.readU30(); - metadata_info = new MetadataInfo[metadata_count]; - for (int i = 0; i < metadata_count; i++) { //index 0 not used. Values 1..n-1 - int name_index = ais.readU30(); - int values_count = ais.readU30(); - int keys[] = new int[values_count]; - for (int v = 0; v < values_count; v++) { - keys[v] = ais.readU30(); - } - int values[] = new int[values_count]; - for (int v = 0; v < values_count; v++) { - values[v] = ais.readU30(); - } - metadata_info[i] = new MetadataInfo(name_index, keys, values); - } - - int class_count = ais.readU30(); - instance_info = new InstanceInfo[class_count]; - for (int i = 0; i < class_count; i++) { - instance_info[i] = ais.readInstanceInfo(); - } - class_info = new ClassInfo[class_count]; - for (int i = 0; i < class_count; i++) { - class_info[i] = new ClassInfo(); - class_info[i].cinit_index = ais.readU30(); - class_info[i].static_traits = ais.readTraits(); - } - int script_count = ais.readU30(); - script_info = new ScriptInfo[script_count]; - for (int i = 0; i < script_count; i++) { - script_info[i] = new ScriptInfo(); - script_info[i].init_index = ais.readU30(); - script_info[i].traits = ais.readTraits(); - } - - int bodies_count = ais.readU30(); - bodies = new MethodBody[bodies_count]; - for (int i = 0; i < bodies_count; i++) { - bodies[i] = new MethodBody(); - bodies[i].method_info = ais.readU30(); - bodies[i].max_stack = ais.readU30(); - bodies[i].max_regs = ais.readU30(); - bodies[i].init_scope_depth = ais.readU30(); - bodies[i].max_scope_depth = ais.readU30(); - int code_length = ais.readU30(); - bodies[i].codeBytes = new byte[code_length]; - for (int j = 0; j < code_length; j++) { - bodies[i].codeBytes[j] = (byte) ais.read(); - } - try { - bodies[i].code = new AVM2Code(new ByteArrayInputStream(bodies[i].codeBytes)); - } catch (UnknownInstructionCode re) { - bodies[i].code = new AVM2Code(); - System.err.println(re.toString()); - } - int ex_count = ais.readU30(); - bodies[i].exceptions = new ABCException[ex_count]; - for (int j = 0; j < ex_count; j++) { - bodies[i].exceptions[j] = new ABCException(); - bodies[i].exceptions[j].start = ais.readU30(); - bodies[i].exceptions[j].end = ais.readU30(); - bodies[i].exceptions[j].target = ais.readU30(); - bodies[i].exceptions[j].type_index = ais.readU30(); - bodies[i].exceptions[j].name_index = ais.readU30(); - } - bodies[i].traits = ais.readTraits(); - /*try { - bodies[i].code.clearCode(constants, bodies[i]); - } catch (ConvertException ignored) { - } */ - } - } - - public void saveToStream(OutputStream os) throws IOException { - ABCOutputStream aos = new ABCOutputStream(os); - aos.writeU16(minor_version); - aos.writeU16(major_version); - - aos.writeU30(constants.constant_int.length); - for (int i = 1; i < constants.constant_int.length; i++) { - aos.writeS32(constants.constant_int[i]); - } - aos.writeU30(constants.constant_uint.length); - for (int i = 1; i < constants.constant_uint.length; i++) { - aos.writeU32(constants.constant_uint[i]); - } - - aos.writeU30(constants.constant_double.length); - for (int i = 1; i < constants.constant_double.length; i++) { - aos.writeDouble(constants.constant_double[i]); - } - - if(minor_version>=MINORwithDECIMAL){ - aos.writeU30(constants.constant_decimal.length); - for (int i = 1; i < constants.constant_decimal.length; i++) { - aos.writeDecimal(constants.constant_decimal[i]); - } - } - - aos.writeU30(constants.constant_string.length); - for (int i = 1; i < constants.constant_string.length; i++) { - aos.writeString(constants.constant_string[i]); - } - - aos.writeU30(constants.constant_namespace.length); - for (int i = 1; i < constants.constant_namespace.length; i++) { - aos.writeNamespace(constants.constant_namespace[i]); - } - - aos.writeU30(constants.constant_namespace_set.length); - for (int i = 1; i < constants.constant_namespace_set.length; i++) { - aos.writeU30(constants.constant_namespace_set[i].namespaces.length); - for (int j = 0; j < constants.constant_namespace_set[i].namespaces.length; j++) { - aos.writeU30(constants.constant_namespace_set[i].namespaces[j]); - } - } - - aos.writeU30(constants.constant_multiname.length); - //System.out.println("Writing "+constants.constant_multiname.length+" multinames"); - for (int i = 1; i < constants.constant_multiname.length; i++) { - aos.writeMultiname(constants.constant_multiname[i]); - } - - aos.writeU30(method_info.length); - for (int i = 0; i < method_info.length; i++) { - aos.writeMethodInfo(method_info[i]); - } - - aos.writeU30(metadata_info.length); - for (int i = 0; i < metadata_info.length; i++) { - aos.writeU30(metadata_info[i].name_index); - aos.writeU30(metadata_info[i].values.length); - for (int j = 0; j < metadata_info[i].values.length; j++) { - aos.writeU30(metadata_info[i].keys[j]); - } - for (int j = 0; j < metadata_info[i].values.length; j++) { - aos.writeU30(metadata_info[i].values[j]); - } - } - - aos.writeU30(class_info.length); - for (int i = 0; i < instance_info.length; i++) { - aos.writeInstanceInfo(instance_info[i]); - } - for (int i = 0; i < class_info.length; i++) { - aos.writeU30(class_info[i].cinit_index); - aos.writeTraits(class_info[i].static_traits); - } - aos.writeU30(script_info.length); - for (int i = 0; i < script_info.length; i++) { - aos.writeU30(script_info[i].init_index); - aos.writeTraits(script_info[i].traits); - } - - aos.writeU30(bodies.length); - for (int i = 0; i < bodies.length; i++) { - aos.writeU30(bodies[i].method_info); - aos.writeU30(bodies[i].max_stack); - aos.writeU30(bodies[i].max_regs); - aos.writeU30(bodies[i].init_scope_depth); - aos.writeU30(bodies[i].max_scope_depth); - byte codeBytes[] = bodies[i].code.getBytes(); - aos.writeU30(codeBytes.length); - try { - aos.write(codeBytes); - } catch (NotSameException ex) { - System.out.println(bodies[i].code.toString(constants)); - System.exit(0); - return; - } - aos.writeU30(bodies[i].exceptions.length); - for (int j = 0; j < bodies[i].exceptions.length; j++) { - aos.writeU30(bodies[i].exceptions[j].start); - aos.writeU30(bodies[i].exceptions[j].end); - aos.writeU30(bodies[i].exceptions[j].target); - aos.writeU30(bodies[i].exceptions[j].type_index); - aos.writeU30(bodies[i].exceptions[j].name_index); - } - aos.writeTraits(bodies[i].traits); - } - } - - private void parseImportFromMultiname(List imports, Multiname m) { - if (m != null) { - Namespace ns = m.getNamespace(constants); - String name = m.getName(constants); - if (ns != null) { - String newimport = ns.getName(constants); - if (!newimport.equals("")) { - newimport += "." + name; - if (newimport.contains(":")) { - return; - } - if (!imports.contains(newimport)) { - imports.add(newimport); - } - } - } - } - } - - private List getImports(int instanceIndex) { - List imports = new ArrayList(); - - //constructor - - //parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].name_index]); - - if (instance_info[instanceIndex].super_index > 0) { - parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].super_index]); - } - for (int i : instance_info[instanceIndex].interfaces) { - parseImportFromMultiname(imports, constants.constant_multiname[i]); - } - //static - for (Trait t : class_info[instanceIndex].static_traits.traits) { - //parseImportFromMultiname(imports, t.getMultiName(constants)); - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - if (tm.method_info != 0) { - MethodBody body = findBody(tm.method_info); - if (body != null) { - for (AVM2Instruction ins : body.code.code) { - for (int k = 0; k < ins.definition.operands.length; k++) { - if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { - int multinameIndex = ins.operands[k]; - parseImportFromMultiname(imports, constants.constant_multiname[multinameIndex]); - } - } - } - } - for (int p = 0; p < method_info[tm.method_info].param_types.length; p++) { - if (method_info[tm.method_info].param_types[p] != 0) { - parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].param_types[p]]); - } - if (method_info[tm.method_info].ret_type != 0) { - parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].ret_type]); - } - } - } - } - - } - //instance - for (Trait t : instance_info[instanceIndex].instance_traits.traits) { - //parseImportFromMultiname(imports, t.getMultiName(constants)); - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - if (tm.method_info != 0) { - MethodBody body = findBody(tm.method_info); - if (body != null) { - for (AVM2Instruction ins : body.code.code) { - for (int k = 0; k < ins.definition.operands.length; k++) { - if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { - int multinameIndex = ins.operands[k]; - parseImportFromMultiname(imports, constants.constant_multiname[multinameIndex]); - } - } - } - } - for (int p = 0; p < method_info[tm.method_info].param_types.length; p++) { - if (method_info[tm.method_info].param_types[p] != 0) { - parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].param_types[p]]); - } - if (method_info[tm.method_info].ret_type != 0) { - parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].ret_type]); - } - } - } - } - } - return imports; - } - - public MethodBody findBody(int methodInfo) { - int pos = findBodyIndex(methodInfo); - if (pos == -1) { - return null; - } else { - return bodies[pos]; - } - } - - public int findBodyIndex(int methodInfo) { - if (methodInfo == -1) { - return -1; - } - for (int b = 0; b < bodies.length; b++) { - if (bodies[b].method_info == methodInfo) { - return b; - } - } - return -1; - } - - public MethodBody findBodyByClassAndName(String className, String methodName) { - for (int i = 0; i < instance_info.length; i++) { - if (className.equals(constants.constant_multiname[instance_info[i].name_index].getName(constants))) { - for (Trait t : instance_info[i].instance_traits.traits) { - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodName.equals(t2.getMethodName(constants))) { - for (MethodBody body : bodies) { - if (body.method_info == t2.method_info) { - return body; - } - } - } - } - } - //break; - } - } - for (int i = 0; i < class_info.length; i++) { - if (className.equals(constants.constant_multiname[instance_info[i].name_index].getName(constants))) { - for (Trait t : class_info[i].static_traits.traits) { - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; - if (methodName.equals(t2.getMethodName(constants))) { - for (MethodBody body : bodies) { - if (body.method_info == t2.method_info) { - return body; - } - } - } - } - } - //break; - } - } + //constant multiname + int constant_multiname_pool_count = ais.readU30(); + constants.constant_multiname = new Multiname[constant_multiname_pool_count]; + for (int i = 1; i < constant_multiname_pool_count; i++) { //index 0 not used. Values 1..n-1 + constants.constant_multiname[i] = ais.readMultiname(); + fixNameWithStrategy(constants.constant_multiname[i].name_index); + } - return null; - } + //method info + int methods_count = ais.readU30(); + method_info = new MethodInfo[methods_count]; + for (int i = 0; i < methods_count; i++) { + method_info[i] = ais.readMethodInfo(); + } - private String addTabs(String s, int tabs) { - String parts[] = s.split("\r\n"); - if(!s.contains("\r\n")) parts = s.split("\n"); - String ret = ""; - for (int i = 0; i < parts.length; i++) { - for (int t = 0; t < tabs; t++) { - ret += IDENT_STRING; - } - ret += parts[i]; - if (i < parts.length - 1) { - ret += "\r\n"; - } - } - return ret; - } + //metadata info + int metadata_count = ais.readU30(); + metadata_info = new MetadataInfo[metadata_count]; + for (int i = 0; i < metadata_count; i++) { + int name_index = ais.readU30(); + int values_count = ais.readU30(); + int keys[] = new int[values_count]; + for (int v = 0; v < values_count; v++) { + keys[v] = ais.readU30(); + } + int values[] = new int[values_count]; + for (int v = 0; v < values_count; v++) { + values[v] = ais.readU30(); + } + metadata_info[i] = new MetadataInfo(name_index, keys, values); + } - public int findMethodIdByTraitId(int classIndex, int traitId) { - if (traitId < class_info[classIndex].static_traits.traits.length) { - if (class_info[classIndex].static_traits.traits[traitId] instanceof TraitMethodGetterSetter) { - return ((TraitMethodGetterSetter) class_info[classIndex].static_traits.traits[traitId]).method_info; - } else { - return -1; - } - } else if (traitId < class_info[classIndex].static_traits.traits.length + instance_info[classIndex].instance_traits.traits.length) { - traitId -= class_info[classIndex].static_traits.traits.length; - if (instance_info[classIndex].instance_traits.traits[traitId] instanceof TraitMethodGetterSetter) { - return ((TraitMethodGetterSetter) instance_info[classIndex].instance_traits.traits[traitId]).method_info; - } else { - return -1; - } - } else { - traitId -= class_info[classIndex].static_traits.traits.length + instance_info[classIndex].instance_traits.traits.length; - if (traitId == 0) { - return instance_info[classIndex].iinit_index; - } else if (traitId == 1) { - return class_info[classIndex].cinit_index; - } else { - return -1; - } - } - } + int class_count = ais.readU30(); + instance_info = new InstanceInfo[class_count]; + for (int i = 0; i < class_count; i++) { + instance_info[i] = ais.readInstanceInfo(); + } + class_info = new ClassInfo[class_count]; + for (int i = 0; i < class_count; i++) { + class_info[i] = new ClassInfo(); + class_info[i].cinit_index = ais.readU30(); + class_info[i].static_traits = ais.readTraits(); + } + int script_count = ais.readU30(); + script_info = new ScriptInfo[script_count]; + for (int i = 0; i < script_count; i++) { + script_info[i] = new ScriptInfo(); + script_info[i].init_index = ais.readU30(); + script_info[i].traits = ais.readTraits(); + } - public String classToString(int i, boolean highlight,boolean pcode) { - String ret = ""; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream out = new PrintStream(baos); - String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); - out.println("package " + packageName); - out.println("{"); + int bodies_count = ais.readU30(); + bodies = new MethodBody[bodies_count]; + for (int i = 0; i < bodies_count; i++) { + bodies[i] = new MethodBody(); + bodies[i].method_info = ais.readU30(); + bodies[i].max_stack = ais.readU30(); + bodies[i].max_regs = ais.readU30(); + bodies[i].init_scope_depth = ais.readU30(); + bodies[i].max_scope_depth = ais.readU30(); + int code_length = ais.readU30(); + bodies[i].codeBytes = new byte[code_length]; + for (int j = 0; j < code_length; j++) { + bodies[i].codeBytes[j] = (byte) ais.read(); + } + try { + bodies[i].code = new AVM2Code(new ByteArrayInputStream(bodies[i].codeBytes)); + } catch (UnknownInstructionCode re) { + bodies[i].code = new AVM2Code(); + System.err.println(re.toString()); + } + int ex_count = ais.readU30(); + bodies[i].exceptions = new ABCException[ex_count]; + for (int j = 0; j < ex_count; j++) { + bodies[i].exceptions[j] = new ABCException(); + bodies[i].exceptions[j].start = ais.readU30(); + bodies[i].exceptions[j].end = ais.readU30(); + bodies[i].exceptions[j].target = ais.readU30(); + bodies[i].exceptions[j].type_index = ais.readU30(); + bodies[i].exceptions[j].name_index = ais.readU30(); + } + bodies[i].traits = ais.readTraits(); + } + } - //imports - List imports = getImports(i); - for (String imp : imports) { - out.println(IDENT_STRING + "import " + imp + ";"); - } - out.println(); + public void saveToStream(OutputStream os) throws IOException { + ABCOutputStream aos = new ABCOutputStream(os); + aos.writeU16(minor_version); + aos.writeU16(major_version); - //class header - String classHeader = instance_info[i].getClassHeaderStr(constants); - if (classHeader.startsWith("private ")) { - classHeader = "public " + classHeader.substring("private ".length()); - } - out.println(IDENT_STRING + classHeader); - out.println(IDENT_STRING + "{"); + aos.writeU30(constants.constant_int.length); + for (int i = 1; i < constants.constant_int.length; i++) { + aos.writeS32(constants.constant_int[i]); + } + aos.writeU30(constants.constant_uint.length); + for (int i = 1; i < constants.constant_uint.length; i++) { + aos.writeU32(constants.constant_uint[i]); + } + aos.writeU30(constants.constant_double.length); + for (int i = 1; i < constants.constant_double.length; i++) { + aos.writeDouble(constants.constant_double[i]); + } - if (class_info[i].cinit_index != 0) { - int bodyIndex = findBodyIndex(class_info[i].cinit_index); - List initializer = bodies[bodyIndex].code.toTree(true, i, this, constants, method_info, bodies[bodyIndex]); - for (TreeItem ti : initializer) { - if (ti instanceof SetPropertyTreeItem) { - int multinameIndex = ((SetPropertyTreeItem) ti).propertyName.multinameIndex; - TreeItem value = ((SetPropertyTreeItem) ti).value; - for (Trait t : class_info[i].static_traits.traits) { - if (t.name_index == multinameIndex) { - if (t instanceof TraitSlotConst) { - ((TraitSlotConst) t).assignedValue = value; - } - } - } - } - if (ti instanceof InitPropertyTreeItem) { - int multinameIndex = ((InitPropertyTreeItem) ti).propertyName.multinameIndex; - TreeItem value = ((InitPropertyTreeItem) ti).value; - for (Trait t : class_info[i].static_traits.traits) { - if (t.name_index == multinameIndex) { - if (t instanceof TraitSlotConst) { - ((TraitSlotConst) t).assignedValue = value; - } - } - } - } - } - /*String bodyStr = ""; - int bodyIndex = findBodyIndex(class_info[i].cinit_index); - if (bodyIndex != -1) { - bodyStr = addTabs(bodies[bodyIndex].toString(this, constants, method_info, hilight), 3); - } - if (!bodyStr.equals("")) { - String toPrint = IDENT_STRING + IDENT_STRING + "static {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; - if (hilight) { - toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length + 1); - } - out.println(toPrint); - }*/ - } + if (minor_version >= MINORwithDECIMAL) { + aos.writeU30(constants.constant_decimal.length); + for (int i = 1; i < constants.constant_decimal.length; i++) { + aos.writeDecimal(constants.constant_decimal[i]); + } + } - //constructor - if (instance_info[i].iinit_index != 0) { - String modifier = ""; - Multiname m = constants.constant_multiname[instance_info[i].name_index]; - if (m != null) { - Namespace ns = m.getNamespace(constants); - if (ns != null) { - modifier = ns.getPrefix(constants) + " "; - if (modifier.equals(" ")) { - modifier = ""; - } - } - } - String constructorParams = ""; + aos.writeU30(constants.constant_string.length); + for (int i = 1; i < constants.constant_string.length; i++) { + aos.writeString(constants.constant_string[i]); + } - 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) { - toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length); - } - out.println(toPrint); - } + aos.writeU30(constants.constant_namespace.length); + for (int i = 1; i < constants.constant_namespace.length; i++) { + aos.writeNamespace(constants.constant_namespace[i]); + } - //static variables,constants & methods - for (int ti = 0; ti < class_info[i].static_traits.traits.length; ti++) { - Trait t = class_info[i].static_traits.traits[ti]; - String toPrint = ""; - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - String bodyStr = ""; - int bodyIndex = findBodyIndex(tm.method_info); - 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, this,true) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; - } - if (t instanceof TraitSlotConst) { - TraitSlotConst ts = (TraitSlotConst) t; + aos.writeU30(constants.constant_namespace_set.length); + for (int i = 1; i < constants.constant_namespace_set.length; i++) { + aos.writeU30(constants.constant_namespace_set[i].namespaces.length); + for (int j = 0; j < constants.constant_namespace_set[i].namespaces.length; j++) { + aos.writeU30(constants.constant_namespace_set[i].namespaces[j]); + } + } - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this,true) + ";"; - } - if (highlight) { - toPrint = Highlighting.hilighTrait(toPrint, ti); - } else { - toPrint = Highlighting.stripHilights(toPrint); - } - out.println(toPrint); - } - for (int ti = 0; ti < instance_info[i].instance_traits.traits.length; ti++) { - Trait t = instance_info[i].instance_traits.traits[ti]; - String toPrint = ""; - if (t instanceof TraitSlotConst) { - TraitSlotConst ts = (TraitSlotConst) t; - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this,false) + ";"; - } + aos.writeU30(constants.constant_multiname.length); + //System.out.println("Writing "+constants.constant_multiname.length+" multinames"); + for (int i = 1; i < constants.constant_multiname.length; i++) { + aos.writeMultiname(constants.constant_multiname[i]); + } - if (t instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; - String bodyStr = ""; - int bodyIndex = findBodyIndex(tm.method_info); - 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,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); - } else { - toPrint = Highlighting.stripHilights(toPrint); - } - out.println(toPrint); - } + aos.writeU30(method_info.length); + for (int i = 0; i < method_info.length; i++) { + aos.writeMethodInfo(method_info[i]); + } + aos.writeU30(metadata_info.length); + for (int i = 0; i < metadata_info.length; i++) { + aos.writeU30(metadata_info[i].name_index); + aos.writeU30(metadata_info[i].values.length); + for (int j = 0; j < metadata_info[i].values.length; j++) { + aos.writeU30(metadata_info[i].keys[j]); + } + for (int j = 0; j < metadata_info[i].values.length; j++) { + aos.writeU30(metadata_info[i].values[j]); + } + } - out.println(IDENT_STRING + "}");//class - out.println("}");//package - out.flush(); + aos.writeU30(class_info.length); + for (int i = 0; i < instance_info.length; i++) { + aos.writeInstanceInfo(instance_info[i]); + } + for (int i = 0; i < class_info.length; i++) { + aos.writeU30(class_info[i].cinit_index); + aos.writeTraits(class_info[i].static_traits); + } + aos.writeU30(script_info.length); + for (int i = 0; i < script_info.length; i++) { + aos.writeU30(script_info[i].init_index); + aos.writeTraits(script_info[i].traits); + } - return baos.toString(); - } + aos.writeU30(bodies.length); + for (int i = 0; i < bodies.length; i++) { + aos.writeU30(bodies[i].method_info); + aos.writeU30(bodies[i].max_stack); + aos.writeU30(bodies[i].max_regs); + aos.writeU30(bodies[i].init_scope_depth); + aos.writeU30(bodies[i].max_scope_depth); + byte codeBytes[] = bodies[i].code.getBytes(); + aos.writeU30(codeBytes.length); + try { + aos.write(codeBytes); + } catch (NotSameException ex) { + System.out.println(bodies[i].code.toString(constants)); + System.exit(0); + return; + } + aos.writeU30(bodies[i].exceptions.length); + for (int j = 0; j < bodies[i].exceptions.length; j++) { + aos.writeU30(bodies[i].exceptions[j].start); + aos.writeU30(bodies[i].exceptions[j].end); + aos.writeU30(bodies[i].exceptions[j].target); + aos.writeU30(bodies[i].exceptions[j].type_index); + aos.writeU30(bodies[i].exceptions[j].name_index); + } + aos.writeTraits(bodies[i].traits); + } + } - public void export(String directory,boolean pcode) throws IOException { - for (int i = 0; i < instance_info.length; i++) { - String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); - String className = instance_info[i].getName(constants).getName(constants); - Main.startWork("Exporting " + (i + 1) + "/" + instance_info.length + " " + packageName + "." + className + "..."); - File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); - if (!outDir.exists()) { - outDir.mkdirs(); - } - String fileName = outDir.toString() + File.separator + className + ".as"; - FileOutputStream fos = new FileOutputStream(fileName); - fos.write(classToString(i, false,pcode).getBytes()); - fos.close(); - } - - } - - public void dump(OutputStream os) { - PrintStream output = new PrintStream(os); - constants.dump(output); - for (int i = 0; i < method_info.length; i++) { - output.println("MethodInfo[" + i + "]:" + method_info[i].toString(constants)); - } - for (int i = 0; i < metadata_info.length; i++) { - output.println("MetadataInfo[" + i + "]:" + metadata_info[i].toString(constants)); - } - for (int i = 0; i < instance_info.length; i++) { - output.println("InstanceInfo[" + i + "]:" + instance_info[i].toString(constants)); - } - for (int i = 0; i < class_info.length; i++) { - output.println("ClassInfo[" + i + "]:" + class_info[i].toString(constants)); - } - for (int i = 0; i < script_info.length; i++) { - output.println("ScriptInfo[" + i + "]:" + script_info[i].toString(constants)); - } - for (int i = 0; i < bodies.length; i++) { - output.println("MethodBody[" + i + "]:"); //+ bodies[i].toString(this, constants, method_info)); - } - } - public static final String[] reservedWords = { - "as", "break", "case", "catch", "class", "const", "continue", "default","delete", "do", "each", "else", - "extends", "false", "finally", "for", "function", "if", "implements", "import", "in", "instanceof", - "interface", "internal", "is", "native", "new", "null", "package", "private", "protected", "public", - "return", "super", "switch", "this", "throw", "true", "try", "typeof", "use", "var", /*"void",*/ "while", - "with","dynamic","default","final","in"}; - public int unknownCount = 0; - - - public boolean isValidName(int index,boolean autoFix) { - if (index <= 0) { - return true; - } - String s = constants.constant_string[index]; - boolean isValid = true; - boolean isReserved = false; - for (String rw : reservedWords) { - if (rw.equals(s.trim())) { - isValid = false; - isReserved = true; - break; - } - } - if (isValid) { - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) > 127) { - isValid = false; - break; - } - } - } - - if (!isValid) { - if(autoFix) - { - if (isReserved) { - constants.constant_string[index] = "name_" + s.replace(" ", "_"); - } else { - unknownCount++; - constants.constant_string[index] = "_name" + unknownCount; + private void parseImportFromMultiname(List imports, Multiname m) { + if (m != null) { + Namespace ns = m.getNamespace(constants); + String name = m.getName(constants); + if (ns != null) { + String newimport = ns.getName(constants); + if (!newimport.equals("")) { + newimport += "." + name; + if (newimport.contains(":")) { + return; + } + if (!imports.contains(newimport)) { + imports.add(newimport); } } - } - return isValid; - } + } + } + } - public List findMultinameUsage(int multinameIndex) { - List ret = new ArrayList(); - List bodyIndices = new ArrayList(); - List subTraitBodyIndices = new ArrayList(); - List subTraitIndexIndices = new ArrayList(); - for (int i = 0; i < bodies.length; i++) { - for(int t=0;t imports = new ArrayList(); + + //constructor + + //parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].name_index]); + + if (instance_info[instanceIndex].super_index > 0) { + parseImportFromMultiname(imports, constants.constant_multiname[instance_info[instanceIndex].super_index]); + } + for (int i : instance_info[instanceIndex].interfaces) { + parseImportFromMultiname(imports, constants.constant_multiname[i]); + } + //static + for (Trait t : class_info[instanceIndex].static_traits.traits) { + //parseImportFromMultiname(imports, t.getMultiName(constants)); + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + if (tm.method_info != 0) { + MethodBody body = findBody(tm.method_info); + if (body != null) { + for (AVM2Instruction ins : body.code.code) { + for (int k = 0; k < ins.definition.operands.length; k++) { + if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { + int multinameIndex = ins.operands[k]; + parseImportFromMultiname(imports, constants.constant_multiname[multinameIndex]); } - } - } + } + } + } + for (int p = 0; p < method_info[tm.method_info].param_types.length; p++) { + if (method_info[tm.method_info].param_types[p] != 0) { + parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].param_types[p]]); + } + if (method_info[tm.method_info].ret_type != 0) { + parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].ret_type]); + } + } } - } + } + + } + //instance + for (Trait t : instance_info[instanceIndex].instance_traits.traits) { + //parseImportFromMultiname(imports, t.getMultiName(constants)); + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + if (tm.method_info != 0) { + MethodBody body = findBody(tm.method_info); + if (body != null) { + for (AVM2Instruction ins : body.code.code) { + for (int k = 0; k < ins.definition.operands.length; k++) { + if (ins.definition.operands[k] == AVM2Code.DAT_MULTINAME_INDEX) { + int multinameIndex = ins.operands[k]; + parseImportFromMultiname(imports, constants.constant_multiname[multinameIndex]); + } + } + } + } + for (int p = 0; p < method_info[tm.method_info].param_types.length; p++) { + if (method_info[tm.method_info].param_types[p] != 0) { + parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].param_types[p]]); + } + if (method_info[tm.method_info].ret_type != 0) { + parseImportFromMultiname(imports, constants.constant_multiname[method_info[tm.method_info].ret_type]); + } + } + } + } + } + return imports; + } + + public MethodBody findBody(int methodInfo) { + int pos = findBodyIndex(methodInfo); + if (pos == -1) { + return null; + } else { + return bodies[pos]; + } + } + + public int findBodyIndex(int methodInfo) { + if (methodInfo == -1) { + return -1; + } + for (int b = 0; b < bodies.length; b++) { + if (bodies[b].method_info == methodInfo) { + return b; + } + } + return -1; + } + + public MethodBody findBodyByClassAndName(String className, String methodName) { + for (int i = 0; i < instance_info.length; i++) { + if (className.equals(constants.constant_multiname[instance_info[i].name_index].getName(constants))) { + for (Trait t : instance_info[i].instance_traits.traits) { + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; + if (methodName.equals(t2.getMethodName(constants))) { + for (MethodBody body : bodies) { + if (body.method_info == t2.method_info) { + return body; + } + } + } + } + } + //break; + } + } + for (int i = 0; i < class_info.length; i++) { + if (className.equals(constants.constant_multiname[instance_info[i].name_index].getName(constants))) { + for (Trait t : class_info[i].static_traits.traits) { + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter t2 = (TraitMethodGetterSetter) t; + if (methodName.equals(t2.getMethodName(constants))) { + for (MethodBody body : bodies) { + if (body.method_info == t2.method_info) { + return body; + } + } + } + } + } + //break; + } + } - for (int c = 0; c < class_info.length; c++) { - if(instance_info[c].name_index==multinameIndex){ - ret.add(new Usage(this,-1, c, -1,-1, false, Usage.TYPE_CLASS_NAME)); + return null; + } + + private String addTabs(String s, int tabs) { + String parts[] = s.split("\r\n"); + if (!s.contains("\r\n")) { + parts = s.split("\n"); + } + String ret = ""; + for (int i = 0; i < parts.length; i++) { + for (int t = 0; t < tabs; t++) { + ret += IDENT_STRING; + } + ret += parts[i]; + if (i < parts.length - 1) { + ret += "\r\n"; + } + } + return ret; + } + + public int findMethodIdByTraitId(int classIndex, int traitId) { + if (traitId < class_info[classIndex].static_traits.traits.length) { + if (class_info[classIndex].static_traits.traits[traitId] instanceof TraitMethodGetterSetter) { + return ((TraitMethodGetterSetter) class_info[classIndex].static_traits.traits[traitId]).method_info; + } else { + return -1; + } + } else if (traitId < class_info[classIndex].static_traits.traits.length + instance_info[classIndex].instance_traits.traits.length) { + traitId -= class_info[classIndex].static_traits.traits.length; + if (instance_info[classIndex].instance_traits.traits[traitId] instanceof TraitMethodGetterSetter) { + return ((TraitMethodGetterSetter) instance_info[classIndex].instance_traits.traits[traitId]).method_info; + } else { + return -1; + } + } else { + traitId -= class_info[classIndex].static_traits.traits.length + instance_info[classIndex].instance_traits.traits.length; + if (traitId == 0) { + return instance_info[classIndex].iinit_index; + } else if (traitId == 1) { + return class_info[classIndex].cinit_index; + } else { + return -1; + } + } + } + + public String classToString(int i, boolean highlight, boolean pcode) { + String ret = ""; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(baos); + String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); + out.println("package " + packageName); + out.println("{"); + + //imports + List imports = getImports(i); + for (String imp : imports) { + out.println(IDENT_STRING + "import " + imp + ";"); + } + out.println(); + + //class header + String classHeader = instance_info[i].getClassHeaderStr(constants); + if (classHeader.startsWith("private ")) { + classHeader = "public " + classHeader.substring("private ".length()); + } + out.println(IDENT_STRING + classHeader); + out.println(IDENT_STRING + "{"); + + String toPrint=""; + + //if (class_info[i].cinit_index != 0) { + if (AUTOINIT_STATIC_VARIABLES) { + int bodyIndex = findBodyIndex(class_info[i].cinit_index); + List initializer = bodies[bodyIndex].code.toTree(true, i, this, constants, method_info, bodies[bodyIndex]); + for (TreeItem ti : initializer) { + if (ti instanceof SetPropertyTreeItem) { + int multinameIndex = ((SetPropertyTreeItem) ti).propertyName.multinameIndex; + TreeItem value = ((SetPropertyTreeItem) ti).value; + for (Trait t : class_info[i].static_traits.traits) { + if (t.name_index == multinameIndex) { + if (t instanceof TraitSlotConst) { + ((TraitSlotConst) t).assignedValue = value; + } + } + } + } + if (ti instanceof InitPropertyTreeItem) { + int multinameIndex = ((InitPropertyTreeItem) ti).propertyName.multinameIndex; + TreeItem value = ((InitPropertyTreeItem) ti).value; + for (Trait t : class_info[i].static_traits.traits) { + if (t.name_index == multinameIndex) { + if (t instanceof TraitSlotConst) { + ((TraitSlotConst) t).assignedValue = value; + } + } + } + } + } + } + String bodyStr = ""; + int bodyIndex = findBodyIndex(class_info[i].cinit_index); + if (bodyIndex != -1) { + bodyStr = addTabs(bodies[bodyIndex].toString(pcode,true,i,this, constants, method_info, highlight), 3); + } + // if (!bodyStr.equals("")) { + toPrint = IDENT_STRING + IDENT_STRING + "{\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; + if (highlight) { + toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length + 1); + } + out.println(toPrint); + //} + //} + + //constructor + //if (instance_info[i].iinit_index != 0) { + String modifier = ""; + Multiname m = constants.constant_multiname[instance_info[i].name_index]; + if (m != null) { + Namespace ns = m.getNamespace(constants); + if (ns != null) { + modifier = ns.getPrefix(constants) + " "; + if (modifier.equals(" ")) { + modifier = ""; + } + } + } + String constructorParams = ""; + + bodyStr = ""; + 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); + } + 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) { + toPrint = Highlighting.hilighTrait(toPrint, class_info[i].static_traits.traits.length + instance_info[i].instance_traits.traits.length); + } + out.println(toPrint); + //} + + //static variables,constants & methods + for (int ti = 0; ti < class_info[i].static_traits.traits.length; ti++) { + Trait t = class_info[i].static_traits.traits[ti]; + toPrint = ""; + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + bodyStr = ""; + bodyIndex = findBodyIndex(tm.method_info); + 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, 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, this, true) + ";"; + } + if (highlight) { + toPrint = Highlighting.hilighTrait(toPrint, ti); + } else { + toPrint = Highlighting.stripHilights(toPrint); + } + out.println(toPrint); + } + for (int ti = 0; ti < instance_info[i].instance_traits.traits.length; ti++) { + Trait t = instance_info[i].instance_traits.traits[ti]; + toPrint = ""; + if (t instanceof TraitSlotConst) { + TraitSlotConst ts = (TraitSlotConst) t; + toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this, false) + ";"; + } + + if (t instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) t; + bodyStr = ""; + bodyIndex = findBodyIndex(tm.method_info); + 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, 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); + } else { + toPrint = Highlighting.stripHilights(toPrint); + } + out.println(toPrint); + } + + + out.println(IDENT_STRING + "}");//class + out.println("}");//package + out.flush(); + + return baos.toString(); + } + + public void export(String directory, boolean pcode) throws IOException { + for (int i = 0; i < instance_info.length; i++) { + String packageName = instance_info[i].getName(constants).getNamespace(constants).getName(constants); + String className = instance_info[i].getName(constants).getName(constants); + Main.startWork("Exporting " + (i + 1) + "/" + instance_info.length + " " + packageName + "." + className + "..."); + File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); + if (!outDir.exists()) { + outDir.mkdirs(); + } + String fileName = outDir.toString() + File.separator + className + ".as"; + FileOutputStream fos = new FileOutputStream(fileName); + fos.write(classToString(i, false, pcode).getBytes()); + fos.close(); + } + + } + + public void dump(OutputStream os) { + PrintStream output = new PrintStream(os); + constants.dump(output); + for (int i = 0; i < method_info.length; i++) { + output.println("MethodInfo[" + i + "]:" + method_info[i].toString(constants)); + } + for (int i = 0; i < metadata_info.length; i++) { + output.println("MetadataInfo[" + i + "]:" + metadata_info[i].toString(constants)); + } + for (int i = 0; i < instance_info.length; i++) { + output.println("InstanceInfo[" + i + "]:" + instance_info[i].toString(this)); + } + for (int i = 0; i < class_info.length; i++) { + output.println("ClassInfo[" + i + "]:" + class_info[i].toString(this)); + } + for (int i = 0; i < script_info.length; i++) { + output.println("ScriptInfo[" + i + "]:" + script_info[i].toString(this)); + } + for (int i = 0; i < bodies.length; i++) { + output.println("MethodBody[" + i + "]:"); //+ bodies[i].toString(this, constants, method_info)); + } + } + public static final String[] reservedWords = { + "as", "break", "case", "catch", "class", "const", "continue", "default", "delete", "do", "each", "else", + "extends", "false", "finally", "for", "function", "if", "implements", "import", "in", "instanceof", + "interface", "internal", "is", "native", "new", "null", "package", "private", "protected", "public", + "return", "super", "switch", "this", "throw", "true", "try", "typeof", "use", "var", /*"void",*/ "while", + "with", "dynamic", "default", "final", "in"}; + public int unknownCount = 0; + + public boolean isValidName(int index, boolean autoFix) { + if (index <= 0) { + return true; + } + String s = constants.constant_string[index]; + boolean isValid = true; + boolean isReserved = false; + for (String rw : reservedWords) { + if (rw.equals(s.trim())) { + isValid = false; + isReserved = true; + break; + } + } + if (isValid) { + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) > 127) { + isValid = false; + break; + } + } + } + + if (!isValid) { + if (autoFix) { + if (isReserved) { + constants.constant_string[index] = "name_" + s.replace(" ", "_"); + } else { + unknownCount++; + constants.constant_string[index] = "_name" + unknownCount; + } + } + } + return isValid; + } + + public List findMultinameUsage(int multinameIndex) { + List ret = new ArrayList(); + List bodyIndices = new ArrayList(); + List subTraitBodyIndices = new ArrayList(); + List subTraitIndexIndices = new ArrayList(); + for (int i = 0; i < bodies.length; i++) { + for (int t = 0; t < bodies[i].traits.traits.length; t++) { + Trait tr = bodies[i].traits.traits[t]; + if (tr.name_index == multinameIndex) { + subTraitBodyIndices.add(i); + subTraitIndexIndices.add(t); + } + } + loopbody: + for (AVM2Instruction ins : bodies[i].code.code) { + for (int op = 0; op < ins.definition.operands.length; op++) { + if (ins.definition.operands[op] == AVM2Code.DAT_MULTINAME_INDEX) { + if (ins.operands[op] == multinameIndex) { + bodyIndices.add(i); + break loopbody; + } + } + } + } + } + + + for (int c = 0; c < class_info.length; c++) { + if (instance_info[c].name_index == multinameIndex) { + ret.add(new Usage(this, -1, c, -1, -1, false, Usage.TYPE_CLASS_NAME)); + } + for (int t = 0; t < class_info[c].static_traits.traits.length; t++) { + Trait tr = class_info[c].static_traits.traits[t]; + if (tr.name_index == multinameIndex) { + ret.add(new Usage(this, -1, c, t, -1, true, Usage.TYPE_TRAIT_NAME)); + } + } + for (int t = 0; t < instance_info[c].instance_traits.traits.length; t++) { + Trait tr = instance_info[c].instance_traits.traits[t]; + if (tr.name_index == multinameIndex) { + ret.add(new Usage(this, -1, c, t, -1, false, Usage.TYPE_TRAIT_NAME)); + } + } + } + for (int bodyIndex : bodyIndices) { + for (int c = 0; c < class_info.length; c++) { + if (class_info[c].cinit_index == bodyIndex) { + ret.add(new Usage(this, bodyIndex, c, -1, -1, true, Usage.TYPE_INITIALIZER)); + } + if (instance_info[c].iinit_index == bodyIndex) { + ret.add(new Usage(this, bodyIndex, c, -1, -1, false, Usage.TYPE_INITIALIZER)); } for (int t = 0; t < class_info[c].static_traits.traits.length; t++) { - Trait tr = class_info[c].static_traits.traits[t]; - if (tr.name_index == multinameIndex) { - ret.add(new Usage(this,-1, c, t,-1, true, Usage.TYPE_TRAIT_NAME)); - } + Trait tr = class_info[c].static_traits.traits[t]; + if (tr instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) tr; + if (tmgs.method_info == bodies[bodyIndex].method_info) { + ret.add(new Usage(this, bodyIndex, c, t, -1, true, Usage.TYPE_TRAIT_BODY)); + } + } } for (int t = 0; t < instance_info[c].instance_traits.traits.length; t++) { - Trait tr = instance_info[c].instance_traits.traits[t]; - if (tr.name_index == multinameIndex) { - ret.add(new Usage(this,-1, c, t,-1, false, Usage.TYPE_TRAIT_NAME)); - } + Trait tr = instance_info[c].instance_traits.traits[t]; + if (tr instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) tr; + if (tmgs.method_info == bodies[bodyIndex].method_info) { + ret.add(new Usage(this, bodyIndex, c, t, -1, false, Usage.TYPE_TRAIT_BODY)); + } + } } - } - for (int bodyIndex : bodyIndices) { - for (int c = 0; c < class_info.length; c++) { - if (class_info[c].cinit_index == bodyIndex) { - ret.add(new Usage(this, bodyIndex,c, -1,-1, true, Usage.TYPE_INITIALIZER)); - } - if (instance_info[c].iinit_index == bodyIndex) { - ret.add(new Usage(this, bodyIndex,c, -1,-1, false, Usage.TYPE_INITIALIZER)); - } - for (int t = 0; t < class_info[c].static_traits.traits.length; t++) { - Trait tr = class_info[c].static_traits.traits[t]; - if (tr instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) tr; - if (tmgs.method_info == bodies[bodyIndex].method_info) { - ret.add(new Usage(this,bodyIndex, c, t,-1, true, Usage.TYPE_TRAIT_BODY)); - } - } - } - for (int t = 0; t < instance_info[c].instance_traits.traits.length; t++) { - Trait tr = instance_info[c].instance_traits.traits[t]; - if (tr instanceof TraitMethodGetterSetter) { - TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) tr; - if (tmgs.method_info == bodies[bodyIndex].method_info) { - ret.add(new Usage(this,bodyIndex, c, t,-1, false, Usage.TYPE_TRAIT_BODY)); - } - } - } - } - } + } + } - for (int b=0;b getLocalRegNamesFromDebug(ABC abc){ } + + private void handleRegister(CodeStats stats,int reg){ + if(reg+1>stats.maxlocal){ + stats.maxlocal=reg+1; + } + } + + private boolean walkCode(CodeStats stats,int pos,int stack,int scope,ABC abc) { + while(posstats.maxstack) stats.maxstack=stack; + if(scope>stats.maxscope) stats.maxscope=scope; + if((ins.definition instanceof DXNSIns)||(ins.definition instanceof DXNSLateIns)){ + stats.has_set_dxns=true; + } + if(ins.definition instanceof NewActivationIns){ + stats.has_activation=true; + } + if(ins.definition instanceof SetLocalTypeIns){ + handleRegister(stats,((SetLocalTypeIns)ins.definition).getRegisterId(ins)); + }else{ + for(int i=0;ims) ms=stats.stackpos; + ret+=""+i+":"+stats.stackpos+(deltastack>=0?"+"+deltastack:deltastack)+","+stats.scopepos+" "+stats.ins.toString(abc.constants)+"\r\n"; + i++; + } + return ret; + } + + + + public CodeStats(AVM2Code code) { + instructionStats=new InstructionStats[code.code.size()]; + for(int i=0;i localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new DecrementTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DecrementIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DecrementIns.java index d140c6121..a616a4134 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DecrementIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DecrementIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -58,4 +59,9 @@ public class DecrementIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new DecrementTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DivideIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DivideIns.java index f2a063308..ac4d3e34d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DivideIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/DivideIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -63,4 +64,9 @@ public class DivideIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new DivideTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIIns.java index 93c6ae4d7..66feb8cac 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class IncrementIIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IncrementTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIns.java index 47753dd7d..dd0939f14 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/IncrementIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class IncrementIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IncrementTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/ModuloIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/ModuloIns.java index b1882b50b..989cd3c3a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/ModuloIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/ModuloIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -55,4 +56,9 @@ public class ModuloIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new ModuloTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIIns.java index 69e72da19..5d80d2606 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class MultiplyIIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new MultiplyTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIns.java index 0f74974f1..06c9ed25e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/MultiplyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -63,4 +64,9 @@ public class MultiplyIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new MultiplyTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIIns.java index fe612f973..d7d32b364 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -40,4 +41,9 @@ public class NegateIIns extends InstructionDefinition { TreeItem v = (TreeItem) stack.pop(); stack.push(new NegTreeItem(ins, v)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIns.java index dd7e4c398..e64163b13 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NegateIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -40,4 +41,9 @@ public class NegateIns extends InstructionDefinition { TreeItem v = (TreeItem) stack.pop(); stack.push(new NegTreeItem(ins, v)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NotIns.java index 74e0462bd..afc5d8f1f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/NotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -40,4 +41,9 @@ public class NotIns extends InstructionDefinition { TreeItem v = (TreeItem) stack.pop(); stack.push(new NotTreeItem(ins, v)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIIns.java index 30ef53eb0..73f79c22d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class SubtractIIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new SubtractTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIns.java index fa150669a..97dbd9ce9 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/arithmetic/SubtractIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.arithmetic; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class SubtractIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new SubtractTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitAndIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitAndIns.java index 5dba41aad..ae3a7f3b2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitAndIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitAndIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class BitAndIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new BitAndTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitNotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitNotIns.java index 6dbcc9645..49f7ebbec 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitNotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitNotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -48,4 +49,9 @@ public class BitNotIns extends InstructionDefinition { TreeItem v = (TreeItem) stack.pop(); stack.push(new BitNotTreeItem(ins, v)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitOrIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitOrIns.java index f5cfe88bf..5c0bbf33d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitOrIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitOrIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class BitOrIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new BitOrTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitXorIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitXorIns.java index 1c0f4565a..24c671f0a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitXorIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/BitXorIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class BitXorIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new BitXorTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/LShiftIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/LShiftIns.java index 1d8cb3fc3..060ee705b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/LShiftIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/LShiftIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class LShiftIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LShiftTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/RShiftIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/RShiftIns.java index 1801e6caf..c51217c3f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/RShiftIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/RShiftIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class RShiftIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new RShiftTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/URShiftIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/URShiftIns.java index 79e4d2f2a..b00e88ba1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/URShiftIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/bitwise/URShiftIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.bitwise; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class URShiftIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new URShiftTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/EqualsIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/EqualsIns.java index 6bdd6a7c8..f4527daa3 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/EqualsIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/EqualsIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class EqualsIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new EqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterEqualsIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterEqualsIns.java index dca4499f4..8a3fd6feb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterEqualsIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterEqualsIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class GreaterEqualsIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterThanIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterThanIns.java index 50fc94ef1..578fcd413 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterThanIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/GreaterThanIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class GreaterThanIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessEqualsIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessEqualsIns.java index 157f735a2..9b145d28d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessEqualsIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessEqualsIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class LessEqualsIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessThanIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessThanIns.java index b743efc8c..7aa870cbd 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessThanIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/LessThanIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class LessThanIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/StrictEqualsIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/StrictEqualsIns.java index f3b1bb92a..ba4ae4cfe 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/StrictEqualsIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/comparsion/StrictEqualsIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.comparsion; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class StrictEqualsIns extends InstructionDefinition { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new StrictEqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructIns.java index ee70a5203..6da4faf3a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -61,4 +62,11 @@ public class ConstructIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); stack.push(new ConstructTreeItem(ins, obj, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -ins.operands[0]-1+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructPropIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructPropIns.java index 8928ec270..d90cb400b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructPropIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructPropIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -68,4 +69,17 @@ public class ConstructPropIns extends InstructionDefinition { stack.push(new ConstructPropTreeItem(ins, obj, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructSuperIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructSuperIns.java index 26b12c93d..1046c4be1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructSuperIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/ConstructSuperIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -61,4 +62,9 @@ public class ConstructSuperIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); output.add(new ConstructSuperTreeItem(ins, obj, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -ins.operands[0]-1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewActivationIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewActivationIns.java index 09b55010c..0d1eb8142 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewActivationIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewActivationIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,11 @@ public class NewActivationIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new NewActivationTreeItem(ins)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewArrayIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewArrayIns.java index 9d009ab88..c5dad2d3f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewArrayIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewArrayIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -46,4 +47,11 @@ public class NewArrayIns extends InstructionDefinition { } stack.push(new NewArrayTreeItem(ins, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -ins.operands[0]+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewCatchIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewCatchIns.java index 80effcbc0..6a90cd53b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewCatchIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewCatchIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -41,4 +42,11 @@ public class NewCatchIns extends InstructionDefinition { int exInfo = ins.operands[0]; stack.push(new ExceptionTreeItem(body.exceptions[exInfo])); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewClassIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewClassIns.java index 91097eb95..d19503707 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewClassIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewClassIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -39,7 +40,14 @@ public class NewClassIns extends InstructionDefinition { @Override public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { int clsIndex = ins.operands[0]; - String baseType = stack.pop().toString(); - stack.push(new UnparsedTreeItem(ins, "new class(" + clsIndex + ") extends " + baseType)); + String baseType = stack.pop().toString(constants); + stack.push(new UnparsedTreeItem(ins, "new "+ abc.constants.constant_multiname[abc.instance_info[clsIndex].name_index].getName(constants) + ".class extends " + baseType)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } + + } 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 864a6c0d0..41ca084ca 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 @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,11 @@ public class NewFunctionIns extends InstructionDefinition { } stack.push(new NewFunctionTreeItem(ins, method_info[methodIndex].getParamStr(constants,body,abc), method_info[methodIndex].getReturnTypeStr(constants), bodyStr)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewObjectIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewObjectIns.java index 0dcd6849d..c1168a72b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewObjectIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/construction/NewObjectIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.construction; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -49,4 +50,10 @@ public class NewObjectIns extends InstructionDefinition { } stack.push(new NewObjectTreeItem(ins, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -ins.operands[0]*2+1; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallIns.java index b5b68ebfb..a8ee756cd 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -62,4 +63,11 @@ public class CallIns extends InstructionDefinition { TreeItem function = (TreeItem) stack.pop(); stack.push(new CallTreeItem(ins, receiver, function, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1-ins.operands[0]; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallMethodIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallMethodIns.java index df9cdb7a5..3c0a0038f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallMethodIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallMethodIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -63,4 +64,11 @@ public class CallMethodIns extends InstructionDefinition { String methodName = method_info[methodIndex].getName(constants); stack.push(new CallMethodTreeItem(ins, receiver, methodName, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1-ins.operands[1]; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropLexIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropLexIns.java index add2581f5..9154849fd 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropLexIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropLexIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.treemodel.CallPropertyTreeItem; @@ -50,4 +51,17 @@ public class CallPropLexIns extends CallPropertyIns { stack.push(new CallPropertyTreeItem(ins, false, receiver, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropVoidIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropVoidIns.java index bbba8aa1c..36cfa579b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropVoidIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropVoidIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -70,4 +71,17 @@ public class CallPropVoidIns extends InstructionDefinition { output.add(new CallPropertyTreeItem(ins, true, receiver, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropertyIns.java index 6d8fe14b5..cd9bf8133 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallPropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -68,4 +69,17 @@ public class CallPropertyIns extends InstructionDefinition { stack.push(new CallPropertyTreeItem(ins, false, receiver, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallStaticIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallStaticIns.java index f87dad5d2..28fc7d1b0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallStaticIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallStaticIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -63,4 +64,11 @@ public class CallStaticIns extends InstructionDefinition { String methodName = method_info[methodIndex].getName(constants); stack.push(new CallStaticTreeItem(ins, receiver, methodName, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1-ins.operands[1]; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperIns.java index b8ad042aa..1509a9181 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -67,4 +68,17 @@ public class CallSuperIns extends InstructionDefinition { stack.push(new CallSuperTreeItem(ins, false, receiver, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperVoidIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperVoidIns.java index f0205fdbb..3a143e838 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperVoidIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/executing/CallSuperVoidIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.executing; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -68,4 +69,17 @@ public class CallSuperVoidIns extends InstructionDefinition { output.add(new CallSuperTreeItem(ins, true, receiver, multiname, args)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-ins.operands[1]-1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfEqIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfEqIns.java index 4a79a47de..70f9799ad 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfEqIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfEqIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,11 @@ public class IfEqIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new NeqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfFalseIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfFalseIns.java index fd7cede6c..1ec88fa18 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfFalseIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfFalseIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class IfFalseIns extends InstructionDefinition implements IfTypeIns { //String v1 = stack.pop().toString(); //stack.push("(" + v1 + ")"); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGeIns.java index fb276eeca..1eae0ec03 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfGeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGtIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGtIns.java index 8a2dda53e..04f271e13 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGtIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfGtIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfGtIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLeIns.java index af49cc76a..5a97b086c 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfLeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLtIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLtIns.java index 5a0f510f8..de5d9c291 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLtIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfLtIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfLtIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGeIns.java index c90ae7400..2790d342b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfNGeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGtIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGtIns.java index 12334d19d..943900633 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGtIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNGtIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfNGtIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new GtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLeIns.java index 7dff596b9..677ce7ef9 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfNLeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LeTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLtIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLtIns.java index 1ede1074e..cbe289bfe 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLtIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNLtIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfNLtIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new LtTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNeIns.java index 2edf9b509..bd99075d2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfNeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfNeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new EqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictEqIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictEqIns.java index 186f1d6c8..b6df2272e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictEqIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictEqIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfStrictEqIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new StrictNeqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictNeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictNeIns.java index c0dc8d112..92cff7b0f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictNeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfStrictNeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -50,4 +51,9 @@ public class IfStrictNeIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new StrictEqTreeItem(ins, v1, v2)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfTrueIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfTrueIns.java index e116d1fff..145f11b32 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfTrueIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/IfTrueIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class IfTrueIns extends InstructionDefinition implements IfTypeIns { TreeItem v1 = (TreeItem) stack.pop(); stack.push(new NotTreeItem(ins, v1)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/LookupSwitchIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/LookupSwitchIns.java index 7d6512474..e3b02aeb0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/LookupSwitchIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/jumps/LookupSwitchIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.jumps; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -41,4 +42,9 @@ public class LookupSwitchIns extends InstructionDefinition { int caseCount = ins.operands[1]; //stack.push("switch(...)"); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal0Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal0Ins.java index 5019a094e..8f85013a0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal0Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal0Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -54,4 +55,9 @@ public class GetLocal0Ins extends InstructionDefinition implements GetLocalTypeI public int getRegisterId(AVM2Instruction par0) { return 0; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal1Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal1Ins.java index 5e6e77042..ea142d0f7 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal1Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal1Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -49,4 +50,9 @@ public class GetLocal1Ins extends InstructionDefinition implements GetLocalTypeI public int getRegisterId(AVM2Instruction par0) { return 1; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal2Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal2Ins.java index 6da267bd4..7aa87dd88 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal2Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal2Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -49,4 +50,9 @@ public class GetLocal2Ins extends InstructionDefinition implements GetLocalTypeI public int getRegisterId(AVM2Instruction par0) { return 2; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal3Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal3Ins.java index afee148cc..d1312d0f1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal3Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocal3Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -51,4 +52,9 @@ public class GetLocal3Ins extends InstructionDefinition implements GetLocalTypeI public int getRegisterId(AVM2Instruction par0) { return 3; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocalIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocalIns.java index f289f9764..c23abdf6d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocalIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/GetLocalIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -53,4 +54,9 @@ public class GetLocalIns extends InstructionDefinition implements GetLocalTypeIn public int getRegisterId(AVM2Instruction ins) { return ins.operands[0]; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal0Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal0Ins.java index e1df496a2..992bcde5a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal0Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal0Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -62,4 +63,9 @@ public class SetLocal0Ins extends InstructionDefinition implements SetTypeIns, S public int getRegisterId(AVM2Instruction ins) { return 0; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal1Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal1Ins.java index 18d9506a6..b6fe67892 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal1Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal1Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -62,4 +63,9 @@ public class SetLocal1Ins extends InstructionDefinition implements SetTypeIns, S public int getRegisterId(AVM2Instruction ins) { return 1; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal2Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal2Ins.java index 2b00710da..fd2f0a373 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal2Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal2Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -62,4 +63,9 @@ public class SetLocal2Ins extends InstructionDefinition implements SetTypeIns, S public int getRegisterId(AVM2Instruction ins) { return 2; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal3Ins.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal3Ins.java index 733f7b65b..d6016bed2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal3Ins.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocal3Ins.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -62,4 +63,9 @@ public class SetLocal3Ins extends InstructionDefinition implements SetTypeIns, S public int getRegisterId(AVM2Instruction ins) { return 3; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalIns.java index a34aade93..50e8e7646 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/localregs/SetLocalIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.localregs; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -64,4 +65,9 @@ public class SetLocalIns extends InstructionDefinition implements SetTypeIns, Se public int getRegisterId(AVM2Instruction ins) { return ins.operands[0]; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/DeletePropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/DeletePropertyIns.java index b112a499c..461d17d5e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/DeletePropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/DeletePropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -58,4 +59,19 @@ public class DeletePropertyIns extends InstructionDefinition { stack.add(new BooleanTreeItem(ins, Boolean.TRUE));//property successfully deleted output.add(new DeletePropertyTreeItem(ins, obj, multiname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyIns.java index 9399f3e93..a55c878bf 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -53,4 +54,19 @@ public class FindPropertyIns extends InstructionDefinition { FullMultinameTreeItem multiname = resolveMultiname(stack, constants, multinameIndex, ins); stack.push(new FindPropertyTreeItem(ins, multiname)); //resolve right object } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyStrictIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyStrictIns.java index 3d26aa185..5f2510da5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyStrictIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/FindPropertyStrictIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -52,4 +53,17 @@ public class FindPropertyStrictIns extends InstructionDefinition { FullMultinameTreeItem multiname = resolveMultiname(stack, constants, multinameIndex, ins); stack.push(new FindPropertyTreeItem(ins, multiname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetDescendantsIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetDescendantsIns.java index 9ffea9144..6cca69cc4 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetDescendantsIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetDescendantsIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -54,4 +55,17 @@ public class GetDescendantsIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); stack.push(new GetDescendantsTreeItem(ins, obj, multiname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java index 57bb141d3..6bfb341ac 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalScopeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -44,4 +45,11 @@ public class GetGlobalScopeIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(scopeStack.get(0)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java index be1b57d35..97007f1ea 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetGlobalSlotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -59,4 +60,11 @@ public class GetGlobalSlotIns extends InstructionDefinition { } stack.push(new GetSlotTreeItem(ins, obj, slotname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetLexIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetLexIns.java index 4db5ed5bf..d333afbc9 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetLexIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetLexIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -43,4 +44,11 @@ public class GetLexIns extends InstructionDefinition { Multiname multiname = constants.constant_multiname[multinameIndex]; stack.push(new GetLexTreeItem(ins, multiname)); } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 1; //multiname may not be runtime + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetPropertyIns.java index 933b3e078..add24e27d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetPropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -44,4 +45,17 @@ public class GetPropertyIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); stack.push(new GetPropertyTreeItem(ins, obj, multiname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java index d9c6d6d37..4ae3645eb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetScopeObjectIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,11 @@ public class GetScopeObjectIns extends InstructionDefinition { }*/ stack.push(scopeStack.get(index)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java index ef16b2eba..5ec6703a2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSlotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -59,4 +60,11 @@ public class GetSlotIns extends InstructionDefinition { } stack.push(new GetSlotTreeItem(ins, obj, slotname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSuperIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSuperIns.java index c815dcace..2d4770f1c 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSuperIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/GetSuperIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -44,4 +45,19 @@ public class GetSuperIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); stack.push(new GetSuperTreeItem(ins, obj, multiname)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-1+1; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/HasNextIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/HasNextIns.java index 11b04a9cf..96738302a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/HasNextIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/HasNextIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -42,4 +43,11 @@ public class HasNextIns extends InstructionDefinition { stack.push(new EachTreeItem(ins, curIndex, obj)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InIns.java index 5b97d9e8f..d1b82b9eb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,11 @@ public class InIns extends InstructionDefinition { TreeItem name = (TreeItem) stack.pop(); stack.push(new InTreeItem(ins, name, obj)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InitPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InitPropertyIns.java index 15c1f1920..dce1abb06 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InitPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/InitPropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -46,4 +47,17 @@ public class InitPropertyIns extends InstructionDefinition { TreeItem obj = (TreeItem) stack.pop(); output.add(new InitPropertyTreeItem(ins, obj, multiname, val)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-2; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextNameIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextNameIns.java index bd6343ef2..c9dd1ce06 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextNameIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextNameIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,11 @@ public class NextNameIns extends InstructionDefinition { //stack.push(obj + ".nextName(" + index + ")"); stack.push(index); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextValueIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextValueIns.java index bd3eef52b..05538af22 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextValueIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/NextValueIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,11 @@ public class NextValueIns extends InstructionDefinition { //stack.push(obj + ".nextValue(" + index + ")"); stack.push(index); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ReturnValueIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ReturnValueIns.java index f48d68f89..52fc61166 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ReturnValueIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ReturnValueIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,11 @@ public class ReturnValueIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { output.add(new ReturnValueTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java index 249868ee6..daa6d7db3 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetGlobalSlotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,11 @@ public class SetGlobalSlotIns extends InstructionDefinition implements SetTypeIn public String getObject(Stack stack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body) { return "globalslot" + ins.operands[0]; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java index e8d6375e1..76a62a229 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetPropertyIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -54,4 +55,17 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns if ((!obj.toString().equals(""))) multiname = "." + multiname; return obj + multiname; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-2; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java index 76b5e0b7c..9dd1b08eb 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSlotIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -76,4 +77,11 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { } return slotname; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java index 42d421aae..eaead93d2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/SetSuperIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.other; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -54,4 +55,17 @@ public class SetSuperIns extends InstructionDefinition implements SetTypeIns { String obj = stack.get(1 + resolvedCount(constants, multinameIndex)).toString(constants); return obj + ".super." + multiname; } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + int ret=-2; + int multinameIndex = ins.operands[0]; + if(abc.constants.constant_multiname[multinameIndex].needsName()){ + ret--; + } + if(abc.constants.constant_multiname[multinameIndex].needsNs()){ + ret--; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ThrowIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ThrowIns.java index a4342da13..c3fa9ead5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ThrowIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/other/ThrowIns.java @@ -42,5 +42,10 @@ public class ThrowIns extends InstructionDefinition { output.add(new ThrowTreeItem(ins, (TreeItem) stack.pop())); } + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/DupIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/DupIns.java index 10e8f8ab1..96c28a43d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/DupIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/DupIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -49,4 +50,11 @@ public class DupIns extends InstructionDefinition { stack.push(v); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+2; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopIns.java index 8fc32e920..a160033b5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -74,4 +75,11 @@ public class PopIns extends InstructionDefinition { } } } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopScopeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopScopeIns.java index 90d6a0ad7..cf492edaf 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopScopeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PopScopeIns.java @@ -69,5 +69,10 @@ public class PopScopeIns extends InstructionDefinition { } } + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushByteIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushByteIns.java index dce0b2d21..8daf5acef 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushByteIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushByteIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -48,4 +49,11 @@ public class PushByteIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IntegerValueTreeItem(ins, new Long(ins.operands[0]))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushDoubleIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushDoubleIns.java index 07eb11d35..03e6a4ef5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushDoubleIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushDoubleIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -46,4 +47,9 @@ public class PushDoubleIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new FloatValueTreeItem(ins, constants.constant_double[ins.operands[0]])); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushFalseIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushFalseIns.java index 9767d9edc..5e6422267 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushFalseIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushFalseIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,9 @@ public class PushFalseIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new BooleanTreeItem(ins, Boolean.FALSE)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushIntIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushIntIns.java index a89cc9caa..0861754aa 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushIntIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushIntIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -46,4 +47,9 @@ public class PushIntIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IntegerValueTreeItem(ins, constants.constant_int[ins.operands[0]])); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNamespaceIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNamespaceIns.java index ea3a1d05e..b0d0fe7b4 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNamespaceIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNamespaceIns.java @@ -43,5 +43,8 @@ public class PushNamespaceIns extends InstructionDefinition { stack.push(new NameSpaceTreeItem(ins, ins.operands[0])); } - +@Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNanIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNanIns.java index fe6a04f41..6e66e2646 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNanIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNanIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class PushNanIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new NanTreeItem(ins)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNullIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNullIns.java index 86376cc65..6c4fe0670 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNullIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushNullIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class PushNullIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new NullTreeItem(ins)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushScopeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushScopeIns.java index 8692988a8..1d4f285e5 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushScopeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushScopeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,5 +46,15 @@ public class PushScopeIns extends InstructionDefinition { scopeStack.push(stack.pop()); } +@Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushShortIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushShortIns.java index 1dd0b9919..21115bcc7 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushShortIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushShortIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -46,4 +47,9 @@ public class PushShortIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IntegerValueTreeItem(ins, new Long(ins.operands[0]))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushStringIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushStringIns.java index 1498b9c6a..9c7c3b78e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushStringIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushStringIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -46,4 +47,9 @@ public class PushStringIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new StringTreeItem(ins, constants.constant_string[ins.operands[0]])); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushTrueIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushTrueIns.java index 7d8991baf..80e283380 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushTrueIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushTrueIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,9 @@ public class PushTrueIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new BooleanTreeItem(ins, Boolean.TRUE)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUIntIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUIntIns.java index 94124954d..8d0ec4e62 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUIntIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUIntIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -46,4 +47,9 @@ public class PushUIntIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new IntegerValueTreeItem(ins, constants.constant_uint[ins.operands[0]])); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUndefinedIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUndefinedIns.java index 8ec8c35fc..49ea5e4a1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUndefinedIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushUndefinedIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.stack; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class PushUndefinedIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new UndefinedTreeItem(ins)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushWithIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushWithIns.java index 6fda7b891..d9bb3b834 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushWithIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/PushWithIns.java @@ -44,5 +44,15 @@ public class PushWithIns extends InstructionDefinition { output.add(new WithTreeItem(ins, w)); } +@Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } + + @Override + public int getScopeStackDelta(AVM2Instruction ins, ABC abc) { + return 1; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/SwapIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/SwapIns.java index 9218265c7..6cb5e46d1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/SwapIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/stack/SwapIns.java @@ -55,5 +55,10 @@ public class SwapIns extends InstructionDefinition { } + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+2; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java index 5f7c3ff0d..6f81c87e0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -60,4 +61,11 @@ public class ApplyTypeIns extends InstructionDefinition { Collections.reverse(params); stack.push(new ApplyTypeTreeItem(ins, stack.pop(), params)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -ins.operands[0]+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeIns.java index 38a32c98d..ba34df361 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -54,4 +55,11 @@ public class AsTypeIns extends InstructionDefinition { stack.push(new AsTypeTreeItem(ins, val, new FullMultinameTreeItem(ins, ins.operands[0]))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } + + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeLateIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeLateIns.java index 20cd87f38..fb90774e1 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeLateIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/AsTypeLateIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -51,4 +52,9 @@ public class AsTypeLateIns extends InstructionDefinition { TreeItem val = (TreeItem) stack.pop(); stack.push(new AsTypeTreeItem(ins, val, cls)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceAIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceAIns.java index 599085057..32d65141e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceAIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceAIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -46,4 +47,9 @@ public class CoerceAIns extends InstructionDefinition implements CoerceOrConvert stack.push(new CoerceTreeItem(ins, (TreeItem) stack.pop(), "*")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceIns.java index a9efefec2..dfdfff9b0 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; @@ -48,4 +49,9 @@ public class CoerceIns extends InstructionDefinition implements CoerceOrConvertT int multinameIndex = ins.operands[0]; stack.push(new CoerceTreeItem(ins, (TreeItem) stack.pop(), constants.constant_multiname[multinameIndex].getName(constants))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceSIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceSIns.java index deb25d2a5..0d1ab5f98 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceSIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/CoerceSIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class CoerceSIns extends InstructionDefinition implements CoerceOrConvert public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new CoerceTreeItem(ins, (TreeItem) stack.pop(), "string")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertBIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertBIns.java index 7c5b2ca96..a67a8616d 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertBIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertBIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -56,4 +57,9 @@ public class ConvertBIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "boolean")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertDIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertDIns.java index 16ba3a1e0..3c6a78bdc 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertDIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertDIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -64,4 +65,9 @@ public class ConvertDIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "double")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertIIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertIIns.java index 66dd1e04e..3ec8986c7 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertIIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertIIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -62,4 +63,9 @@ public class ConvertIIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "int")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertOIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertOIns.java index 62e8bf62e..44e28ed8c 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertOIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertOIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,9 @@ public class ConvertOIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "Object")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertSIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertSIns.java index 1a57cda0c..1c57b151b 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertSIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertSIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -46,4 +47,9 @@ public class ConvertSIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "string")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertUIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertUIns.java index aabfd5de7..0acc4978e 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertUIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ConvertUIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,4 +46,9 @@ public class ConvertUIns extends InstructionDefinition implements CoerceOrConver public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new ConvertTreeItem(ins, (TreeItem) stack.pop(), "uint")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/InstanceOfIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/InstanceOfIns.java index 9e68f0d40..f3311d0f8 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/InstanceOfIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/InstanceOfIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class InstanceOfIns extends InstructionDefinition { TreeItem value = (TreeItem) stack.pop(); stack.push(new InstanceOfTreeItem(ins, value, type)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeIns.java index 4cbc681ea..6f39f377f 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -43,4 +44,9 @@ public class IsTypeIns extends InstructionDefinition { TreeItem value = (TreeItem) stack.pop(); stack.push(new IsTypeTreeItem(ins, value, new FullMultinameTreeItem(ins, multinameIndex))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; //may not be runtime multiname + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeLateIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeLateIns.java index 7fa579a45..8dc032ba9 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeLateIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/IsTypeLateIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -41,4 +42,9 @@ public class IsTypeLateIns extends InstructionDefinition { TreeItem value = (TreeItem) stack.pop(); stack.push(new IsTypeTreeItem(ins, value, type)); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -2+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/TypeOfIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/TypeOfIns.java index 4c2333478..176d6fe8a 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/TypeOfIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/TypeOfIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; @@ -39,4 +40,9 @@ public class TypeOfIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new TypeOfTreeItem(ins, (TreeItem) stack.pop())); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/CheckFilterIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/CheckFilterIns.java index 2f2382c19..56b5c5984 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/CheckFilterIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/CheckFilterIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.xml; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -45,5 +46,8 @@ public class CheckFilterIns extends InstructionDefinition { } - +@Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSIns.java index b486c1113..acb6bb3a8 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSIns.java @@ -39,4 +39,5 @@ public class DXNSIns extends InstructionDefinition { System.out.println("Set default XML space " + s); } + } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSLateIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSLateIns.java index 4882e3abf..98d5a2987 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSLateIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/DXNSLateIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.xml; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class DXNSLateIns extends InstructionDefinition { TreeItem xmlns = stack.pop(); stack.push(new UnparsedTreeItem(ins, "XMLNS:" + xmlns.toString(constants))); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXAttrIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXAttrIns.java index 305cbed81..010d21cc9 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXAttrIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXAttrIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.xml; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class EscXAttrIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new UnparsedTreeItem(ins, "esc_xattr(" + stack.pop().toString(constants) + ")")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXElemIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXElemIns.java index 3ccf419b2..a45c87dc2 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXElemIns.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/xml/EscXElemIns.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.avm2.instructions.xml; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.LocalDataArea; import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; @@ -47,4 +48,9 @@ public class EscXElemIns extends InstructionDefinition { public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { stack.push(new UnparsedTreeItem(ins, "esc_xelem(" + stack.pop().toString(constants) + ")")); } + + @Override + public int getStackDelta(AVM2Instruction ins, ABC abc) { + return -1+1; + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ASMSourceEditorPane.java b/trunk/src/com/jpexs/asdec/abc/gui/ASMSourceEditorPane.java index 2f4f5875b..7fbabcbf9 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ASMSourceEditorPane.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ASMSourceEditorPane.java @@ -35,7 +35,7 @@ import java.util.HashMap; public class ASMSourceEditorPane extends LineMarkedEditorPane { public ABC abc; - public int bodyIndex; + public int bodyIndex=-1; public ASMSourceEditorPane() { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java index 13571fd69..fec84a819 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java @@ -50,8 +50,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL if ((pos >= th.startPos) && (pos < th.startPos + th.len)) { int bi = abc.findBodyIndex(abc.findMethodIdByTraitId(classIndex, (int) th.offset)); - if ((bi == -1)||(bi==0)) { - setNoTrait(); + if (bi == -1) { break; } Main.abcMainFrame.detailPanel.showCard(DetailPanel.METHOD_TRAIT_CARD); diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java b/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java index 6845de880..a533845a2 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java @@ -17,21 +17,25 @@ */ package com.jpexs.asdec.abc.gui; +import com.jpexs.asdec.Main; +import com.jpexs.asdec.abc.avm2.CodeStats; import com.jpexs.asdec.abc.types.MethodBody; import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.GridLayout; import java.text.NumberFormat; +import javax.swing.JCheckBox; import javax.swing.JFormattedTextField; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; /** * * @author JPEXS */ -public class MethodBodyParamsPanel extends JPanel { +public class MethodBodyParamsPanel extends JPanel implements ChangeListener{ public JLabel maxStackLabel = new JLabel("Max stack:",SwingConstants.RIGHT); public JFormattedTextField maxStackField = new JFormattedTextField(NumberFormat.getNumberInstance()); @@ -42,8 +46,9 @@ public class MethodBodyParamsPanel extends JPanel { public JLabel maxScopeDepthLabel = new JLabel("Maximum scope depth:",SwingConstants.RIGHT); public JFormattedTextField maxScopeDepthField = new JFormattedTextField(NumberFormat.getNumberInstance()); public MethodBody body; + public JCheckBox autoFillCheckBox=new JCheckBox("Auto fill on code save (GLOBAL SETTING)"); - public MethodBodyParamsPanel() { + public MethodBodyParamsPanel() { setLayout(null); maxStackLabel.setBounds(10, 10, 150, 25); @@ -65,6 +70,10 @@ public class MethodBodyParamsPanel extends JPanel { maxScopeDepthField.setBounds(10+150+10, 10+30+30+30, 75, 25); add(maxScopeDepthLabel); add(maxScopeDepthField); + + autoFillCheckBox.setBounds(50, 10+30+30+30+30, 250, 25); + add(autoFillCheckBox); + autoFillCheckBox.addChangeListener(this); setPreferredSize(new Dimension(300,150)); } @@ -86,12 +95,40 @@ public class MethodBodyParamsPanel extends JPanel { public boolean save() { if (body != null) { - body.max_stack = Integer.parseInt(maxStackField.getText()); - body.max_regs = Integer.parseInt(localCountField.getText()); body.init_scope_depth = Integer.parseInt(initScopeDepthField.getText()); - body.max_scope_depth = Integer.parseInt(maxScopeDepthField.getText()); + if(!autoFillCheckBox.isSelected()) + { + body.max_stack = Integer.parseInt(maxStackField.getText()); + body.max_regs = Integer.parseInt(localCountField.getText()); + body.max_scope_depth = Integer.parseInt(maxScopeDepthField.getText()); + }else{ + CodeStats stats=body.code.getStats(Main.abcMainFrame.abc); + if(stats==null) + { + JOptionPane.showMessageDialog(null, "Cannot get code stats for automatic body params.\r\nUncheck autofill to avoid this message.","Warning",JOptionPane.WARNING_MESSAGE); + }else{ + System.out.println(stats.toString(Main.abcMainFrame.abc)); + /*body.max_stack=stats.maxstack; + body.max_scope_depth=body.init_scope_depth+stats.maxscope; + body.max_regs=stats.maxlocal;*/ + } + } return true; } return false; } + + public void stateChanged(ChangeEvent e) { + if(e.getSource()==autoFillCheckBox){ + if(autoFillCheckBox.isSelected()){ + localCountField.setEnabled(false); + maxScopeDepthField.setEnabled(false); + maxStackField.setEnabled(false); + }else{ + localCountField.setEnabled(true); + maxScopeDepthField.setEnabled(true); + maxStackField.setEnabled(true); + } + } + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MethodTraitDetailPanel.java b/trunk/src/com/jpexs/asdec/abc/gui/MethodTraitDetailPanel.java index e2aba2078..fca17b18d 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MethodTraitDetailPanel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MethodTraitDetailPanel.java @@ -57,7 +57,7 @@ public class MethodTraitDetailPanel extends JTabbedPane implements TraitDetail { int lasttrait = Main.abcMainFrame.decompiledTextArea.lastTraitIndex; Main.abcMainFrame.decompiledTextArea.reloadClass(); - Main.abcMainFrame.decompiledTextArea.gotoTrait(lasttrait); + Main.abcMainFrame.decompiledTextArea.gotoTrait(lasttrait); return true; } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java index 93dc4663a..5ddfbcca0 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java @@ -34,8 +34,8 @@ public class ClassInfo { } - public String toString(ConstantPool constants) { - return "method_index=" + cinit_index + "\r\n" + static_traits.toString(constants); + public String toString(ABC abc) { + return "method_index=" + cinit_index + "\r\n" + static_traits.toString(abc); } public String getStaticVarsStr(ConstantPool constants,ABC abc) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java index fc7711a5a..3d217869d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java @@ -45,11 +45,11 @@ public class InstanceInfo { } - public String toString(ConstantPool constants) { + public String toString(ABC abc) { String supIndexStr = "[nothing]"; if (super_index > 0) - constants.constant_multiname[super_index].toString(constants); - return "name_index=" + constants.constant_multiname[name_index].toString(constants) + " super_index=" + supIndexStr + " flags=" + flags + " protectedNS=" + protectedNS + " interfaces=" + Helper.intArrToString(interfaces) + " method_index=" + iinit_index + "\r\n" + instance_traits.toString(constants); + abc.constants.constant_multiname[super_index].toString(abc.constants); + return "name_index=" + abc.constants.constant_multiname[name_index].toString(abc.constants) + " super_index=" + supIndexStr + " flags=" + flags + " protectedNS=" + protectedNS + " interfaces=" + Helper.intArrToString(interfaces) + " method_index=" + iinit_index + "\r\n" + instance_traits.toString(abc); } public String getClassHeaderStr(ConstantPool constants) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java index ed755a237..539ad684f 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ScriptInfo.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; @@ -33,8 +34,8 @@ public class ScriptInfo { } - public String toString(ConstantPool constants) { - return "method_index=" + init_index + "\r\n" + traits.toString(constants); + public String toString(ABC abc) { + return "method_index=" + init_index + "\r\n" + traits.toString(abc); } 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 7fa17db61..e9a1ce575 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java @@ -75,8 +75,8 @@ public class Trait { return "name_index=" + name_index + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } - public String toString(ConstantPool constants) { - return constants.constant_multiname[name_index].toString(constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); + public String toString(ABC abc) { + return abc.constants.constant_multiname[name_index].toString(abc.constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java index 6c4afa8f3..b05611c4d 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitClass.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.helpers.Helper; @@ -28,7 +29,7 @@ public class TraitClass extends Trait { public int class_info; @Override - public String toString(ConstantPool constants) { - return "Class " + constants.constant_multiname[name_index].toString(constants) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata); + public String toString(ABC abc) { + return "Class " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_id + " class_info=" + class_info + " metadata=" + Helper.intArrToString(metadata); } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java index 00ab02d92..91426267e 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitFunction.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.abc.types.traits; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.helpers.Helper; @@ -28,7 +29,7 @@ public class TraitFunction extends Trait { public int method_info; @Override - public String toString(ConstantPool constants) { - return "Function " + constants.constant_multiname[name_index].toString(constants) + " slot=" + slot_index + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata); + public String toString(ABC abc) { + return "Function " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_index + " method_info=" + method_info + " 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 54b407689..078c11721 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java @@ -31,8 +31,8 @@ public class TraitMethodGetterSetter extends Trait { public int method_info; @Override - public String toString(ConstantPool constants) { - return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " MethodGetterSetter " + constants.constant_multiname[name_index].toString(constants) + " disp_id=" + disp_id + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata); + public String toString(ABC abc) { + return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " MethodGetterSetter " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " disp_id=" + disp_id + " method_info=" + method_info + " metadata=" + Helper.intArrToString(metadata); } @Override 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 a970c3b0d..3a08f23b0 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java @@ -38,12 +38,12 @@ public class TraitSlotConst extends Trait { public TreeItem assignedValue; @Override - public String toString(ConstantPool constants) { + public String toString(ABC abc) { String typeStr = "*"; if (type_index > 0) { - typeStr = constants.constant_multiname[type_index].toString(constants); + typeStr = abc.constants.constant_multiname[type_index].toString(abc.constants); } - return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " SlotConst " + constants.constant_multiname[name_index].toString(constants) + " slot=" + slot_id + " type=" + typeStr + " value=" + (new ValueKind(value_index, value_kind)).toString(constants) + " metadata=" + Helper.intArrToString(metadata); + return "0x" + Helper.formatAddress(fileOffset) + " " + Helper.byteArrToString(bytes) + " SlotConst " + abc.constants.constant_multiname[name_index].toString(abc.constants) + " slot=" + slot_id + " type=" + typeStr + " value=" + (new ValueKind(value_index, value_kind)).toString(abc.constants) + " metadata=" + Helper.intArrToString(metadata); } public String getNameValueStr(ConstantPool 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 2f53c116d..f5623927c 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java @@ -20,7 +20,6 @@ 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 { @@ -37,11 +36,11 @@ public class Traits { } - public String toString(ConstantPool constants) { + public String toString(ABC abc) { String s = ""; for (int t = 0; t < traits.length; t++) { if (t > 0) s += "\r\n"; - s += traits[t].toString(constants); + s += traits[t].toString(abc); } return s; } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineSpriteTag.java b/trunk/src/com/jpexs/asdec/tags/DefineSpriteTag.java index e43a56c7f..44cb61123 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineSpriteTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineSpriteTag.java @@ -67,6 +67,8 @@ public class DefineSpriteTag extends Tag implements Container { subTags = sis.readTagList(); } + + static int c=0; /** * Gets data bytes * diff --git a/trunk/src/com/jpexs/asdec/types/MATRIX.java b/trunk/src/com/jpexs/asdec/types/MATRIX.java index 3ecf9d025..439e35cbf 100644 --- a/trunk/src/com/jpexs/asdec/types/MATRIX.java +++ b/trunk/src/com/jpexs/asdec/types/MATRIX.java @@ -51,11 +51,11 @@ public class MATRIX { /** * X translate value in twips */ - public long translateX; + public int translateX; /** * Y translate value in twips */ - public long translateY; + public int translateY; /** * Nbits used for store translate values