diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index d4dba4d6f..93fe40a57 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -890,7 +890,9 @@ public class ABC { } public boolean isStaticTraitId(int classIndex, int traitId) { - if (traitId < class_info.get(classIndex).static_traits.traits.size()) { + if (classIndex == -1) { + return true; + } else if (traitId < class_info.get(classIndex).static_traits.traits.size()) { return true; } else if (traitId < class_info.get(classIndex).static_traits.traits.size() + instance_info.get(classIndex).instance_traits.traits.size()) { return false; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index f2fb15686..1b3f9f659 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -240,6 +240,10 @@ public class ScriptPack extends AS3ClassTreeItem { } Trait trait = traits.get(t); + + if (!(trait instanceof TraitClass)) { + writer.startTrait(t); + } Multiname name = trait.getName(abc); Namespace ns = name.getNamespace(abc.constants); if ((ns.kind == Namespace.KIND_PACKAGE) || (ns.kind == Namespace.KIND_PACKAGE_INTERNAL)) { @@ -247,7 +251,9 @@ public class ScriptPack extends AS3ClassTreeItem { } else { trait.toString(null, convertData, "", abc, false, exportMode, scriptIndex, -1, writer, new ArrayList<>(), parallel); } - + if (!(trait instanceof TraitClass)) { + writer.endTrait(); + } first = false; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index f7d01ae45..203ccad43 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1314,7 +1314,7 @@ public class AVM2Code implements Cloneable { } writer.newLine(); int ip = 0; - int largeLimit = 20000; + int largeLimit = Configuration.limitAs3PCodeOffsetMatching.get(); boolean markOffsets = code.size() <= largeLimit; if (exportMode == ScriptExportMode.HEX) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 80a067fb6..879a0f0c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -697,6 +697,10 @@ public final class Configuration { @ConfigurationCategory("ui") public static ConfigurationItem useAsTypeIcons = null; + @ConfigurationDefaultInt(20000) + @ConfigurationCategory("limit") + public static ConfigurationItem limitAs3PCodeOffsetMatching = null; + private enum OSId { WINDOWS, OSX, UNIX } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 92b55e8ff..8daedbf67 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -113,6 +113,12 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL } public Trait getCurrentTrait() { + if (lastTraitIndex < 0) { + return null; + } + if (classIndex == -1) { + return script.abc.script_info.get(script.scriptIndex).traits.traits.get(lastTraitIndex); + } return script.abc.findTraitByTraitId(classIndex, lastTraitIndex); } @@ -550,12 +556,11 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL currentTraitHighlight = Highlighting.searchPos(highlightedText.getTraitHighlights(), pos); if (currentTraitHighlight != null) { lastTraitIndex = (int) currentTraitHighlight.getProperties().index; - if (classIndex != -1) { - currentTrait = getCurrentTrait(); - isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); - if (currentTrait != null) { - name += ":" + currentTrait.getName(abc).getName(abc.constants, null, false, true); - } + + currentTrait = getCurrentTrait(); + isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); + if (currentTrait != null) { + name += ":" + currentTrait.getName(abc).getName(abc.constants, null, false, true); } } @@ -566,8 +571,8 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL if (classIndex == -1) { abcPanel.navigator.setClassIndex(-1, script.scriptIndex); - setNoTrait(); - return; + //setNoTrait(); + //return; } Trait currentTrait; currentTraitHighlight = Highlighting.searchPos(highlightedText.getTraitHighlights(), pos); @@ -595,14 +600,23 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL } currentMethodHighlight = null; //currentTrait = null; - String name = abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants, true).toPrintableString(true); + String name = classIndex == -1 ? "" : abc.instance_info.get(classIndex).getName(abc.constants).getNameWithNamespace(abc.constants, true).toPrintableString(true); currentTrait = getCurrentTrait(); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); if (currentTrait != null) { - name += ":" + currentTrait.getName(abc).getName(abc.constants, null, false, true); + if (!name.isEmpty()) { + name += ":"; + } + name += currentTrait.getName(abc).getName(abc.constants, null, false, true); } - displayMethod(pos, abc.findMethodIdByTraitId(classIndex, lastTraitIndex), name, currentTrait, lastTraitIndex, isStatic); + int methodId; + if (classIndex > -1) { + methodId = abc.findMethodIdByTraitId(classIndex, lastTraitIndex); + } else { + methodId = ((TraitMethodGetterSetter) abc.script_info.get(script.scriptIndex).traits.traits.get(lastTraitIndex)).method_info; + } + displayMethod(pos, methodId, name, currentTrait, lastTraitIndex, isStatic); return; } setNoTrait(); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties index 11649929b..1d8bc2749 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -520,3 +520,7 @@ config.description.displayAs3TraitsListAndConstantsPanel = Show panel with list config.name.useAsTypeIcons = Use script icons based on item type config.description.useAsTypeIcons = Use different icons for different script types (class/interface/frame/...) +config.name.limitAs3PCodeOffsetMatching = Limit of AS3 P-code offset matching +config.description.limitAs3PCodeOffsetMatching = Limit of instructions in AS3 P-code which are offset-matched to AS3 script + +