Issue #579 AS3 direct editation - removing old class/methods from ABC

This commit is contained in:
Jindra Petřík
2014-05-18 11:19:38 +02:00
parent bf325d72f1
commit f10086a9c0
4 changed files with 137 additions and 5 deletions
+129 -2
View File
@@ -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;i<ins.definition.operands.length;i++){
if(ins.definition.operands[i]==AVM2Code.DAT_CLASS_INDEX){
if(ins.operands[i]>index){
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;b<bodies.size();b++){
if(bodies.get(b).method_info == index){
bodies.remove(b);
bindex = b;
b--;
}
}
for(MethodBody b:bodies){
if(b.method_info>index){
b.method_info--;
}
for(AVM2Instruction ins:b.code.code){
for(int i=0;i<ins.definition.operands.length;i++){
if(ins.definition.operands[i]==AVM2Code.DAT_METHOD_INDEX){
if(ins.operands[i]>index){
ins.operands[i]--;
}
}
}
}
}
for(int c=0;c<instance_info.size();c++){
InstanceInfo ii=instance_info.get(c);
if(ii.iinit_index>index){
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;mi<bodyIdxFromMethodIdx.size();mi++){
if(bodyIdxFromMethodIdx.get(mi)>bindex){
bodyIdxFromMethodIdx.set(mi, bodyIdxFromMethodIdx.get(mi)-1);
}
}
}
bodyIdxFromMethodIdx.remove(index);
method_info.remove(index);
}
public void pack(){
for(int c= 0;c<instance_info.size();c++){
if(instance_info.get(c).deleted){
removeClass(c);
c--;
}
}
for(int m= 0;m<method_info.size();m++){
if(method_info.get(m).deleted){
removeMethod(m);
m--;
}
}
}
}
@@ -2154,7 +2154,11 @@ public class AVM2SourceGenerator implements SourceGenerator {
return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).ret_type,abc.constants);
}
if (tmgs.kindType == Trait.TRAIT_SETTER) {
return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).param_types[0],abc.constants);
if(abc.method_info.get(tmgs.method_info).param_types.length>0){
return PropertyAVM2Item.multinameToType(abc.method_info.get(tmgs.method_info).param_types[0],abc.constants);
}else{
return TypeItem.UNBOUNDED;
}
}
}
if (t instanceof TraitFunction) {
@@ -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;
@@ -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<MyEntry<ClassPath,ScriptPack>> packs = abc.script_info.get(oldIndex).getPacks(abc, oldIndex);