From f10086a9c0e30a37f55d9ddc6a60543e44b06539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 18 May 2014 11:19:38 +0200 Subject: [PATCH] Issue #579 AS3 direct editation - removing old class/methods from ABC --- src/com/jpexs/decompiler/flash/abc/ABC.java | 131 +++++++++++++++++- .../parser/script/AVM2SourceGenerator.java | 6 +- .../flash/abc/types/MethodInfo.java | 2 +- .../decompiler/flash/gui/abc/ABCPanel.java | 3 +- 4 files changed, 137 insertions(+), 5 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/abc/ABC.java b/src/com/jpexs/decompiler/flash/abc/ABC.java index 36cb793cb..4eca016e3 100644 --- a/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -579,7 +579,7 @@ public class ABC { for (int i = 1; i < constants.getMultinameCount(); i++) { aos.writeMultiname(constants.getMultiname(i)); } - + aos.writeU30(method_info.size()); for (MethodInfo mi : method_info) { aos.writeMethodInfo(mi); @@ -596,7 +596,7 @@ public class ABC { aos.writeU30(mi.values[j]); } } - + aos.writeU30(class_info.size()); for (InstanceInfo ii : instance_info) { aos.writeInstanceInfo(ii); @@ -945,4 +945,131 @@ public class ABC { } return null; } + + private void removeClassFromTraits(Traits traits,int index){ + for(Trait t:traits.traits){ + if(t instanceof TraitClass){ + TraitClass tc=(TraitClass)t; + removeClassFromTraits(instance_info.get(tc.class_info).instance_traits,index); + removeClassFromTraits(class_info.get(tc.class_info).static_traits,index); + if(tc.class_info>index){ + tc.class_info--; + } + } + } + } + + public void removeClass(int index){ + for(MethodBody b:bodies){ + for(AVM2Instruction ins:b.code.code){ + for(int i=0;iindex){ + ins.operands[i]--; + } + } + } + } + } + for(ScriptInfo si:script_info){ + removeClassFromTraits(si.traits, index); + } + instance_info.remove(index); + class_info.remove(index); + } + + + private void removeMethodFromTraits(Traits traits,int index){ + for(Trait t:traits.traits){ + if(t instanceof TraitClass){ + TraitClass tc=(TraitClass)t; + removeMethodFromTraits(instance_info.get(tc.class_info).instance_traits,index); + removeMethodFromTraits(class_info.get(tc.class_info).static_traits,index); + } + if(t instanceof TraitMethodGetterSetter){ + TraitMethodGetterSetter tmgs=(TraitMethodGetterSetter)t; + if(tmgs.method_info>index){ + tmgs.method_info--; + } + } + if(t instanceof TraitFunction){ + TraitFunction tf=(TraitFunction)t; + if(tf.method_info>index){ + tf.method_info--; + } + } + } + } + + public void removeMethod(int index){ + + int bindex=-1; + for(int b=0;bindex){ + b.method_info--; + } + for(AVM2Instruction ins:b.code.code){ + for(int i=0;iindex){ + ins.operands[i]--; + } + } + } + } + } + + for(int c=0;cindex){ + ii.iinit_index--; + } + ClassInfo ci=class_info.get(c); + if(ci.cinit_index>index){ + ci.cinit_index--; + } + } + + for(ScriptInfo si:script_info){ + if(si.init_index>index){ + si.init_index--; + } + removeMethodFromTraits(si.traits, index); + } + + if(bindex>-1){ + for(int mi=0;mibindex){ + bodyIdxFromMethodIdx.set(mi, bodyIdxFromMethodIdx.get(mi)-1); + } + } + } + bodyIdxFromMethodIdx.remove(index); + + method_info.remove(index); + } + + public void pack(){ + for(int c= 0;c0){ + return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).param_types[0],abc.constants); + }else{ + return TypeItem.UNBOUNDED; + } } } if (t instanceof TraitFunction) { diff --git a/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index 08f82b6c0..b3518dc2c 100644 --- a/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -29,7 +29,7 @@ import java.util.List; public class MethodInfo { - private boolean deleted; + public boolean deleted; public void delete(ABC abc,boolean d){ this.deleted = true; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 84ef7cb77..60f236d03 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -689,7 +689,8 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se //Move newly added script to its position abc.script_info.set(oldIndex, abc.script_info.get(newIndex)); abc.script_info.remove(newIndex); - ((Tag) abc.parentTag).setModified(true); + abc.pack(); //removes old classes/methods + ((Tag) abc.parentTag).setModified(true); lastDecompiled = decompiledTextArea.getText(); mainPanel.updateClassesList(); List> packs = abc.script_info.get(oldIndex).getPacks(abc, oldIndex);