From 1f042c375b1aa39673939439c947c781e913b1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 3 Jul 2011 11:42:20 +0200 Subject: [PATCH] AS3: ApplyType instruction, TypeName name, Vector types AS3: Fixed calling with pop --- trunk/src/com/jpexs/asdec/abc/ABC.java | 2 +- .../com/jpexs/asdec/abc/ABCInputStream.java | 2 +- .../com/jpexs/asdec/abc/avm2/AVM2Code.java | 4 +- .../abc/avm2/instructions/stack/PopIns.java | 31 ++++++++- .../avm2/instructions/types/ApplyTypeIns.java | 63 +++++++++++++++++++ .../abc/avm2/treemodel/ApplyTypeTreeItem.java | 55 ++++++++++++++++ .../com/jpexs/asdec/abc/types/Multiname.java | 33 ++++++---- 7 files changed, 173 insertions(+), 17 deletions(-) create mode 100644 trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java create mode 100644 trunk/src/com/jpexs/asdec/abc/avm2/treemodel/ApplyTypeTreeItem.java diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index e475aacac..aacba84af 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -113,7 +113,7 @@ public class ABC { //System.out.println("Reading "+constant_multiname_pool_count+" multinames"); constants.constant_multiname = new Multiname[constant_multiname_pool_count]; for (int i = 1; i < constant_multiname_pool_count; i++) { //index 0 not used. Values 1..n-1 - constants.constant_multiname[i] = ais.readMultiname(); + constants.constant_multiname[i] = ais.readMultiname(); //System.out.println("Multiname read:"+constants.constant_multiname[i]); //cleanNamespace(constants.constant_multiname[i].name_index); } diff --git a/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java b/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java index 13126272f..739ae38fb 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java +++ b/trunk/src/com/jpexs/asdec/abc/ABCInputStream.java @@ -207,7 +207,7 @@ public class ABCInputStream extends InputStream { int paramsLength=readU30(); for(int i=0;i localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { if (stack.size() > 0) - stack.pop(); + { + TreeItem top=stack.pop(); + if(top instanceof CallPropertyTreeItem) + { + output.add(top); + }else + if(top instanceof CallSuperTreeItem) + { + output.add(top); + }else + if(top instanceof CallStaticTreeItem) + { + output.add(top); + } + else + if(top instanceof CallMethodTreeItem) + { + output.add(top); + } + else + if(top instanceof CallTreeItem) + { + output.add(top); + } + } } } diff --git a/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java new file mode 100644 index 000000000..5f7c3ff0d --- /dev/null +++ b/trunk/src/com/jpexs/asdec/abc/avm2/instructions/types/ApplyTypeIns.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2010-2011 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 2 + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package com.jpexs.asdec.abc.avm2.instructions.types; + +import com.jpexs.asdec.abc.avm2.AVM2Code; +import com.jpexs.asdec.abc.avm2.ConstantPool; +import com.jpexs.asdec.abc.avm2.LocalDataArea; +import com.jpexs.asdec.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; +import com.jpexs.asdec.abc.avm2.treemodel.ApplyTypeTreeItem; +import com.jpexs.asdec.abc.avm2.treemodel.TreeItem; +import com.jpexs.asdec.abc.types.MethodInfo; +import java.util.ArrayList; +import java.util.Collections; + +import java.util.List; +import java.util.Stack; + + +public class ApplyTypeIns extends InstructionDefinition { + + public ApplyTypeIns() { + super(0x53,"applytype",new int[]{AVM2Code.DAT_ARG_COUNT}); + } + + @Override + public void execute(LocalDataArea lda, ConstantPool constants, List arguments) { + int argCount = (int) ((Long) arguments.get(0)).longValue(); + List params = new ArrayList(); + for (int i = 0;i + } + + @Override + public void translate(boolean isStatic, int classIndex, java.util.HashMap localRegs, Stack stack, java.util.Stack scopeStack, ConstantPool constants, AVM2Instruction ins, MethodInfo[] method_info, List output, com.jpexs.asdec.abc.types.MethodBody body, com.jpexs.asdec.abc.ABC abc) { + int argCount = ins.operands[0]; + List params = new ArrayList(); + for (int i = 0;i params; + + public ApplyTypeTreeItem(AVM2Instruction instruction, TreeItem object, List params) { + super(instruction, PRECEDENCE_PRIMARY); + this.params=params; + this.object=object; + } + + + @Override + public String toString(ConstantPool constants) { + String ret=object.toString(constants); + if(!params.isEmpty()) + { + ret+=hilight(".<"); + for(int i=0;i0){ + ret+=hilight(","); + } + ret+=params.get(i).toString(constants); + } + ret+=hilight(">"); + } + return ret; + } + +} diff --git a/trunk/src/com/jpexs/asdec/abc/types/Multiname.java b/trunk/src/com/jpexs/asdec/abc/types/Multiname.java index 2c1273853..16113ef43 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/Multiname.java +++ b/trunk/src/com/jpexs/asdec/abc/types/Multiname.java @@ -137,25 +137,34 @@ public class Multiname { } String typeNameStr=""; if(kind==TYPENAME){ - typeNameStr="Type: "+constants.constant_multiname[qname_index].toString(constants); - if(!params.isEmpty()){ - typeNameStr+="<"; - for(int i=0;i0){ - typeNameStr+=","; - } - typeNameStr+=constants.constant_multiname[params.get(i)].toString(constants); - } - typeNameStr+=">"; - } + typeNameStr=typeNameToStr(constants); } return namespaceStr + nameStr + namespaceSetStr + typeNameStr; } + private String typeNameToStr(ConstantPool constants){ + String typeNameStr=constants.constant_multiname[qname_index].getName(constants); + if(!params.isEmpty()){ + typeNameStr+=".<"; + for(int i=0;i0){ + typeNameStr+=","; + } + typeNameStr+=constants.constant_multiname[params.get(i)].getName(constants); + } + typeNameStr+=">"; + } + return typeNameStr; + } + public String getName(ConstantPool constants) { + if(kind==TYPENAME) + { + return typeNameToStr(constants); + } if (name_index == -1) { return ""; }