Java tutorial
/* Redline Smalltalk, Copyright (c) James C. Ladd. All rights reserved. See LICENSE in the root of this distribution. */ package st.redline.compiler; import org.objectweb.asm.*; import st.redline.compiler.ast.SimpleExpression; import st.redline.compiler.ast.Number; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; public class ClassBytecodeWriter implements Opcodes { private static final String OBJECT = "st/redline/lang/ProtoObject"; private static final String CONTEXT = "st/redline/lang/PrimContext"; private static final String SEND_MESSAGES = "_sendMessages_"; private static final String SEND_MESSAGES_SIG = "(Lst/redline/lang/ProtoObject;Lst/redline/lang/PrimContext;)Lst/redline/lang/ProtoObject;"; private static final String RESULT = "sendMessagesResult"; private static final String RESULT_SIG = "(Lst/redline/lang/ProtoObject;)V"; private static final String EIGEN_INIT = "initialize"; private static final String EIGEN_INIT_SIG = "(Ljava/lang/String;Ljava/lang/String;)V"; private static final String EIGEN_UNINIT = "uninitialize"; private static final String EIGEN_UNINIT_SIG = "()V"; private static final String PRIMITIVE_SIG = "(Lst/redline/lang/ProtoObject;Lst/redline/lang/PrimContext;)Lst/redline/lang/ProtoObject;"; private static final String[] SIGNATURES = { "(Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;" }; private static final Map<String, Integer> OPCODES = new HashMap<String, Integer>(); public final static int BYTECODE_VERSION; static { int compareTo17 = new BigDecimal(System.getProperty("java.specification.version")) .compareTo(new BigDecimal("1.7")); if (compareTo17 >= 0) { BYTECODE_VERSION = V1_7; } else { BYTECODE_VERSION = V1_6; } } private final String className; private final String packageName; private final String fullyQualifiedClassName; private final ClassWriter cw; protected final ClassVisitor cv; protected MethodVisitor mv; public ClassBytecodeWriter(ClassVisitor classVisitor, ClassWriter classWriter, String className, String packageName) { this.cv = classVisitor; this.cw = classWriter; this.className = className; this.packageName = packageName; this.fullyQualifiedClassName = packageName + "/" + className; } public byte[] contents() { return cw.toByteArray(); } public void openClass() { cv.visit(BYTECODE_VERSION, ACC_PUBLIC + ACC_SUPER, fullyQualifiedClassName, null, superclass(), null); cv.visitSource(homogenize(fullyQualifiedClassName) + ".st", null); writeInitializeMethod(); openMessageSendsMethod(); } public void closeClass() { closeMessageSendsMethod(); cv.visitEnd(); } private void closeMessageSendsMethod() { mv.visitInsn(ARETURN); closeMethod(); } protected void closeInitializeMethod() { mv.visitInsn(RETURN); closeMethod(); } private void closeMethod() { mv.visitMaxs(1, 3); mv.visitEnd(); } protected void openMessageSendsMethod() { mv = cv.visitMethod(ACC_PROTECTED, SEND_MESSAGES, SEND_MESSAGES_SIG, null, null); mv.visitCode(); pushThis(); pushReceiver(); pushContext(); mv.visitMethodInsn(INVOKESPECIAL, superclass(), SEND_MESSAGES, SEND_MESSAGES_SIG); pop(); pushReceiver(); } protected void writeInitializeMethod() { openInitializeMethod(); invokeInitializeEigenClass(); invokeMessageSends(); invokeUnInitializeEigenClass(); closeInitializeMethod(); } protected void openInitializeMethod() { mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); visitLine(0); pushThis(); mv.visitMethodInsn(INVOKESPECIAL, superclass(), "<init>", "()V"); } protected void invokeInitializeEigenClass() { pushThis(); pushLiteral(className); pushLiteral(packageName); mv.visitMethodInsn(INVOKEVIRTUAL, fullyQualifiedClassName, EIGEN_INIT, EIGEN_INIT_SIG); } protected void invokeUnInitializeEigenClass() { pushThis(); mv.visitMethodInsn(INVOKEVIRTUAL, fullyQualifiedClassName, EIGEN_UNINIT, EIGEN_UNINIT_SIG); } protected void invokeMessageSends() { pushThis(); pushThis(); pushThis(); mv.visitTypeInsn(NEW, "st/redline/lang/PrimContext"); pushDuplicate(); pushThis(); mv.visitMethodInsn(INVOKESPECIAL, "st/redline/lang/PrimContext", "<init>", "(Lst/redline/lang/ProtoObject;)V"); mv.visitMethodInsn(INVOKEVIRTUAL, fullyQualifiedClassName, SEND_MESSAGES, SEND_MESSAGES_SIG); mv.visitMethodInsn(INVOKEVIRTUAL, fullyQualifiedClassName, RESULT, RESULT_SIG); } private String homogenize(String className) { int index = className.indexOf("$"); if (index == -1) return className; return className.substring(0, index); } protected String superclass() { return "st/redline/lang/EigenClass"; } public void addClassToImports(String importClassName) { pushReceiver(); pushDuplicate(); visitLdcInsn(importClassName); visitMethodInsn(INVOKEVIRTUAL, "st/redline/lang/ProtoObject", "smalltalkString", "(Ljava/lang/Object;)Lst/redline/lang/ProtoObject;"); visitLdcInsn("import:"); visitMethodInsn(INVOKEVIRTUAL, "st/redline/lang/ProtoObject", "perform", "(Lst/redline/lang/ProtoObject;Ljava/lang/String;)Lst/redline/lang/ProtoObject;"); pop(); } public void invokeContextTemporariesInit(int size) { pushContext(); pushNumber(size); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "temporariesInit", "(I)V"); } public void invokeObjectPerform(String selector, int argumentCount, boolean sendToSuper) { pushLiteral(selector); if (sendToSuper) mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "superPerform", "(Lst/redline/lang/PrimContext;" + SIGNATURES[argumentCount].substring(1)); else mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "perform", SIGNATURES[argumentCount]); } public void invokeObjectCreate(String type, String value, int line) { visitLine(line); pushReceiver(); pushLiteral(value); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, type, "(Ljava/lang/Object;)Lst/redline/lang/ProtoObject;"); } public void invokeObjectCompileBlock(String name, int line) { visitLine(line); pushReceiver(); pushLiteral(name); pushContext(); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "block", "(Ljava/lang/String;Lst/redline/lang/PrimContext;)Lst/redline/lang/ProtoObject;"); } public void invokeObjectString(String value, int line) { invokeObjectCreate("smalltalkString", value, line); } public void invokeObjectSymbol(String value, int line) { invokeObjectCreate("smalltalkSymbol", value, line); } public void invokeObjectCharacter(String value, int line) { invokeObjectCreate("smalltalkCharacter", value, line); } public void invokeObjectNumber(String value, int line) { invokeObjectCreate("smalltalkNumber", value, line); } public void invokeVariableAt(String name, int line) { visitLine(line); pushReceiver(); pushLiteral(name); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "variableAt", "(Ljava/lang/String;)Lst/redline/lang/ProtoObject;"); } public void invokeVariablePutAt(String name, int line) { visitLine(line); pushLiteral(name); pushReceiver(); mv.visitMethodInsn(INVOKESTATIC, OBJECT, "variablePutAtIn", "(Lst/redline/lang/ProtoObject;Ljava/lang/String;Lst/redline/lang/ProtoObject;)Lst/redline/lang/ProtoObject;"); } public void invokeObjectArray(int size) { pushReceiver(); pushNumber(size); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "smalltalkArray", "(I)Lst/redline/lang/ProtoObject;"); } public void invokeArrayPutAt(int index, int line) { visitLine(line); pushNumber(index); mv.visitMethodInsn(INVOKESTATIC, OBJECT, "putAt", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoObject;I)Lst/redline/lang/ProtoObject;"); } public void invokePrimitive(int line, String primitive) { // TODO.JCL - cater for case where primitive fails - for now return primitive result. // Doing ARETURN here means there can be more than one ARETURN emitted, this is OK. visitLine(line); pushThis(); pushReceiver(); pushContext(); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "p" + primitive, PRIMITIVE_SIG); mv.visitInsn(ARETURN); } public void invokeBlockAnswer(String blockReturnType) { pushThis(); pushLiteral(blockReturnType); mv.visitMethodInsn(INVOKESTATIC, OBJECT, "blockAnswer", "(Lst/redline/lang/ProtoObject;Lst/redline/lang/ProtoBlock;Ljava/lang/String;)Lst/redline/lang/ProtoObject;"); } public void pop() { mv.visitInsn(POP); } public void pushArgument(int index) { pushContext(); pushNumber(index); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "argumentAt", "(I)Lst/redline/lang/ProtoObject;"); } public void pushArgumentElement(int argumentIndex, int elementIndex) { pushContext(); pushNumber(argumentIndex); pushNumber(elementIndex); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "argumentAtAt", "(II)Lst/redline/lang/ProtoObject;"); } public void pushOuterArgument(int index) { pushContext(); pushNumber(index); pushReceiver(); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "argumentAtFrom", "(ILst/redline/lang/ProtoObject;)Lst/redline/lang/ProtoObject;"); } public void pushTemporary(int index) { pushContext(); pushNumber(index); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "temporaryAt", "(I)Lst/redline/lang/ProtoObject;"); } public void pushOuterTemporary(int index) { pushContext(); pushNumber(index); pushReceiver(); mv.visitMethodInsn(INVOKEVIRTUAL, CONTEXT, "temporaryAtFrom", "(ILst/redline/lang/ProtoObject;)Lst/redline/lang/ProtoObject;"); } public void storeTemporary(int index) { pushNumber(index); pushContext(); mv.visitMethodInsn(INVOKESTATIC, CONTEXT, "temporaryPutAtIn", "(Lst/redline/lang/ProtoObject;ILst/redline/lang/PrimContext;)V"); } public void storeOuterTemporary(int index) { pushNumber(index); pushContext(); pushReceiver(); mv.visitMethodInsn(INVOKESTATIC, CONTEXT, "temporaryPutAtInFrom", "(Lst/redline/lang/ProtoObject;ILst/redline/lang/PrimContext;Lst/redline/lang/ProtoObject;)V"); } public void pushOuterReceiver() { pushReceiver(); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "outerReceiver", "()Lst/redline/lang/ProtoObject;"); } public void pushLiteral(String literal) { mv.visitLdcInsn(literal); } public void pushDuplicate() { mv.visitInsn(DUP); } public void pushThis() { mv.visitVarInsn(ALOAD, 0); } public void pushReceiver() { mv.visitVarInsn(ALOAD, 1); } public void pushContext() { mv.visitVarInsn(ALOAD, 2); } public void pushNull() { mv.visitInsn(ACONST_NULL); } public void pushObjectStaticField(String field) { mv.visitFieldInsn(GETSTATIC, OBJECT, field, "Lst/redline/lang/ProtoObject;"); } public void pushObjectField(String object, String field) { mv.visitFieldInsn(GETFIELD, object, field, "Lst/redline/lang/ProtoObject;"); } public void pushObjectStaticField(String object, String field) { mv.visitFieldInsn(GETSTATIC, object, field, "Lst/redline/lang/ProtoObject;"); } public void pushClassLoaderField(String field) { pushClassLoader(); pushObjectField("st/redline/classloader/SmalltalkClassLoader", field); } public void pushClassLoader() { pushReceiver(); mv.visitMethodInsn(INVOKEVIRTUAL, OBJECT, "classLoader", "()Lst/redline/classloader/SmalltalkClassLoader;"); } public void pushNumber(int value) { switch (value) { case 0: mv.visitInsn(ICONST_0); break; case 1: mv.visitInsn(ICONST_1); break; case 2: mv.visitInsn(ICONST_2); break; case 3: mv.visitInsn(ICONST_3); break; case 4: mv.visitInsn(ICONST_4); break; case 5: mv.visitInsn(ICONST_5); break; default: if (value > 5 && value < 128) mv.visitIntInsn(BIPUSH, value); else // SIPUSH not supported yet. throw new IllegalStateException("push of integer value " + value + " not yet supported."); } } public void visitLine(int line) { Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(line, l0); } public void setupTryForBlockReturn(SimpleExpression simpleExpression, String blockReturnType) { // System.out.println("setupTryForBlockReturn: " + simpleExpression); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); simpleExpression.leaveResultOnStack(); simpleExpression.label0(l0); simpleExpression.label1(l1); simpleExpression.label2(l2); mv.visitTryCatchBlock(l0, l1, l2, blockReturnType); mv.visitLabel(l0); } public void setupCatchForBlockReturn(SimpleExpression simpleExpression, String blockReturnType) { // System.out.println("setupCatchForBlockReturn: " + simpleExpression); Label l1 = (Label) simpleExpression.label1(); Label l2 = (Label) simpleExpression.label2(); mv.visitLabel(l1); Label l3 = new Label(); mv.visitJumpInsn(GOTO, l3); mv.visitLabel(l2); mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { blockReturnType }); mv.visitMethodInsn(INVOKEVIRTUAL, blockReturnType, "answer", "()Lst/redline/lang/ProtoObject;"); mv.visitInsn(ARETURN); mv.visitLabel(l3); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); } public void visitInsn(String opcode) { mv.visitInsn(opcodeValue(opcode)); } private int opcodeValue(String opcode) { if (!OPCODES.containsKey(opcode)) throw new IllegalStateException("Unknown OPCODE '" + opcode + "'."); return OPCODES.get(opcode); } public void visitFieldInsn(int opcode, String owner, String name, String desc) { mv.visitFieldInsn(opcode, owner, name, desc); } public void visitMethodInsn(int opcode, String owner, String name, String desc) { mv.visitMethodInsn(opcode, owner, name, desc); } public void visitLdcInsn(String value) { mv.visitLdcInsn(value); } public void visitVarInsn(int opcode, int value) { mv.visitVarInsn(opcode, value); } public void visitTypeInsn(int opcode, String type) { mv.visitTypeInsn(opcode, type); } static { OPCODES.put("V1_1", 196653); OPCODES.put("V1_2", 46); OPCODES.put("V1_3", 47); OPCODES.put("V1_4", 48); OPCODES.put("V1_5", 49); OPCODES.put("V1_6", 50); OPCODES.put("V1_7", 51); OPCODES.put("ACC_PUBLIC", 1); OPCODES.put("ACC_PRIVATE", 2); OPCODES.put("ACC_PROTECTED", 4); OPCODES.put("ACC_STATIC", 8); OPCODES.put("ACC_FINAL", 16); OPCODES.put("ACC_SUPER", 32); OPCODES.put("ACC_SYNCHRONIZED", 32); OPCODES.put("ACC_VOLATILE", 64); OPCODES.put("ACC_BRIDGE", 64); OPCODES.put("ACC_VARARGS", 128); OPCODES.put("ACC_TRANSIENT", 128); OPCODES.put("ACC_NATIVE", 256); OPCODES.put("ACC_INTERFACE", 512); OPCODES.put("ACC_ABSTRACT", 1024); OPCODES.put("ACC_STRICT", 2048); OPCODES.put("ACC_SYNTHETIC", 4096); OPCODES.put("ACC_ANNOTATION", 8192); OPCODES.put("ACC_ENUM", 16384); OPCODES.put("ACC_DEPRECATED", 131072); OPCODES.put("T_BOOLEAN", 4); OPCODES.put("T_CHAR", 5); OPCODES.put("T_FLOAT", 6); OPCODES.put("T_DOUBLE", 7); OPCODES.put("T_BYTE", 8); OPCODES.put("T_SHORT", 9); OPCODES.put("T_INT", 10); OPCODES.put("T_LONG", 11); OPCODES.put("F_NEW", -1); OPCODES.put("F_FULL", 0); OPCODES.put("F_APPEND", 1); OPCODES.put("F_CHOP", 2); OPCODES.put("F_SAME", 3); OPCODES.put("F_SAME1", 4); OPCODES.put("TOP", TOP); OPCODES.put("INTEGER", INTEGER); OPCODES.put("FLOAT", FLOAT); OPCODES.put("DOUBLE", DOUBLE); OPCODES.put("LONG", LONG); OPCODES.put("NULL", NULL); OPCODES.put("UNINITIALIZED_THIS", UNINITIALIZED_THIS); OPCODES.put("NOP", 0); OPCODES.put("ACONST_NULL", 1); OPCODES.put("ICONST_M1", 2); OPCODES.put("ICONST_0", 3); OPCODES.put("ICONST_1", 4); OPCODES.put("ICONST_2", 5); OPCODES.put("ICONST_3", 6); OPCODES.put("ICONST_4", 7); OPCODES.put("ICONST_5", 8); OPCODES.put("LCONST_0", 9); OPCODES.put("LCONST_1", 10); OPCODES.put("FCONST_0", 11); OPCODES.put("FCONST_1", 12); OPCODES.put("FCONST_2", 13); OPCODES.put("DCONST_0", 14); OPCODES.put("DCONST_1", 15); OPCODES.put("BIPUSH", 16); OPCODES.put("SIPUSH", 17); OPCODES.put("LDC", 18); OPCODES.put("ILOAD", 21); OPCODES.put("LLOAD", 22); OPCODES.put("FLOAD", 23); OPCODES.put("DLOAD", 24); OPCODES.put("ALOAD", 25); OPCODES.put("IALOAD", 46); OPCODES.put("LALOAD", 47); OPCODES.put("FALOAD", 48); OPCODES.put("DALOAD", 49); OPCODES.put("AALOAD", 50); OPCODES.put("BALOAD", 51); OPCODES.put("CALOAD", 52); OPCODES.put("SALOAD", 53); OPCODES.put("ISTORE", 54); OPCODES.put("LSTORE", 55); OPCODES.put("FSTORE", 56); OPCODES.put("DSTORE", 57); OPCODES.put("ASTORE", 58); OPCODES.put("IASTORE", 79); OPCODES.put("LASTORE", 80); OPCODES.put("FASTORE", 81); OPCODES.put("DASTORE", 82); OPCODES.put("AASTORE", 83); OPCODES.put("BASTORE", 84); OPCODES.put("CASTORE", 85); OPCODES.put("SASTORE", 86); OPCODES.put("POP", 87); OPCODES.put("POP2", 88); OPCODES.put("DUP", 89); OPCODES.put("DUP_X1", 90); OPCODES.put("DUP_X2", 91); OPCODES.put("DUP2", 92); OPCODES.put("DUP2_X1", 93); OPCODES.put("DUP2_X2", 94); OPCODES.put("SWAP", 95); OPCODES.put("IADD", 96); OPCODES.put("LADD", 97); OPCODES.put("FADD", 98); OPCODES.put("DADD", 99); OPCODES.put("ISUB", 100); OPCODES.put("LSUB", 101); OPCODES.put("FSUB", 102); OPCODES.put("DSUB", 103); OPCODES.put("IMUL", 104); OPCODES.put("LMUL", 105); OPCODES.put("FMUL", 106); OPCODES.put("DMUL", 107); OPCODES.put("IDIV", 108); OPCODES.put("LDIV", 109); OPCODES.put("FDIV", 110); OPCODES.put("DDIV", 111); OPCODES.put("IREM", 112); OPCODES.put("LREM", 113); OPCODES.put("FREM", 114); OPCODES.put("DREM", 115); OPCODES.put("INEG", 116); OPCODES.put("LNEG", 117); OPCODES.put("FNEG", 118); OPCODES.put("DNEG", 119); OPCODES.put("ISHL", 120); OPCODES.put("LSHL", 121); OPCODES.put("ISHR", 122); OPCODES.put("LSHR", 123); OPCODES.put("IUSHR", 124); OPCODES.put("LUSHR", 125); OPCODES.put("IAND", 126); OPCODES.put("LAND", 127); OPCODES.put("IOR", 128); OPCODES.put("LOR", 129); OPCODES.put("IXOR", 130); OPCODES.put("LXOR", 131); OPCODES.put("IINC", 132); OPCODES.put("I2L", 133); OPCODES.put("I2F", 134); OPCODES.put("I2D", 135); OPCODES.put("L2I", 136); OPCODES.put("L2F", 137); OPCODES.put("L2D", 138); OPCODES.put("F2I", 139); OPCODES.put("F2L", 140); OPCODES.put("F2D", 141); OPCODES.put("D2I", 142); OPCODES.put("D2L", 143); OPCODES.put("D2F", 144); OPCODES.put("I2B", 145); OPCODES.put("I2C", 146); OPCODES.put("I2S", 147); OPCODES.put("LCMP", 148); OPCODES.put("FCMPL", 149); OPCODES.put("FCMPG", 150); OPCODES.put("DCMPL", 151); OPCODES.put("DCMPG", 152); OPCODES.put("IFEQ", 153); OPCODES.put("IFNE", 154); OPCODES.put("IFLT", 155); OPCODES.put("IFGE", 156); OPCODES.put("IFGT", 157); OPCODES.put("IFLE", 158); OPCODES.put("IF_ICMPEQ", 159); OPCODES.put("IF_ICMPNE", 160); OPCODES.put("IF_ICMPLT", 161); OPCODES.put("IF_ICMPGE", 162); OPCODES.put("IF_ICMPGT", 163); OPCODES.put("IF_ICMPLE", 164); OPCODES.put("IF_ACMPEQ", 165); OPCODES.put("IF_ACMPNE", 166); OPCODES.put("GOTO", 167); OPCODES.put("JSR", 168); OPCODES.put("RET", 169); OPCODES.put("TABLESWITCH", 170); OPCODES.put("LOOKUPSWITCH", 171); OPCODES.put("IRETURN", 172); OPCODES.put("LRETURN", 173); OPCODES.put("FRETURN", 174); OPCODES.put("DRETURN", 175); OPCODES.put("ARETURN", 176); OPCODES.put("RETURN", 177); OPCODES.put("GETSTATIC", 178); OPCODES.put("PUTSTATIC", 179); OPCODES.put("GETFIELD", 180); OPCODES.put("PUTFIELD", 181); OPCODES.put("INVOKEVIRTUAL", 182); OPCODES.put("INVOKESPECIAL", 183); OPCODES.put("INVOKESTATIC", 184); OPCODES.put("INVOKEINTERFACE", 185); OPCODES.put("INVOKEDYNAMIC", 186); OPCODES.put("NEW", 187); OPCODES.put("NEWARRAY", 188); OPCODES.put("ANEWARRAY", 189); OPCODES.put("ARRAYLENGTH", 190); OPCODES.put("ATHROW", 191); OPCODES.put("CHECKCAST", 192); OPCODES.put("INSTANCEOF", 193); OPCODES.put("MONITORENTER", 194); OPCODES.put("MONITOREXIT", 195); OPCODES.put("MULTIANEWARRAY", 197); OPCODES.put("IFNULL", 198); OPCODES.put("IFNONNULL", 199); } }