From 0896cf8236469877d17729a8ddff30fe8eebd64b Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Mon, 11 Jul 2016 20:23:36 +0200 Subject: [PATCH] StackMapTable funktioniert --- lib/commons-bcel6-6.0-SNAPSHOT.jar | Bin 691302 -> 691267 bytes .../bytecode/ClassGenerator.java | 4 +- .../bytecode/MethodGenerator.java | 1 - .../bytecode/stackmaptable/CodeHelper.java | 710 ------------------ 4 files changed, 2 insertions(+), 713 deletions(-) delete mode 100644 src/de/dhbwstuttgart/bytecode/stackmaptable/CodeHelper.java diff --git a/lib/commons-bcel6-6.0-SNAPSHOT.jar b/lib/commons-bcel6-6.0-SNAPSHOT.jar index fb9a8ed3c89ca3074d69d86445920d4a3fed1973..1512826c4eb71e56a037035dc178e32689303613 100644 GIT binary patch delta 32478 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
0+WN(AF%UBw~)@j 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 delta 32792 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 diff --git a/src/de/dhbwstuttgart/bytecode/ClassGenerator.java b/src/de/dhbwstuttgart/bytecode/ClassGenerator.java index bf5d7cd3..b05cf234 100644 --- a/src/de/dhbwstuttgart/bytecode/ClassGenerator.java +++ b/src/de/dhbwstuttgart/bytecode/ClassGenerator.java @@ -172,8 +172,8 @@ public class ClassGenerator extends ClassGen{ @Override public void addMethod(Method m) { - String methodNameAndTypes = m.getReturnType().toString()+m.getName()+Arrays.toString(m.getArgumentTypes()); - + //TODO: Die Prüfung, ob Methode bereits vorhanden vor die Bytecodegenerierung verlegen (Beispielsweise in Method) + String methodNameAndTypes = m.getReturnType().toString()+";"+m.getName()+"("+Arrays.toString(m.getArgumentTypes()); if(methodsNamesAndTypes.contains(methodNameAndTypes)){ return; diff --git a/src/de/dhbwstuttgart/bytecode/MethodGenerator.java b/src/de/dhbwstuttgart/bytecode/MethodGenerator.java index 04bab9a8..25f558cd 100644 --- a/src/de/dhbwstuttgart/bytecode/MethodGenerator.java +++ b/src/de/dhbwstuttgart/bytecode/MethodGenerator.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.generic.Type; import org.apache.commons.bcel6.Const; -import de.dhbwstuttgart.bytecode.stackmaptable.CodeHelper; import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.Section; import de.dhbwstuttgart.syntaxtree.FormalParameter; diff --git a/src/de/dhbwstuttgart/bytecode/stackmaptable/CodeHelper.java b/src/de/dhbwstuttgart/bytecode/stackmaptable/CodeHelper.java deleted file mode 100644 index f03aadc5..00000000 --- a/src/de/dhbwstuttgart/bytecode/stackmaptable/CodeHelper.java +++ /dev/null @@ -1,710 +0,0 @@ -package de.dhbwstuttgart.bytecode.stackmaptable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Stack; - -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ASTORE; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.BasicType; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.DSTORE; -import org.apache.commons.bcel6.generic.GETFIELD; -import org.apache.commons.bcel6.generic.GotoInstruction; -import org.apache.commons.bcel6.generic.IINC; -import org.apache.commons.bcel6.generic.INVOKEDYNAMIC; -import org.apache.commons.bcel6.generic.INVOKEINTERFACE; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.StackMapEntry; -import org.apache.commons.bcel6.classfile.StackMapType; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.InstructionTargeter; -import org.apache.commons.bcel6.generic.InvokeInstruction; -import org.apache.commons.bcel6.generic.LDC; -import org.apache.commons.bcel6.generic.NEW; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUTFIELD; -import org.apache.commons.bcel6.generic.ReferenceType; -import org.apache.commons.bcel6.generic.StoreInstruction; -import org.apache.commons.bcel6.generic.Type; - -import de.dhbwstuttgart.bytecode.MethodGenerator; -import de.dhbwstuttgart.typeinference.Menge; - -class JVMState{ - - HashMap localVars = new HashMap<>(); - Stack stack = new Stack(); - - public StackItem getLocalType(int index) { - return localVars.get(index); - } - - public void set(int index, StackItem objectRef) { - localVars.put(index, objectRef); - } - - public void push(StackItem si){ - - } - - void pop(int i){ - - } - - public StackItem pop() { - // TODO Auto-generated method stub - return null; - } - - public Menge getStackTypes(ConstantPoolGen cp){ - Menge ret = new Menge(); - for(StackItem si : stack){ - ret.add(si.getType(cp)); - } - return ret; - } - - public Menge getLocalTypes(ConstantPoolGen cp) { - Menge ret = new Menge(); - //TODO - return ret; - } - - -} - -interface StackItem{ - public static final StackItem NULL = new StackItemNull(); - public static final StackItem INTEGER = new StackItemType(BasicType.INT); - public static final StackItem FLOAT = new StackItemType(BasicType.FLOAT); - public static final StackItem LONG = new StackItemType(BasicType.LONG); - public static final StackItem DOUBLE = new StackItemType(BasicType.DOUBLE); - public static final StackItem TOP = new StackItemTop(); - - StackMapType getType(ConstantPoolGen cp); -} - -class StackItemNull implements StackItem{ - - @Override - public StackMapType getType(ConstantPoolGen cp) { - return new StackMapType(Const.ITEM_Null, 0, cp.getConstantPool()); - } -} -class StackItemType implements StackItem{ - - Type t = null; - - //TODO: BasicType kann auch Void sein, dann ändert sich nichts am Stack - public StackItemType(BasicType b){ - t=b; - } - public StackItemType(ReferenceType r){ - t=r; - } - public StackItemType(Type t){ - t=t; - } - @Override - public StackMapType getType(ConstantPoolGen cp) { - if(t instanceof BasicType){ - return null;//TODO - }else if(t instanceof ObjectType){ - int classInfo = cp.addClass(((ObjectType)t)); - return new StackMapType(Const.ITEM_Object,classInfo,cp.getConstantPool()); - }else if(t instanceof ArrayType){ - return null; //TODO - }else{ - return null; - } - } -} -class StackItemTop implements StackItem{ - - @Override - public StackMapType getType(ConstantPoolGen cp) { - return new StackMapType(Const.ITEM_Bogus,0,cp.getConstantPool()); - } - -} -class StackItemUninitialized implements StackItem{ - private NEW newIns; - private InstructionHandle handle; - public StackItemUninitialized(NEW newInstruction, InstructionHandle instructionHandle){ - newIns = newInstruction; - handle = instructionHandle; - } - - @Override - public StackMapType getType(ConstantPoolGen cp) { - return new StackMapType(Const.ITEM_NewObject,handle.getPosition(),cp.getConstantPool()); - } - -} -/* -class StackItemObject implements StackItem{ - public StackItemObject(String objName){ - - } -} -*/ -public class CodeHelper { - - private ArrayList outputStack = new ArrayList<>(); - - /** - * Generiert die StackMapEntrys zu einer gegebenen Methode - * @param forCode - * @return - */ - public static Menge getStackMapEntries(InstructionList forCode, ConstantPoolGen cp){ - Menge ret = new Menge<>(); - JVMState state = new JVMState(); - if(forCode.isEmpty())return new Menge<>(); - forCode.setPositions(); //Otherwise InstructionHandle positions are wrong - Instruction[] instructions = forCode.getInstructions(); - InstructionHandle[] instructionHandles = forCode.getInstructionHandles(); - int lastPosition = 0; - - for(InstructionHandle ih : forCode.getInstructionHandles()){ - getOutput(ih, state, cp); - if(isFrameEndpoint(ih, forCode)){ - if(!state.stack.isEmpty()){ - StackMapEntry entry = generateFullFrame(ih.getPosition(),state, cp); - ret.add(entry); - }else{ - int offset = ih.getPosition()-lastPosition; - ret.add(new StackMapEntry(Const.SAME_FRAME + offset, 0, null, null, cp.getConstantPool())); - } - lastPosition = ih.getPosition()+1; - } - } - return ret; - } - - public static StackMapEntry generateFullFrame(int bytecodeOffset, JVMState state, ConstantPoolGen cp){ - Menge stackTypes = state.getStackTypes(cp); - Menge localTypes = state.getLocalTypes(cp); - StackMapType[] st = null; - StackMapType[] lt = null; - if(!stackTypes.isEmpty())st = stackTypes.toArray(); - if(!localTypes.isEmpty())lt = localTypes.toArray(); - StackMapEntry ret = new StackMapEntry(Const.FULL_FRAME,bytecodeOffset, lt, st, cp.getConstantPool()); - return ret; - } - - /** - * Ein Frame hört bei einem unconditionalBranch auf bzw. fängt bei dem Sprungziel eines Branches an. - * @see https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1 - * @param position - * @param inCode - * @return - */ - private static boolean isFrameEndpoint(InstructionHandle position, InstructionList inCode){ - if(position.getInstruction() instanceof GotoInstruction){ - //Falls Instruktion ein unconditional Branch ist: - return true; - } - for(InstructionHandle i : inCode.getInstructionHandles()){ - if(i.hasTargeters()){ - for(InstructionTargeter target : i.getTargeters()){ - if(target.containsTarget(position))return true; - } - } - /* - if(i instanceof BranchInstruction){ - inCode.getInstructionHandles()[1].getTargeters() - if(((BranchInstruction) i).containsTarget(position)){ - return true; - } - } - */ - } - return false; - } - - static void getOutput(InstructionHandle instructionHandle, JVMState ret, ConstantPoolGen cp){ - /* - * TODO: - * Berechnet den Output auf den Stack und ändert den LocalVarState und den StackState je nach Instruktion ab - */ - Instruction ins = instructionHandle.getInstruction(); - int opcode = ins.getOpcode(); - StackItem t1,t2,t3,t4; - switch (opcode) { - case Const.NOP: - case Const.INEG: - case Const.LNEG: - case Const.FNEG: - case Const.DNEG: - case Const.I2B: - case Const.I2C: - case Const.I2S: - case Const.GOTO: - case Const.RETURN: - break; - case Const.ACONST_NULL: - ret.push(StackItem.NULL); - break; - case Const.ICONST_M1: - case Const.ICONST_0: - case Const.ICONST_1: - case Const.ICONST_2: - case Const.ICONST_3: - case Const.ICONST_4: - case Const.ICONST_5: - case Const.BIPUSH: - case Const.SIPUSH: - case Const.ILOAD: - ret.push(StackItem.INTEGER); - break; - case Const.LCONST_0: - case Const.LCONST_1: - case Const.LLOAD: - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case Const.FCONST_0: - case Const.FCONST_1: - case Const.FCONST_2: - case Const.FLOAD: - ret.push(StackItem.FLOAT); - break; - case Const.DCONST_0: - case Const.DCONST_1: - case Const.DLOAD: - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - break; - case Const.LDC: - LDC ldcIns = (LDC) ins; - Type t = ldcIns.getType(cp); - if(t.equals(Type.STRING)){ - ret.push(new StackItemType(Type.STRING)); - }else if(t.equals(Type.INT)){ - ret.push(StackItem.INTEGER); - }else if(t.equals(Type.FLOAT)){ - ret.push(StackItem.FLOAT); - }else if(t.equals(Type.DOUBLE)){ - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - }else if(t.equals(Type.FLOAT)){ - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - }else if(t.equals(Type.CLASS)){ - ret.push(new StackItemType(Type.CLASS)); - } - /* - switch (item.type) { - case ClassWriter.INT: - ret.push(StackItem.INTEGER); - break; - case ClassWriter.StackItem.LONG: - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case ClassWriter.StackItem.FLOAT: - ret.push(StackItem.FLOAT); - break; - case ClassWriter.StackItem.DOUBLE: - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - break; - case ClassWriter.CLASS: - ret.push(new StackItemOBJECT("java/lang/Class")); - break; - case ClassWriter.STR: - ret.push(new StackItemOBJECT("java/lang/String")); - break; - case ClassWriter.MTYPE: - ret.push(new StackItemOBJECT("java/lang/invoke/MethodType")); - break; - // case ClassWriter.HANDLE_BASE + [1..9]: - default: - ret.push(new StackItemOBJECT("java/lang/invoke/MethodHandle")); - break; - } - */ - break; - case Const.ALOAD: - ALOAD aloadIns = (ALOAD) ins; - ret.push(ret.getLocalType(aloadIns.getIndex())); - break; - case Const.IALOAD: - case Const.BALOAD: - case Const.CALOAD: - case Const.SALOAD: - ret.pop(2); - ret.push(StackItem.INTEGER); - break; - case Const.LALOAD: - case Const.D2L: - ret.pop(2); - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case Const.FALOAD: - ret.pop(2); - ret.push(StackItem.FLOAT); - break; - case Const.DALOAD: - case Const.L2D: - ret.pop(2); - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - break; - case Const.AALOAD: - ret.pop(1); - StackItem arrayReference = ret.pop(); - ret.push(arrayReference); //TODO: Fixen, es darf nicht die ArrayReference sonder der Typ eines Elements des Arrays auf den Stack - //ret.push(ELEMENT_OF + t1); - break; - case Const.ISTORE: - case Const.FSTORE: - case Const.ASTORE: - StoreInstruction storeIns = (StoreInstruction)ins; - t1 = ret.pop(); - ret.set(storeIns.getIndex(), t1); - if (storeIns.getIndex() > 0) { - t2 = ret.getLocalType(storeIns.getIndex() - 1); - // if t2 is of kind STACK or LOCAL we cannot know its size! - if (t2 == StackItem.LONG || t2 == StackItem.DOUBLE) { - ret.set(storeIns.getIndex() - 1, StackItem.TOP); - } - //TODO: - /*else if ((t2 & KIND) != BASE) { - set(arg - 1, t2 | StackItem.TOP_IF_StackItem.LONG_OR_StackItem.DOUBLE); - }*/ - } - break; - case Const.LSTORE: - case Const.DSTORE: - StoreInstruction largeStoreIns = (StoreInstruction)ins; - ret.pop(1); - t1 = ret.pop(); - ret.set(largeStoreIns.getIndex(), t1); - ret.set(largeStoreIns.getIndex() + 1, StackItem.TOP); - if (largeStoreIns.getIndex() > 0) { - t2 = ret.getLocalType(largeStoreIns.getIndex() - 1); - // if t2 is of kind STACK or LOCAL we cannot know its size! - if (t2 == StackItem.LONG || t2 == StackItem.DOUBLE) { - ret.set(largeStoreIns.getIndex() - 1, StackItem.TOP); - } //TODO: - /*else if ((t2 & KIND) != BASE) { - set(arg - 1, t2 | StackItem.TOP_IF_StackItem.LONG_OR_StackItem.DOUBLE); - }*/ - } - break; - case Const.IASTORE: - case Const.BASTORE: - case Const.CASTORE: - case Const.SASTORE: - case Const.FASTORE: - case Const.AASTORE: - ret.pop(3); - break; - case Const.LASTORE: - case Const.DASTORE: - ret.pop(4); - break; - case Const.POP: - case Const.IFEQ: - case Const.IFNE: - case Const.IFLT: - case Const.IFGE: - case Const.IFGT: - case Const.IFLE: - case Const.IRETURN: - case Const.FRETURN: - case Const.ARETURN: - case Const.TABLESWITCH: - case Const.LOOKUPSWITCH: - case Const.ATHROW: - case Const.MONITORENTER: - case Const.MONITOREXIT: - case Const.IFNULL: - case Const.IFNONNULL: - ret.pop(1); - break; - case Const.POP2: - case Const.IF_ICMPEQ: - case Const.IF_ICMPNE: - case Const.IF_ICMPLT: - case Const.IF_ICMPGE: - case Const.IF_ICMPGT: - case Const.IF_ICMPLE: - case Const.IF_ACMPEQ: - case Const.IF_ACMPNE: - case Const.LRETURN: - case Const.DRETURN: - ret.pop(2); - break; - case Const.DUP: - t1 = ret.pop(); - ret.push(t1); - ret.push(t1); - break; - case Const.DUP_X1: - t1 = ret.pop(); - t2 = ret.pop(); - ret.push(t1); - ret.push(t2); - ret.push(t1); - break; - case Const.DUP_X2: - t1 = ret.pop(); - t2 = ret.pop(); - t3 = ret.pop(); - ret.push(t1); - ret.push(t3); - ret.push(t2); - ret.push(t1); - break; - case Const.DUP2: - t1 = ret.pop(); - t2 = ret.pop(); - ret.push(t2); - ret.push(t1); - ret.push(t2); - ret.push(t1); - break; - case Const.DUP2_X1: - t1 = ret.pop(); - t2 = ret.pop(); - t3 = ret.pop(); - ret.push(t2); - ret.push(t1); - ret.push(t3); - ret.push(t2); - ret.push(t1); - break; - case Const.DUP2_X2: - t1 = ret.pop(); - t2 = ret.pop(); - t3 = ret.pop(); - t4 = ret.pop(); - ret.push(t2); - ret.push(t1); - ret.push(t4); - ret.push(t3); - ret.push(t2); - ret.push(t1); - break; - case Const.SWAP: - t1 = ret.pop(); - t2 = ret.pop(); - ret.push(t1); - ret.push(t2); - break; - case Const.IADD: - case Const.ISUB: - case Const.IMUL: - case Const.IDIV: - case Const.IREM: - case Const.IAND: - case Const.IOR: - case Const.IXOR: - case Const.ISHL: - case Const.ISHR: - case Const.IUSHR: - case Const.L2I: - case Const.D2I: - case Const.FCMPL: - case Const.FCMPG: - ret.pop(2); - ret.push(StackItem.INTEGER); - break; - case Const.LADD: - case Const.LSUB: - case Const.LMUL: - case Const.LDIV: - case Const.LREM: - case Const.LAND: - case Const.LOR: - case Const.LXOR: - ret.pop(4); - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case Const.FADD: - case Const.FSUB: - case Const.FMUL: - case Const.FDIV: - case Const.FREM: - case Const.L2F: - case Const.D2F: - ret.pop(2); - ret.push(StackItem.FLOAT); - break; - case Const.DADD: - case Const.DSUB: - case Const.DMUL: - case Const.DDIV: - case Const.DREM: - ret.pop(4); - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - break; - case Const.LSHL: - case Const.LSHR: - case Const.LUSHR: - ret.pop(3); - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case Const.IINC: - ret.set(((IINC)ins).getIndex(), StackItem.INTEGER); - break; - case Const.I2L: - case Const.F2L: - ret.pop(1); - ret.push(StackItem.LONG); - ret.push(StackItem.TOP); - break; - case Const.I2F: - ret.pop(1); - ret.push(StackItem.FLOAT); - break; - case Const.I2D: - case Const.F2D: - ret.pop(1); - ret.push(StackItem.DOUBLE); - ret.push(StackItem.TOP); - break; - case Const.F2I: - case Const.ARRAYLENGTH: - case Const.INSTANCEOF: - ret.pop(1); - ret.push(StackItem.INTEGER); - break; - case Const.LCMP: - case Const.DCMPL: - case Const.DCMPG: - ret.pop(4); - ret.push(StackItem.INTEGER); - break; - case Const.JSR: - case Const.RET: - throw new RuntimeException( - "JSR/RET are not supported with computeFrames option"); //TODO: Fehlermeldung anpassen - case Const.GETSTATIC: - //ret.push(cw, item.strVal3); //TODO - break; - case Const.PUTSTATIC: - //ret.pop(item.strVal3); //TODO - break; - case Const.GETFIELD: - GETFIELD getfieldIns = (GETFIELD) ins; - ret.pop(1); - ret.push(new StackItemType(getfieldIns.getFieldType(cp))); - break; - case Const.PUTFIELD: - PUTFIELD putfieldIns = (PUTFIELD) ins; - ret.pop(putfieldIns.consumeStack(cp)); - break; - case Const.INVOKEVIRTUAL: - case Const.INVOKESPECIAL: - case Const.INVOKESTATIC: - case Const.INVOKEINTERFACE: - case Const.INVOKEDYNAMIC: - InvokeInstruction invokeIns = (InvokeInstruction) ins; - ret.pop(invokeIns.consumeStack(cp)); - /* - * TODO: - * Hier return new StackItemOBJECT(returnTypeDerMethode); - * returnTypeDerMethode bestimmen indem man im ConstantPool nach dem Argument für die Instruktion nachsieht. - * Wie kann man bestimmen, ob es sich um Object oder primären Datentyp handelt. bcel-Typen verwenden? Müsste dann weiter oben auch gepatcht werden. - */ - /* - ret.pop(item.strVal3); - - if (opcode != Const.INVOKESTATIC) { - t1 = ret.pop(); - if (opcode == Const.INVOKESPECIAL - && item.strVal2.charAt(0) == '<') { - init(t1); - } - } - - ret.push(cw, item.strVal3); - */ - Type retType = invokeIns.getReturnType(cp); - if(retType instanceof BasicType){ - ret.push(new StackItemType((BasicType)retType)); - }else if(retType instanceof ArrayType){ - //TODO - }else if(retType instanceof ReferenceType){ - ret.push(new StackItemType((ReferenceType) retType)); - } - break; - case Const.NEW: - NEW newIns = (NEW) ins; - ret.push(new StackItemUninitialized(newIns, instructionHandle)); - //ret.push(UNINITIALIZED | cw.addUninitializedType(item.strVal1, arg)); - break; - /* - case Const.NEWARRAY: - ret.pop(); - switch (arg) { - case Const.T_BOOLEAN: - ret.push(ARRAY_OF | BOOLEAN); - break; - case Const.T_CHAR: - ret.push(ARRAY_OF | CHAR); - break; - case Const.T_BYTE: - ret.push(ARRAY_OF | BYTE); - break; - case Const.T_SHORT: - ret.push(ARRAY_OF | SHORT); - break; - case Const.T_INT: - ret.push(ARRAY_OF | StackItem.INTEGER); - break; - case Const.T_StackItem.FLOAT: - ret.push(ARRAY_OF | StackItem.FLOAT); - break; - case Const.T_StackItem.DOUBLE: - ret.push(ARRAY_OF | StackItem.DOUBLE); - break; - // case Const.T_StackItem.LONG: - default: - ret.push(ARRAY_OF | StackItem.LONG); - break; - } - break; - case Const.ANEWARRAY: - String s = item.strVal1; - ret.pop(); - if (s.charAt(0) == '[') { - ret.push(cw, '[' + s); - } else { - ret.push(ARRAY_OF | OBJECT | cw.addType(s)); - } - break; - case Const.CHECKCAST: - s = item.strVal1; - ret.pop(); - if (s.charAt(0) == '[') { - ret.push(cw, s); - } else { - ret.push(OBJECT | cw.addType(s)); - } - break; - // case Const.MULTIANEWARRAY: - default: - ret.pop(arg); - ret.push(cw, item.strVal1); - break; - */ - } - } - - -}