From 18b281ebb284f14a15074ac76b22cc483814fd91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Fri, 28 Dec 2012 22:49:19 +0100 Subject: [PATCH] AS3: Decompiling namespaces --- trunk/src/com/jpexs/asdec/Main.java | 52 +++++------ trunk/src/com/jpexs/asdec/abc/ABC.java | 86 ++++++++++++++++--- .../com/jpexs/asdec/abc/avm2/AVM2Code.java | 7 +- .../construction/ConstructIns.java | 10 +-- .../construction/ConstructPropIns.java | 10 +-- .../construction/ConstructSuperIns.java | 10 +-- .../avm2/instructions/executing/CallIns.java | 12 +-- .../instructions/executing/CallMethodIns.java | 12 +-- .../executing/CallPropVoidIns.java | 18 ++-- .../executing/CallPropertyIns.java | 16 ++-- .../instructions/executing/CallStaticIns.java | 12 +-- .../instructions/executing/CallSuperIns.java | 16 ++-- .../executing/CallSuperVoidIns.java | 16 ++-- .../avm2/instructions/types/ConvertBIns.java | 2 +- .../jpexs/asdec/abc/gui/ClassesListTree.java | 35 +++++--- .../asdec/abc/gui/ClassesListTreeModel.java | 25 ++++-- .../asdec/abc/gui/DecompiledEditorPane.java | 7 ++ .../com/jpexs/asdec/abc/gui/MainFrame.java | 4 +- .../com/jpexs/asdec/abc/gui/TraitsList.java | 8 +- .../jpexs/asdec/abc/gui/TraitsListModel.java | 4 +- trunk/src/com/jpexs/asdec/abc/gui/Tree.java | 4 +- .../com/jpexs/asdec/abc/gui/TreeElement.java | 14 +-- .../jpexs/asdec/abc/gui/TreeLeafClass.java | 30 +++++++ .../jpexs/asdec/abc/gui/TreeLeafString.java | 30 +++++++ .../com/jpexs/asdec/abc/types/ClassInfo.java | 5 +- .../jpexs/asdec/abc/types/InstanceInfo.java | 16 ++-- .../com/jpexs/asdec/abc/types/Namespace.java | 3 +- .../jpexs/asdec/abc/types/traits/Trait.java | 20 +++-- .../types/traits/TraitMethodGetterSetter.java | 6 +- .../abc/types/traits/TraitSlotConst.java | 6 +- .../jpexs/asdec/abc/types/traits/Traits.java | 5 +- .../abc/usages/ConstVarMultinameUsage.java | 6 +- .../abc/usages/MethodMultinameUsage.java | 6 +- .../jpexs/asdec/action/swf4/ActionPush.java | 4 +- .../action/treemodel/clauses/IfTreeItem.java | 2 +- .../jpexs/asdec/tags/DefineButton2Tag.java | 3 +- .../com/jpexs/asdec/tags/DefineButtonTag.java | 2 +- .../src/com/jpexs/asdec/tags/DoActionTag.java | 6 +- .../com/jpexs/asdec/tags/DoInitActionTag.java | 4 +- trunk/src/com/jpexs/asdec/tags/Metadata.java | 2 - .../jpexs/asdec/types/BUTTONCONDACTION.java | 5 +- .../jpexs/asdec/types/CLIPACTIONRECORD.java | 5 +- 42 files changed, 345 insertions(+), 201 deletions(-) create mode 100644 trunk/src/com/jpexs/asdec/abc/gui/TreeLeafClass.java create mode 100644 trunk/src/com/jpexs/asdec/abc/gui/TreeLeafString.java diff --git a/trunk/src/com/jpexs/asdec/Main.java b/trunk/src/com/jpexs/asdec/Main.java index 7ed25e21d..0af044278 100644 --- a/trunk/src/com/jpexs/asdec/Main.java +++ b/trunk/src/com/jpexs/asdec/Main.java @@ -191,17 +191,17 @@ public class Main { swf = parseSWF(Main.file); FileInputStream fis = new FileInputStream(file); DEBUG_COPY = true; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { swf.saveTo(baos); } catch (NotSameException nse) { - Logger.getLogger(Main.class.getName()).log(Level.FINE, null, nse); + Logger.getLogger(Main.class.getName()).log(Level.FINE, null, nse); JOptionPane.showMessageDialog(null, "WARNING: The SWF decompiler may have problems saving this file. Recommended usage is READ ONLY."); } DEBUG_COPY = false; //DEBUG_COPY=true; } catch (Exception ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(null, "Cannot load SWF file."); loadingDialog.setVisible(false); return false; @@ -213,7 +213,7 @@ public class Main { } } - + if (false) { JOptionPane.showMessageDialog(null, "This SWF file does not contain any ActionScript parts"); loadingDialog.setVisible(false); @@ -432,19 +432,19 @@ public class Main { */ public static void main(String[] args) throws IOException { View.setWinLookAndFeel(); - Configuration.load(); - int pos=0; - if(args.length>0){ - if(args[0].equals("-debug")){ - debugMode=true; + Configuration.load(); + int pos = 0; + if (args.length > 0) { + if (args[0].equals("-debug")) { + debugMode = true; pos++; } } - initLogging(debugMode); - if (args.length < pos+1) { + initLogging(debugMode); + if (args.length < pos + 1) { autoCheckForUpdates(); showModeFrame(); - }else { + } else { if (args[pos].equals("-proxy")) { int port = 55555; for (int i = pos; i < args.length; i++) { @@ -463,18 +463,18 @@ public class Main { addTrayIcon(); switchProxy(); } else if (args[pos].equals("-export")) { - if (args.length < pos+4) { + if (args.length < pos + 4) { badArguments(); } - String exportFormat = args[pos+1]; + String exportFormat = args[pos + 1]; if (!exportFormat.toLowerCase().equals("as")) { if (!exportFormat.toLowerCase().equals("pcode")) { System.err.println("Invalid export format:" + exportFormat); badArguments(); } } - File outDir = new File(args[pos+2]); - File inFile = new File(args[pos+3]); + File outDir = new File(args[pos + 2]); + File inFile = new File(args[pos + 3]); if (!inFile.exists()) { System.err.println("Input SWF file does not exist!"); badArguments(); @@ -506,11 +506,11 @@ public class Main { System.exit(1); } } else if (args[pos].equals("-compress")) { - if (args.length < pos+3) { + if (args.length < pos + 3) { badArguments(); } - if (SWF.fws2cws(new FileInputStream(args[pos+1]), new FileOutputStream(args[pos+2]))) { + if (SWF.fws2cws(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) { System.out.println("OK"); } else { System.err.println("FAIL"); @@ -520,7 +520,7 @@ public class Main { badArguments(); } - if (SWF.cws2fws(new FileInputStream(args[pos+1]), new FileOutputStream(args[pos+2]))) { + if (SWF.cws2fws(new FileInputStream(args[pos + 1]), new FileOutputStream(args[pos + 2]))) { System.out.println("OK"); System.exit(0); } else { @@ -533,9 +533,9 @@ public class Main { } try { dump_tags = true; - parseSWF(args[pos+1]); + parseSWF(args[pos + 1]); } catch (Exception ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); System.exit(1); } System.exit(0); @@ -543,7 +543,7 @@ public class Main { printHeader(); printCmdLineUsage(); System.exit(0); - } else if (args.length == pos+1) { + } else if (args.length == pos + 1) { autoCheckForUpdates(); openFile(args[pos]); } else { @@ -734,15 +734,15 @@ public class Main { public static void initLogging(boolean debug) { try { Logger logger = Logger.getLogger(""); - logger.setLevel(debug?Level.CONFIG:Level.WARNING); + logger.setLevel(debug ? Level.CONFIG : Level.WARNING); FileHandler fileTxt = new FileHandler("log.txt"); SimpleFormatter formatterTxt = new SimpleFormatter(); fileTxt.setFormatter(formatterTxt); logger.addHandler(fileTxt); - - if(debug){ - ConsoleHandler conHan=new ConsoleHandler(); + + if (debug) { + ConsoleHandler conHan = new ConsoleHandler(); conHan.setFormatter(formatterTxt); logger.addHandler(conHan); } diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index e82c549f9..2a1700ac4 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -34,6 +34,7 @@ import com.jpexs.asdec.helpers.Helper; import com.jpexs.asdec.helpers.Highlighting; import java.io.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -59,9 +60,8 @@ public class ABC { public static final int MINORwithDECIMAL = 17; public static final boolean AUTOINIT_STATIC_VARIABLES = false; protected HashSet listeners = new HashSet(); + private static Logger logger = Logger.getLogger(ABC.class.getName()); - private static Logger logger =Logger.getLogger(ABC.class.getName()); - public void addEventListener(EventListener listener) { listeners.add(listener); } @@ -92,7 +92,7 @@ public class ABC { } public ABC(InputStream is) throws IOException { - ABCInputStream ais = new ABCInputStream(is); + ABCInputStream ais = new ABCInputStream(is); minor_version = ais.readU16(); major_version = ais.readU16(); logger.log(Level.FINE, "ABC minor_version: {0}, major_version: {1}", new Object[]{minor_version, major_version}); @@ -101,7 +101,7 @@ public class ABC { 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(); + constants.constant_int[i] = ais.readS32(); } //constant unsigned integers @@ -254,11 +254,12 @@ public class ABC { method_info[mb.method_info].setBody(mb); bodyIdxFromMethodIdx[mb.method_info] = i; } - + loadNamespaceMap(); /*for(ScriptInfo si:script_info){ System.out.println("--------------------------------------------"); System.out.println(findBody(si.init_index).toString(true, false, -1, this, constants, method_info,new Stack())); - }*/ + System.out.println("sitrait:"+si.traits.toString(this)); + }*/ } public void saveToStream(OutputStream os) throws IOException { @@ -573,6 +574,51 @@ public class ABC { } } } + /* Map from multiname index of namespace value to namespace name**/ + private HashMap namespaceMap; + + private void loadNamespaceMap() { + namespaceMap = new HashMap(); + for (ScriptInfo si : script_info) { + for (Trait t : si.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst s = ((TraitSlotConst) t); + if (s.value_kind == ValueKind.CONSTANT_Namespace) { + namespaceMap.put(s.value_index, s.name_index); + } + } + } + } + } + + public int nsValueToName(int value_index) { + if (namespaceMap.containsKey(value_index)) { + return namespaceMap.get(value_index); + } else { + return -1; + } + } + + public HashMap namespacesToString() { + HashMap ret = new HashMap(); + for (Integer value_index : namespaceMap.keySet()) { + int name_index = namespaceMap.get(value_index); + String n = ""; + String packageName = constants.constant_multiname[name_index].getNamespace(constants).getName(constants); + n += ("package " + packageName + "\r\n"); + n += ("{\r\n"); + Namespace ns = constants.constant_multiname[name_index].getNamespace(constants); + String modifiers = ns.getPrefix(this); + if (!modifiers.equals("")) { + modifiers += " "; + } + String nsname = constants.constant_multiname[name_index].getName(constants); + n += IDENT_STRING + modifiers + "namespace " + nsname + "=\"" + Helper.escapeString(constants.constant_namespace[value_index].getName(constants)) + "\";\r\n"; + n += ("}\r\n"); + ret.put(packageName + "." + nsname, n); + } + return ret; + } public String classToString(int i, boolean highlight, boolean pcode) { if (!highlight) { @@ -593,7 +639,7 @@ public class ABC { out.println(); //class header - String classHeader = instance_info[i].getClassHeaderStr(constants); + String classHeader = instance_info[i].getClassHeaderStr(this); /*if (classHeader.startsWith("private ")) { classHeader = "public " + classHeader.substring("private ".length()); }*/ @@ -653,7 +699,7 @@ public class ABC { if (m != null) { Namespace ns = m.getNamespace(constants); if (ns != null) { - modifier = ns.getPrefix(constants) + " "; + modifier = ns.getPrefix(this) + " "; if (modifier.equals(" ")) { modifier = ""; } @@ -687,12 +733,12 @@ public class ABC { if (bodyIndex != -1) { bodyStr = addTabs(bodies[bodyIndex].toString(pcode, true, i, this, constants, method_info, new Stack(), highlight), 3); } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info, this, true) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; + toPrint = IDENT_STRING + IDENT_STRING + tm.convert(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) + ";"; + toPrint = IDENT_STRING + IDENT_STRING + ts.convert(method_info, this, true) + ";"; } if (highlight) { toPrint = Highlighting.hilighTrait(toPrint, ti); @@ -706,7 +752,7 @@ public class ABC { toPrint = ""; if (t instanceof TraitSlotConst) { TraitSlotConst ts = (TraitSlotConst) t; - toPrint = IDENT_STRING + IDENT_STRING + ts.convert(constants, method_info, this, false) + ";"; + toPrint = IDENT_STRING + IDENT_STRING + ts.convert(method_info, this, false) + ";"; } if (t instanceof TraitMethodGetterSetter) { @@ -716,7 +762,7 @@ public class ABC { if (bodyIndex != -1) { bodyStr = addTabs(bodies[bodyIndex].toString(pcode, false, i, this, constants, method_info, new Stack(), highlight), 3); } - toPrint = IDENT_STRING + IDENT_STRING + tm.convert(constants, method_info, this, false) + " {\r\n" + bodyStr + "\r\n" + IDENT_STRING + IDENT_STRING + "}"; + toPrint = IDENT_STRING + IDENT_STRING + tm.convert(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); @@ -742,7 +788,7 @@ public class ABC { if ((packageName != null) && (!packageName.equals(""))) { fullName = packageName + "." + fullName; } - String exStr="Exporting " + (i + 1) + "/" + instance_info.length + " " + fullName + " ..."; + String exStr = "Exporting " + (i + 1) + "/" + instance_info.length + " " + fullName + " ..."; informListeners("export", exStr); logger.info(exStr); File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); @@ -754,6 +800,20 @@ public class ABC { fos.write(classToString(i, false, pcode).getBytes()); fos.close(); } + informListeners("export", "Exporting namespaces..."); + HashMap ns = namespacesToString(); + for (String n : ns.keySet()) { + String nsName = n.substring(n.lastIndexOf(".") + 1); + String packageName = n.substring(0, n.lastIndexOf(".")); + File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar)); + if (!outDir.exists()) { + outDir.mkdirs(); + } + String fileName = outDir.toString() + File.separator + nsName + ".as"; + FileOutputStream fos = new FileOutputStream(fileName); + fos.write(n.getBytes()); + fos.close(); + } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java index 14eb4c7e9..2877b8308 100644 --- a/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/asdec/abc/avm2/AVM2Code.java @@ -16,7 +16,6 @@ */ package com.jpexs.asdec.abc.avm2; -import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.ABCInputStream; import com.jpexs.asdec.abc.CopyOutputStream; @@ -1491,7 +1490,7 @@ public class AVM2Code { ins.definition.translate(isStatic, classIndex, localRegs, stack, scopeStack, constants, ins, method_info, output, body, abc, localRegNames); } ip++; - break; + break; //} } else { @@ -1598,7 +1597,7 @@ public class AVM2Code { if (ex instanceof UnknownJumpException) { throw (UnknownJumpException) ex; } - Logger.getLogger(AVM2Code.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(AVM2Code.class.getName()).log(Level.SEVERE, null, ex); throw new ConvertException(ex.getClass().getSimpleName(), ip); } } @@ -1749,7 +1748,7 @@ public class AVM2Code { s = listToString(list, constants, localRegNames); } catch (Exception ex) { - Logger.getLogger(AVM2Code.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(AVM2Code.class.getName()).log(Level.SEVERE, null, ex); s = "/*\r\n * Decompilation error\r\n * Code may be obfuscated\r\n * Error Message: " + ex.getMessage() + "\r\n */"; return s; } 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 a79178e34..69d3ea281 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 @@ -39,11 +39,11 @@ public class ConstructIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int argCount = (int) ((Long) arguments.get(0)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - Object obj = lda.operandStack.pop();*/ + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + Object obj = lda.operandStack.pop();*/ throw new RuntimeException("Cannot call constructor"); //call construct property of obj //push new instance 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 32ffa9324..17d4db770 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 @@ -40,11 +40,11 @@ public class ConstructPropIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - }*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + }*/ //if multiname[multinameIndex] is runtime //pop(name) pop(ns) throw new RuntimeException("Cannot construct property"); 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 a58d0356c..52c19d22c 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 @@ -39,11 +39,11 @@ public class ConstructSuperIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int argCount = (int) ((Long) arguments.get(0)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - Object obj = lda.operandStack.pop();*/ + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + Object obj = lda.operandStack.pop();*/ throw new RuntimeException("Cannot call super constructor"); //call construct property of obj //do not push anything 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 76c1981fe..24bba41be 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 @@ -39,12 +39,12 @@ public class CallIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int argCount = (int) ((Long) arguments.get(0)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - Object receiver = lda.operandStack.pop(); - Object function = lda.operandStack.pop();*/ + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + Object receiver = lda.operandStack.pop(); + Object function = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown function"); //push(result) } 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 bf373cb2a..296db8c0b 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 @@ -39,12 +39,12 @@ public class CallMethodIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int methodIndex = (int) ((Long) arguments.get(0)).longValue(); //index of object's method - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - Object receiver = lda.operandStack.pop();*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + Object receiver = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown method"); //push(result) } 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 92545ffa4..482cb5702 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 @@ -41,15 +41,15 @@ public class CallPropVoidIns extends InstructionDefinition { public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { //same as callproperty /* - int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - //if multiname[multinameIndex] is runtime - //pop(name) pop(ns) - Object obj = lda.operandStack.pop();*/ + int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + //if multiname[multinameIndex] is runtime + //pop(name) pop(ns) + Object obj = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown property"); //do not push anything } 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 786f25983..e487216e5 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 @@ -40,14 +40,14 @@ public class CallPropertyIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - //if multiname[multinameIndex] is runtime - //pop(name) pop(ns) - Object obj = lda.operandStack.pop();*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + //if multiname[multinameIndex] is runtime + //pop(name) pop(ns) + Object obj = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown property"); //push(result) } 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 6ef719fc6..93fe963c7 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 @@ -39,12 +39,12 @@ public class CallStaticIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int methodIndex = (int) ((Long) arguments.get(0)).longValue(); //index of method_info - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - Object receiver = lda.operandStack.pop();*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + Object receiver = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown static method"); //push(result) } 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 5968fd671..1accdd19a 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 @@ -40,14 +40,14 @@ public class CallSuperIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - //if multiname[multinameIndex] is runtime - //pop(name) pop(ns) - Object receiver = lda.operandStack.pop();*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + //if multiname[multinameIndex] is runtime + //pop(name) pop(ns) + Object receiver = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown super method"); //push(result) } 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 cdbfbbb5d..57521d62a 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 @@ -40,14 +40,14 @@ public class CallSuperVoidIns extends InstructionDefinition { @Override public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { /*int multinameIndex = (int) ((Long) arguments.get(0)).longValue(); - int argCount = (int) ((Long) arguments.get(1)).longValue(); - List passArguments = new ArrayList(); - for (int i = argCount - 1; i >= 0; i--) { - passArguments.set(i, lda.operandStack.pop()); - } - //if multiname[multinameIndex] is runtime - //pop(name) pop(ns) - Object receiver = lda.operandStack.pop();*/ + int argCount = (int) ((Long) arguments.get(1)).longValue(); + List passArguments = new ArrayList(); + for (int i = argCount - 1; i >= 0; i--) { + passArguments.set(i, lda.operandStack.pop()); + } + //if multiname[multinameIndex] is runtime + //pop(name) pop(ns) + Object receiver = lda.operandStack.pop();*/ throw new RuntimeException("Call to unknown super method"); //do not push anything } 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 6bc8d07f6..d2afc3af1 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 @@ -47,7 +47,7 @@ public class ConvertBIns extends InstructionDefinition implements CoerceOrConver } else { bval = true; } - lda.operandStack.push((Boolean)bval); + lda.operandStack.push((Boolean) bval); } @Override diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java index b8a70f86f..ee3a459eb 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTree.java @@ -62,20 +62,29 @@ public class ClassesListTree extends JTree implements TreeSelectionListener { if (tp == null) { return; } - final int classIndex = tp.getClassIndex(); - if (classIndex != -1) { - if (!Main.isWorking()) { - Main.startWork("Decompiling class..."); - (new Thread() { - @Override - public void run() { - Main.abcMainFrame.navigator.setClassIndex(classIndex); - Main.abcMainFrame.decompiledTextArea.setClassIndex(classIndex, abc); - Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); - Main.stopWork(); - } - }).start(); + Object item = tp.getItem(); + if (item instanceof TreeLeafString) { + Main.abcMainFrame.navigator.setClassIndex(-1); + Main.abcMainFrame.decompiledTextArea.setClassIndex(-1, abc); + Main.abcMainFrame.decompiledTextArea.setText(((TreeLeafString) item).str); + } + if (item instanceof TreeLeafClass) { + final int classIndex = ((TreeLeafClass) item).classIndex; + if (classIndex != -1) { + if (!Main.isWorking()) { + Main.startWork("Decompiling class..."); + (new Thread() { + @Override + public void run() { + Main.abcMainFrame.navigator.setClassIndex(classIndex); + Main.abcMainFrame.decompiledTextArea.setClassIndex(classIndex, abc); + Main.abcMainFrame.detailPanel.methodTraitPanel.methodCodePanel.sourceTextArea.setText(""); + Main.stopWork(); + } + }).start(); + } } } + } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java index fc07614cb..73b9fe69f 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/ClassesListTreeModel.java @@ -17,6 +17,7 @@ package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.abc.ABC; +import java.util.HashMap; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; @@ -24,20 +25,20 @@ import javax.swing.tree.TreePath; class ClassIndexVisitor implements TreeVisitor { private TreeElement found = null; - private int classIndex; + private Object item; - public ClassIndexVisitor(int classIndex) { - this.classIndex = classIndex; + public ClassIndexVisitor(Object item) { + this.item = item; } public void onBranch(TreeElement branch) { - if (branch.getClassIndex() == classIndex) { + if (branch.getItem() == item) { found = branch; } } public void onLeaf(TreeElement leaf) { - if (leaf.getClassIndex() == classIndex) { + if (leaf.getItem() == item) { found = leaf; } } @@ -57,17 +58,23 @@ public class ClassesListTreeModel implements TreeModel { for (int i = 0; i < abc.instance_info.length; i++) { String packageName = abc.instance_info[i].getName(abc.constants).getNamespace(abc.constants).getName(abc.constants); String className = abc.instance_info[i].getName(abc.constants).getName(abc.constants); - String full = packageName + "." + className; - classTree.add(className, packageName, i); + //String full = packageName + "." + className; + classTree.add(className, packageName, new TreeLeafClass(i)); + } + HashMap ns = abc.namespacesToString(); + for (String n : ns.keySet()) { + String nsName = n.substring(n.lastIndexOf(".") + 1); + String packageName = n.substring(0, n.lastIndexOf(".")); + classTree.add(nsName, packageName, new TreeLeafString(ns.get(n))); } } - public int getClassIndexByPath(String fullPath) { + public Object getItemByPath(String fullPath) { TreeElement elem = classTree.get(fullPath); if (elem == null) { return -1; } - return elem.getClassIndex(); + return elem.getItem(); } public TreeElement getElementByClassIndex(int classIndex) { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java index b9f3566fd..c924d0f8f 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/DecompiledEditorPane.java @@ -143,6 +143,13 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements MouseL public void setClassIndex(int index, ABC abc) { setText("//Please wait..."); + if (index == -1) { + highlights = new ArrayList(); + traitHighlights = new ArrayList(); + methodHighlights = new ArrayList(); + classIndex = -1; + return; + } String hilightedCode; if (!bufferedClasses.containsKey(index)) { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java b/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java index 5c9672c2a..33e1e9c63 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MainFrame.java @@ -392,8 +392,8 @@ public class MainFrame extends JFrame implements ActionListener, ItemListener { try { Main.saveFile(Main.file); } catch (IOException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - JOptionPane.showMessageDialog(null, "Cannot save file","Error",JOptionPane.ERROR_MESSAGE); + Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); + JOptionPane.showMessageDialog(null, "Cannot save file", "Error", JOptionPane.ERROR_MESSAGE); } } if (e.getActionCommand().equals("SAVEAS")) { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java b/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java index 744956913..52044c307 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TraitsList.java @@ -39,8 +39,12 @@ public class TraitsList extends JList implements ListSelectionListener { } public void setClassIndex(int classIndex) { - if (abc != null) { - setModel(new TraitsListModel(abc, classIndex)); + if (classIndex == -1) { + setModel(new DefaultListModel()); + } else { + if (abc != null) { + setModel(new TraitsListModel(abc, classIndex)); + } } this.classIndex = classIndex; diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java index effb69206..f1f04fa34 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TraitsListModel.java @@ -41,9 +41,9 @@ public class TraitsListModel implements ListModel { public Object getElementAt(int index) { if (index < abc.class_info[classIndex].static_traits.traits.length) { - return abc.class_info[classIndex].static_traits.traits[index].convert(abc.constants, abc.method_info, abc, true); + return abc.class_info[classIndex].static_traits.traits[index].convert(abc.method_info, abc, true); } else if (index < abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { - return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convert(abc.constants, abc.method_info, abc, false); + return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convert(abc.method_info, abc, false); } else if (index == abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { return STR_INSTANCE_INITIALIZER; } else { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/Tree.java b/trunk/src/com/jpexs/asdec/abc/gui/Tree.java index 47a1f5777..a17ff92cf 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/Tree.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/Tree.java @@ -22,14 +22,14 @@ public class Tree { private final TreeElement ROOT = new TreeElement("", "", -1, null); - public void add(String name, String path, int classIndex) { + public void add(String name, String path, Object item) { StringTokenizer st = new StringTokenizer(path, "."); TreeElement parent = ROOT; while (st.hasMoreTokens()) { String pathElement = st.nextToken(); parent = parent.getBranch(pathElement); } - parent.addLeaf(name, classIndex); + parent.addLeaf(name, item); } public TreeElement getRoot() { diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TreeElement.java b/trunk/src/com/jpexs/asdec/abc/gui/TreeElement.java index b30479389..3d369eac1 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/TreeElement.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/TreeElement.java @@ -25,13 +25,13 @@ public class TreeElement { private SortedMap leafs; private String name; private String path; - private int classIndex; + private Object item; private TreeElement parent; - public TreeElement(String name, String path, int classIndex, TreeElement parent) { + public TreeElement(String name, String path, Object item, TreeElement parent) { this.name = name; this.path = path; - this.classIndex = classIndex; + this.item = item; this.parent = parent; branches = new TreeMap(); leafs = new TreeMap(); @@ -58,8 +58,8 @@ public class TreeElement { return new TreePath(pathList.toArray()); } - public int getClassIndex() { - return classIndex; + public Object getItem() { + return item; } @Override @@ -76,8 +76,8 @@ public class TreeElement { return branch; } - void addLeaf(String pathElement, int classIndex) { - TreeElement child = new TreeElement(pathElement, path + "." + pathElement, classIndex, this); + void addLeaf(String pathElement, Object item) { + TreeElement child = new TreeElement(pathElement, path + "." + pathElement, item, this); leafs.put(pathElement, child); } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafClass.java b/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafClass.java new file mode 100644 index 000000000..a2fa2a106 --- /dev/null +++ b/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafClass.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2012 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.asdec.abc.gui; + +/** + * + * @author JPEXS + */ +public class TreeLeafClass { + + public int classIndex; + + public TreeLeafClass(int classIndex) { + this.classIndex = classIndex; + } +} diff --git a/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafString.java b/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafString.java new file mode 100644 index 000000000..fbfa898d4 --- /dev/null +++ b/trunk/src/com/jpexs/asdec/abc/gui/TreeLeafString.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2012 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.asdec.abc.gui; + +/** + * + * @author JPEXS + */ +public class TreeLeafString { + + public String str; + + public TreeLeafString(String str) { + this.str = str; + } +} diff --git a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java index 6942968e8..6164ca31f 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/ClassInfo.java @@ -17,7 +17,6 @@ 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; public class ClassInfo { @@ -34,7 +33,7 @@ public class ClassInfo { return "method_index=" + cinit_index + "\r\n" + static_traits.toString(abc); } - public String getStaticVarsStr(ConstantPool constants, ABC abc) { - return static_traits.convert(constants, "\tstatic ", abc); + public String getStaticVarsStr(ABC abc) { + return static_traits.convert("\tstatic ", abc); } } diff --git a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java index 8c2ad5e18..7533076dd 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/InstanceInfo.java @@ -43,19 +43,19 @@ public class InstanceInfo { public String toString(ABC abc) { String supIndexStr = "[nothing]"; if (super_index > 0) { - abc.constants.constant_multiname[super_index].toString(abc.constants); + supIndexStr = 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) { + public String getClassHeaderStr(ABC abc) { String supIndexStr = ""; if (super_index > 0) { - supIndexStr = " extends " + constants.constant_multiname[super_index].getName(constants);////+" flags="+flags+" protectedNS="+protectedNS+" interfaces="+Helper.intArrToString(interfaces)+" method_index="+iinit_index + supIndexStr = " extends " + abc.constants.constant_multiname[super_index].getName(abc.constants);////+" flags="+flags+" protectedNS="+protectedNS+" interfaces="+Helper.intArrToString(interfaces)+" method_index="+iinit_index } String modifiers; - Namespace ns = constants.constant_multiname[name_index].getNamespace(constants); - modifiers = ns.getPrefix(constants); + Namespace ns = abc.constants.constant_multiname[name_index].getNamespace(abc.constants); + modifiers = ns.getPrefix(abc); if (!modifiers.equals("")) { modifiers += " "; } @@ -70,11 +70,11 @@ public class InstanceInfo { if ((flags & CLASS_INTERFACE) == CLASS_INTERFACE) { objType = "interface "; } - return modifiers + objType + constants.constant_multiname[name_index].getName(constants) + supIndexStr; + return modifiers + objType + abc.constants.constant_multiname[name_index].getName(abc.constants) + supIndexStr; } - public String getInstanceVarsStr(ConstantPool constants, ABC abc) { - return instance_traits.convert(constants, "\t", abc); + public String getInstanceVarsStr(ABC abc) { + return instance_traits.convert("\t", abc); } public Multiname getName(ConstantPool constants) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/Namespace.java b/trunk/src/com/jpexs/asdec/abc/types/Namespace.java index 151186799..5ed2b645b 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/Namespace.java +++ b/trunk/src/com/jpexs/asdec/abc/types/Namespace.java @@ -16,6 +16,7 @@ */ package com.jpexs.asdec.abc.types; +import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.ConstantPool; public class Namespace { @@ -58,7 +59,7 @@ public class Namespace { return kindStr + (nameStr.equals("") ? "" : " " + nameStr); } - public String getPrefix(ConstantPool constants) { + public String getPrefix(ABC abc) { String kindStr = "?"; for (int k = 0; k < nameSpaceKinds.length; k++) { if (nameSpaceKinds[k] == kind) { 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 54e1600cf..34cc808ef 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Trait.java @@ -42,16 +42,20 @@ public class Trait { public static final int TRAIT_FUNCTION = 5; public static final int TRAIT_CONST = 6; - public String getModifiers(ConstantPool constants, boolean isStatic) { + public String getModifiers(ABC abc, boolean isStatic) { String ret = ""; if ((kindFlags & ATTR_Override) > 0) { ret += "override"; } - Multiname m = getMultiName(constants); + Multiname m = getMultiName(abc.constants); if (m != null) { - Namespace ns = m.getNamespace(constants); + int v = abc.nsValueToName(m.namespace_index); + if (v > -1) { + ret += " " + abc.constants.constant_multiname[v].getName(abc.constants); + } + Namespace ns = m.getNamespace(abc.constants); if (ns != null) { - ret += " " + ns.getPrefix(constants); + ret += " " + ns.getPrefix(abc); } } if (isStatic) { @@ -74,12 +78,12 @@ public class Trait { 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) { - return convert(constants, methodInfo, abc, false); + public String convert(MethodInfo[] methodInfo, ABC abc) { + return convert(methodInfo, abc, false); } - public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc, boolean isStatic) { - return constants.constant_multiname[name_index].toString(constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); + public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + return abc.constants.constant_multiname[name_index].toString(abc.constants) + " kind=" + kindType + " metadata=" + Helper.intArrToString(metadata); } public Multiname getMultiName(ConstantPool constants) { 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 be896a682..ba28349d1 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitMethodGetterSetter.java @@ -33,8 +33,8 @@ public class TraitMethodGetterSetter extends Trait { } @Override - public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc, boolean isStatic) { - String modifier = getModifiers(constants, isStatic) + " "; + public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + String modifier = getModifiers(abc, isStatic) + " "; if (modifier.equals(" ")) { modifier = ""; } @@ -46,7 +46,7 @@ public class TraitMethodGetterSetter extends Trait { addKind = "set "; } MethodBody body = abc.findBody(method_info); - return modifier + "function " + addKind + getMethodName(constants) + "(" + methodInfo[method_info].getParamStr(constants, body, abc) + ") : " + methodInfo[method_info].getReturnTypeStr(constants); + return modifier + "function " + addKind + getMethodName(abc.constants) + "(" + methodInfo[method_info].getParamStr(abc.constants, body, abc) + ") : " + methodInfo[method_info].getReturnTypeStr(abc.constants); } public String getMethodName(ConstantPool constants) { diff --git a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java index a3a97f477..0ad8c4a61 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/TraitSlotConst.java @@ -74,12 +74,12 @@ public class TraitSlotConst extends Trait { } @Override - public String convert(ConstantPool constants, MethodInfo[] methodInfo, ABC abc, boolean isStatic) { - String modifier = getModifiers(constants, isStatic) + " "; + public String convert(MethodInfo[] methodInfo, ABC abc, boolean isStatic) { + String modifier = getModifiers(abc, isStatic) + " "; if (modifier.equals(" ")) { modifier = ""; } - return modifier + getNameValueStr(constants); + return modifier + getNameValueStr(abc.constants); } public boolean isConst() { 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 6c6516dbd..d547b7da6 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/asdec/abc/types/traits/Traits.java @@ -17,7 +17,6 @@ package com.jpexs.asdec.abc.types.traits; import com.jpexs.asdec.abc.ABC; -import com.jpexs.asdec.abc.avm2.ConstantPool; public class Traits { @@ -46,13 +45,13 @@ public class Traits { return s; } - public String convert(ConstantPool constants, String prefix, ABC abc) { + public String convert(String prefix, ABC abc) { String s = ""; for (int t = 0; t < traits.length; t++) { if (t > 0) { s += "\r\n"; } - s += prefix + traits[t].convert(constants, null, abc); + s += prefix + traits[t].convert(null, abc); } return s; } diff --git a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java index b03b81e26..e5dc07924 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/ConstVarMultinameUsage.java @@ -36,10 +36,10 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { return super.toString(abc) + " " + (parentTraitIndex > -1 ? (isStatic - ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc, isStatic)) - : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc, isStatic))) + ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic)) + : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic))) : "") - + ((TraitSlotConst) traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc, isStatic); + + ((TraitSlotConst) traits.traits[traitIndex]).convert(abc.method_info, abc, isStatic); } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java index 0189416ed..df7806436 100644 --- a/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java +++ b/trunk/src/com/jpexs/asdec/abc/usages/MethodMultinameUsage.java @@ -45,10 +45,10 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { : "instance initializer") : ((parentTraitIndex > -1 ? (isStatic - ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc, isStatic)) - : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.constants, abc.method_info, abc, isStatic))) + " " + ? (((TraitMethodGetterSetter) abc.class_info[classIndex].static_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic)) + : (((TraitMethodGetterSetter) abc.instance_info[classIndex].instance_traits.traits[parentTraitIndex]).convert(abc.method_info, abc, isStatic))) + " " : "") - + (((TraitMethodGetterSetter) traits.traits[traitIndex]).convert(abc.constants, abc.method_info, abc, isStatic)))); + + (((TraitMethodGetterSetter) traits.traits[traitIndex]).convert(abc.method_info, abc, isStatic)))); } public int getTraitIndex() { diff --git a/trunk/src/com/jpexs/asdec/action/swf4/ActionPush.java b/trunk/src/com/jpexs/asdec/action/swf4/ActionPush.java index b560d75ab..ab3407715 100644 --- a/trunk/src/com/jpexs/asdec/action/swf4/ActionPush.java +++ b/trunk/src/com/jpexs/asdec/action/swf4/ActionPush.java @@ -61,7 +61,7 @@ public class ActionPush extends Action { values.add(new RegisterNumber(sis.readUI8())); break; case 5: - values.add((Boolean)(sis.readUI8() == 1)); + values.add((Boolean) (sis.readUI8() == 1)); break; case 6: values.add(sis.readDOUBLE()); @@ -143,7 +143,7 @@ public class ActionPush extends Action { switch (symb.type) { case ParsedSymbol.TYPE_STRING: count++; - if (constantPool.contains((String)symb.value)) { + if (constantPool.contains((String) symb.value)) { values.add(new ConstantIndex(constantPool.indexOf(symb.value), constantPool)); } else { values.add(symb.value); diff --git a/trunk/src/com/jpexs/asdec/action/treemodel/clauses/IfTreeItem.java b/trunk/src/com/jpexs/asdec/action/treemodel/clauses/IfTreeItem.java index df5bb219d..6b2553d48 100644 --- a/trunk/src/com/jpexs/asdec/action/treemodel/clauses/IfTreeItem.java +++ b/trunk/src/com/jpexs/asdec/action/treemodel/clauses/IfTreeItem.java @@ -39,7 +39,7 @@ public class IfTreeItem extends TreeItem implements Block { @Override public String toString(ConstantPool constants) { String ret; - ret = hilight("if(") + expression.toString(constants) + hilight(")")+"\r\n{\r\n"; + ret = hilight("if(") + expression.toString(constants) + hilight(")") + "\r\n{\r\n"; for (TreeItem ti : onTrue) { ret += ti.toString(constants) + "\r\n"; } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineButton2Tag.java b/trunk/src/com/jpexs/asdec/tags/DefineButton2Tag.java index f25657c7e..b6fd979e5 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineButton2Tag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineButton2Tag.java @@ -20,7 +20,6 @@ import com.jpexs.asdec.Main; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.SWFOutputStream; import com.jpexs.asdec.abc.CopyOutputStream; -import com.jpexs.asdec.abc.gui.MainFrame; import com.jpexs.asdec.types.BUTTONCONDACTION; import com.jpexs.asdec.types.BUTTONRECORD; import java.io.ByteArrayInputStream; @@ -143,7 +142,7 @@ public class DefineButton2Tag extends Tag implements Container, TagName { sos.writeBUTTONCONDACTIONList(actions); sos.close(); } catch (IOException e) { - Logger.getLogger(DefineButton2Tag.class.getName()).log(Level.SEVERE, null, e); + Logger.getLogger(DefineButton2Tag.class.getName()).log(Level.SEVERE, null, e); } return baos.toByteArray(); } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineButtonTag.java b/trunk/src/com/jpexs/asdec/tags/DefineButtonTag.java index b55623ff1..5897a756c 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineButtonTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineButtonTag.java @@ -126,7 +126,7 @@ public class DefineButtonTag extends Tag implements ASMSource, TagName { try { actions = (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(DefineButtonTag.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(DefineButtonTag.class.getName()).log(Level.SEVERE, null, ex); } return Action.actionsToString(actions, null, version); } diff --git a/trunk/src/com/jpexs/asdec/tags/DoActionTag.java b/trunk/src/com/jpexs/asdec/tags/DoActionTag.java index 0d88c349d..e390c3e79 100644 --- a/trunk/src/com/jpexs/asdec/tags/DoActionTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DoActionTag.java @@ -52,7 +52,7 @@ public class DoActionTag extends Tag implements ASMSource { //actions = sis.readActionList(); actionBytes = sis.readBytes(sis.available()); } catch (IOException e) { - Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, e); + Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, e); } } @@ -78,7 +78,7 @@ public class DoActionTag extends Tag implements ASMSource { try { actions = (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, ex); } return Action.actionsToString(actions, null, version); } @@ -106,7 +106,7 @@ public class DoActionTag extends Tag implements ASMSource { try { return (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(DoActionTag.class.getName()).log(Level.SEVERE, null, ex); return new ArrayList(); } } diff --git a/trunk/src/com/jpexs/asdec/tags/DoInitActionTag.java b/trunk/src/com/jpexs/asdec/tags/DoInitActionTag.java index aff8fd9ab..72b4b8072 100644 --- a/trunk/src/com/jpexs/asdec/tags/DoInitActionTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DoInitActionTag.java @@ -113,7 +113,7 @@ public class DoInitActionTag extends Tag implements ASMSource, TagName { try { actions = (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(DoInitActionTag.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(DoInitActionTag.class.getName()).log(Level.SEVERE, null, ex); } return Action.actionsToString(actions, null, version); } @@ -122,7 +122,7 @@ public class DoInitActionTag extends Tag implements ASMSource, TagName { try { return (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(DoInitActionTag.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(DoInitActionTag.class.getName()).log(Level.SEVERE, null, ex); return new ArrayList(); } } diff --git a/trunk/src/com/jpexs/asdec/tags/Metadata.java b/trunk/src/com/jpexs/asdec/tags/Metadata.java index 4bd5109a3..35b10ec70 100644 --- a/trunk/src/com/jpexs/asdec/tags/Metadata.java +++ b/trunk/src/com/jpexs/asdec/tags/Metadata.java @@ -17,8 +17,6 @@ package com.jpexs.asdec.tags; import java.io.UnsupportedEncodingException; -import java.util.logging.Level; -import java.util.logging.Logger; public class Metadata extends Tag { diff --git a/trunk/src/com/jpexs/asdec/types/BUTTONCONDACTION.java b/trunk/src/com/jpexs/asdec/types/BUTTONCONDACTION.java index d283b8125..8b3900555 100644 --- a/trunk/src/com/jpexs/asdec/types/BUTTONCONDACTION.java +++ b/trunk/src/com/jpexs/asdec/types/BUTTONCONDACTION.java @@ -19,7 +19,6 @@ package com.jpexs.asdec.types; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.action.Action; import com.jpexs.asdec.tags.ASMSource; -import com.jpexs.asdec.tags.DoInitActionTag; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; @@ -116,7 +115,7 @@ public class BUTTONCONDACTION implements ASMSource { try { actions = (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(BUTTONCONDACTION.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(BUTTONCONDACTION.class.getName()).log(Level.SEVERE, null, ex); } return Action.actionsToString(actions, null, version); } @@ -140,7 +139,7 @@ public class BUTTONCONDACTION implements ASMSource { try { return (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(BUTTONCONDACTION.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(BUTTONCONDACTION.class.getName()).log(Level.SEVERE, null, ex); return new ArrayList(); } } diff --git a/trunk/src/com/jpexs/asdec/types/CLIPACTIONRECORD.java b/trunk/src/com/jpexs/asdec/types/CLIPACTIONRECORD.java index b7f978c34..19e92ae83 100644 --- a/trunk/src/com/jpexs/asdec/types/CLIPACTIONRECORD.java +++ b/trunk/src/com/jpexs/asdec/types/CLIPACTIONRECORD.java @@ -19,7 +19,6 @@ package com.jpexs.asdec.types; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.action.Action; import com.jpexs.asdec.tags.ASMSource; -import com.jpexs.asdec.tags.DoInitActionTag; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; @@ -83,7 +82,7 @@ public class CLIPACTIONRECORD implements ASMSource { try { actions = (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(CLIPACTIONRECORD.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(CLIPACTIONRECORD.class.getName()).log(Level.SEVERE, null, ex); } return Action.actionsToString(actions, null, version); } @@ -101,7 +100,7 @@ public class CLIPACTIONRECORD implements ASMSource { try { return (new SWFInputStream(new ByteArrayInputStream(actionBytes), version)).readActionList(); } catch (IOException ex) { - Logger.getLogger(CLIPACTIONRECORD.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(CLIPACTIONRECORD.class.getName()).log(Level.SEVERE, null, ex); return new ArrayList(); } }