From 480af129e881ccf70477563ece1247042c47730c Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 11 Jul 2015 21:43:32 +0200 Subject: [PATCH] trait is cloneable now --- .../decompiler/flash/abc/avm2/AVM2Code.java | 8 ++++++-- .../flash/abc/types/MethodBody.java | 19 ++++++++++++++---- .../flash/abc/types/traits/Trait.java | 12 ++++++++++- .../flash/abc/types/traits/TraitClass.java | 6 ++++++ .../flash/abc/types/traits/TraitFunction.java | 6 ++++++ .../types/traits/TraitMethodGetterSetter.java | 6 ++++++ .../abc/types/traits/TraitSlotConst.java | 6 ++++++ .../flash/abc/types/traits/Traits.java | 20 ++++++++++++++++++- 8 files changed, 75 insertions(+), 8 deletions(-) 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 7096854ee..a129b0937 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 @@ -1468,7 +1468,7 @@ public class AVM2Code implements Cloneable { //if(true) return ""; toSourceCount++; if (toSourceLimit > 0) { - if (toSourceCount > toSourceLimit) { + if (toSourceCount >= toSourceLimit) { throw new ConvertException("Limit of subs(" + toSourceLimit + ") was reached", start); } } @@ -2897,7 +2897,6 @@ public class AVM2Code implements Cloneable { for (int i = 0; i < code.size(); i++) { code.get(i).mappedOffset = ofs; ofs += code.get(i).getBytesLength(); - } } @@ -3353,6 +3352,11 @@ public class AVM2Code implements Cloneable { } ret.code = codeCopy; } + + cacheActual = false; + ignoredIns = new ArrayList<>(); + killedRegs = new HashMap<>(); + unknownJumps = new ArrayList<>(); return ret; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index 78dddb48a..6fdfaa16f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -286,8 +286,9 @@ public final class MethodBody implements Cloneable { public Void call() throws InterruptedException { MethodBody converted = convertMethodBody(path, isStatic, scriptIndex, classIndex, abc, trait, constants, method_info, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits); HashMap localRegNames = getLocalRegNames(abc); - convertedItems = converted.getCode().toGraphTargetItems(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, converted, localRegNames, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits, Graph.SOP_USE_STATIC, new HashMap<>(), converted.getCode().visitCode(converted)); - Graph.graphToString(convertedItems, writer, LocalData.create(constants, localRegNames, fullyQualifiedNames)); + List convertedItems1 = converted.getCode().toGraphTargetItems(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, converted, localRegNames, scopeStack, isStaticInitializer, fullyQualifiedNames, initTraits, Graph.SOP_USE_STATIC, new HashMap<>(), converted.getCode().visitCode(converted)); + Graph.graphToString(convertedItems1, writer, LocalData.create(constants, localRegNames, fullyQualifiedNames)); + convertedItems = convertedItems1; return null; } }; @@ -359,7 +360,11 @@ public final class MethodBody implements Cloneable { throw ex; } catch (Throwable ex) { //ignore - return this; + body = clone(); + code = body.getCode(); + code.markMappedOffsets(); + code.fixJumps(path, body); + return body; } } @@ -381,7 +386,13 @@ public final class MethodBody implements Cloneable { } } - //maybe deep clone traits + // maybe deep clone traits + /*if (traits != null) { + ret.traits = traits.clone(); + }*/ + convertedItems = null; + convertException = null; + return ret; } catch (CloneNotSupportedException ex) { throw new RuntimeException(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index c71c05bd2..4f419cc1f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -29,7 +29,7 @@ import com.jpexs.helpers.Helper; import java.io.Serializable; import java.util.List; -public abstract class Trait implements Serializable { +public abstract class Trait implements Cloneable, Serializable { private static final int[] EMPTY_METADATA_ARRAY = new int[0]; @@ -193,4 +193,14 @@ public abstract class Trait implements Serializable { String objectName = name.getName(abc.constants, null, false); return new ClassPath(packageName, objectName); //assume not null name } + + @Override + public Trait clone() { + try { + Trait ret = (Trait) super.clone(); + return ret; + } catch (CloneNotSupportedException ex) { + throw new RuntimeException(); + } + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index dc2dae693..0e29d9df5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -595,4 +595,10 @@ public class TraitClass extends Trait implements TraitWithSlot { ret += classInfo.static_traits.removeTraps(scriptIndex, class_info, true, abc, path); return ret; } + + @Override + public TraitClass clone() { + TraitClass ret = (TraitClass) super.clone(); + return ret; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index e1b2e06d0..e7b41acb6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -109,4 +109,10 @@ public class TraitFunction extends Trait implements TraitWithSlot { } return 0; } + + @Override + public TraitFunction clone() { + TraitFunction ret = (TraitFunction) super.clone(); + return ret; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 80d583215..c15f42a4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -114,4 +114,10 @@ public class TraitMethodGetterSetter extends Trait { } return 0; } + + @Override + public TraitMethodGetterSetter clone() { + TraitMethodGetterSetter ret = (TraitMethodGetterSetter) super.clone(); + return ret; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java index d5b6cbe25..ae2d114f6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/TraitSlotConst.java @@ -181,4 +181,10 @@ public class TraitSlotConst extends Trait implements TraitWithSlot { //do nothing return 0; } + + @Override + public TraitSlotConst clone() { + TraitSlotConst ret = (TraitSlotConst) super.clone(); + return ret; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index f1fd02df6..c9cb189cb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -32,7 +32,7 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; -public class Traits implements Serializable { +public class Traits implements Cloneable, Serializable { public List traits; @@ -213,4 +213,22 @@ public class Traits implements Serializable { executor.shutdown(); } } + + @Override + public Traits clone() { + try { + Traits ret = (Traits) super.clone(); + + if (traits != null) { + ret.traits = new ArrayList<>(traits.size()); + for (int i = 0; i < traits.size(); i++) { + ret.traits.add(traits.get(i).clone()); + } + } + + return ret; + } catch (CloneNotSupportedException ex) { + throw new RuntimeException(); + } + } }