jdk/src/java.base/share/classes/sun/reflect/AccessorGenerator.java
changeset 37377 bd3b98a11a14
parent 37376 5daa5fbad3ce
parent 37374 ee1b8619eddb
child 37380 55c2549714af
--- a/jdk/src/java.base/share/classes/sun/reflect/AccessorGenerator.java	Fri Apr 15 16:19:14 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,723 +0,0 @@
-/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code 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
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.reflect;
-
-import java.lang.reflect.*;
-import jdk.internal.misc.Unsafe;
-
-/** Shared functionality for all accessor generators */
-
-class AccessorGenerator implements ClassFileConstants {
-    static final Unsafe unsafe = Unsafe.getUnsafe();
-
-    // Constants because there's no way to say "short integer constant",
-    // i.e., "1S"
-    protected static final short S0 = (short) 0;
-    protected static final short S1 = (short) 1;
-    protected static final short S2 = (short) 2;
-    protected static final short S3 = (short) 3;
-    protected static final short S4 = (short) 4;
-    protected static final short S5 = (short) 5;
-    protected static final short S6 = (short) 6;
-
-    // Instance variables for shared functionality between
-    // FieldAccessorGenerator and MethodAccessorGenerator
-    protected ClassFileAssembler asm;
-    protected int   modifiers;
-    protected short thisClass;
-    protected short superClass;
-    protected short targetClass;
-    // Common constant pool entries to FieldAccessor and MethodAccessor
-    protected short throwableClass;
-    protected short classCastClass;
-    protected short nullPointerClass;
-    protected short illegalArgumentClass;
-    protected short invocationTargetClass;
-    protected short initIdx;
-    protected short initNameAndTypeIdx;
-    protected short initStringNameAndTypeIdx;
-    protected short nullPointerCtorIdx;
-    protected short illegalArgumentCtorIdx;
-    protected short illegalArgumentStringCtorIdx;
-    protected short invocationTargetCtorIdx;
-    protected short superCtorIdx;
-    protected short objectClass;
-    protected short toStringIdx;
-    protected short codeIdx;
-    protected short exceptionsIdx;
-    // Boxing
-    protected short valueOfIdx;
-    protected short booleanIdx;
-    protected short booleanBoxIdx;
-    protected short booleanUnboxIdx;
-    protected short byteIdx;
-    protected short byteBoxIdx;
-    protected short byteUnboxIdx;
-    protected short characterIdx;
-    protected short characterBoxIdx;
-    protected short characterUnboxIdx;
-    protected short doubleIdx;
-    protected short doubleBoxIdx;
-    protected short doubleUnboxIdx;
-    protected short floatIdx;
-    protected short floatBoxIdx;
-    protected short floatUnboxIdx;
-    protected short integerIdx;
-    protected short integerBoxIdx;
-    protected short integerUnboxIdx;
-    protected short longIdx;
-    protected short longBoxIdx;
-    protected short longUnboxIdx;
-    protected short shortIdx;
-    protected short shortBoxIdx;
-    protected short shortUnboxIdx;
-
-    protected final short NUM_COMMON_CPOOL_ENTRIES = (short) 30;
-    protected final short NUM_BOXING_CPOOL_ENTRIES = (short) 73;
-
-    // Requires that superClass has been set up
-    protected void emitCommonConstantPoolEntries() {
-        // +   [UTF-8] "java/lang/Throwable"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "java/lang/ClassCastException"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "java/lang/NullPointerException"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "java/lang/IllegalArgumentException"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "java/lang/InvocationTargetException"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "<init>"
-        // +   [UTF-8] "()V"
-        // +   [CONSTANT_NameAndType_info] for above
-        // +   [CONSTANT_Methodref_info] for NullPointerException's constructor
-        // +   [CONSTANT_Methodref_info] for IllegalArgumentException's constructor
-        // +   [UTF-8] "(Ljava/lang/String;)V"
-        // +   [CONSTANT_NameAndType_info] for "<init>(Ljava/lang/String;)V"
-        // +   [CONSTANT_Methodref_info] for IllegalArgumentException's constructor taking a String
-        // +   [UTF-8] "(Ljava/lang/Throwable;)V"
-        // +   [CONSTANT_NameAndType_info] for "<init>(Ljava/lang/Throwable;)V"
-        // +   [CONSTANT_Methodref_info] for InvocationTargetException's constructor
-        // +   [CONSTANT_Methodref_info] for "super()"
-        // +   [UTF-8] "java/lang/Object"
-        // +   [CONSTANT_Class_info] for above
-        // +   [UTF-8] "toString"
-        // +   [UTF-8] "()Ljava/lang/String;"
-        // +   [CONSTANT_NameAndType_info] for "toString()Ljava/lang/String;"
-        // +   [CONSTANT_Methodref_info] for Object's toString method
-        // +   [UTF-8] "Code"
-        // +   [UTF-8] "Exceptions"
-        asm.emitConstantPoolUTF8("java/lang/Throwable");
-        asm.emitConstantPoolClass(asm.cpi());
-        throwableClass = asm.cpi();
-        asm.emitConstantPoolUTF8("java/lang/ClassCastException");
-        asm.emitConstantPoolClass(asm.cpi());
-        classCastClass = asm.cpi();
-        asm.emitConstantPoolUTF8("java/lang/NullPointerException");
-        asm.emitConstantPoolClass(asm.cpi());
-        nullPointerClass = asm.cpi();
-        asm.emitConstantPoolUTF8("java/lang/IllegalArgumentException");
-        asm.emitConstantPoolClass(asm.cpi());
-        illegalArgumentClass = asm.cpi();
-        asm.emitConstantPoolUTF8("java/lang/reflect/InvocationTargetException");
-        asm.emitConstantPoolClass(asm.cpi());
-        invocationTargetClass = asm.cpi();
-        asm.emitConstantPoolUTF8("<init>");
-        initIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("()V");
-        asm.emitConstantPoolNameAndType(initIdx, asm.cpi());
-        initNameAndTypeIdx = asm.cpi();
-        asm.emitConstantPoolMethodref(nullPointerClass, initNameAndTypeIdx);
-        nullPointerCtorIdx = asm.cpi();
-        asm.emitConstantPoolMethodref(illegalArgumentClass, initNameAndTypeIdx);
-        illegalArgumentCtorIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(Ljava/lang/String;)V");
-        asm.emitConstantPoolNameAndType(initIdx, asm.cpi());
-        initStringNameAndTypeIdx = asm.cpi();
-        asm.emitConstantPoolMethodref(illegalArgumentClass, initStringNameAndTypeIdx);
-        illegalArgumentStringCtorIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(Ljava/lang/Throwable;)V");
-        asm.emitConstantPoolNameAndType(initIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(invocationTargetClass, asm.cpi());
-        invocationTargetCtorIdx = asm.cpi();
-        asm.emitConstantPoolMethodref(superClass, initNameAndTypeIdx);
-        superCtorIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("java/lang/Object");
-        asm.emitConstantPoolClass(asm.cpi());
-        objectClass = asm.cpi();
-        asm.emitConstantPoolUTF8("toString");
-        asm.emitConstantPoolUTF8("()Ljava/lang/String;");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(objectClass, asm.cpi());
-        toStringIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("Code");
-        codeIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("Exceptions");
-        exceptionsIdx = asm.cpi();
-    }
-
-    /** Constant pool entries required to be able to box/unbox primitive
-        types. Note that we don't emit these if we don't need them. */
-    protected void emitBoxingContantPoolEntries() {
-        //  *  [UTF-8] "valueOf"
-        //  *  [UTF-8] "java/lang/Boolean"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(Z)Ljava/lang/Boolean;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "booleanValue"
-        //  *  [UTF-8] "()Z"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Byte"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(B)Ljava/lang/Byte;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "byteValue"
-        //  *  [UTF-8] "()B"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Character"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(C)Ljava/lang/Character;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "charValue"
-        //  *  [UTF-8] "()C"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Double"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(D)Ljava/lang/Double;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "doubleValue"
-        //  *  [UTF-8] "()D"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Float"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(F)Ljava/lang/Float;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "floatValue"
-        //  *  [UTF-8] "()F"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Integer"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(I)Ljava/lang/Integer;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "intValue"
-        //  *  [UTF-8] "()I"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Long"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(J)Ljava/lang/Long;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "longValue"
-        //  *  [UTF-8] "()J"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "java/lang/Short"
-        //  *  [CONSTANT_Class_info] for above
-        //  *  [UTF-8] "(S)Ljava/lang/Short;"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-        //  *  [UTF-8] "shortValue"
-        //  *  [UTF-8] "()S"
-        //  *  [CONSTANT_NameAndType_info] for above
-        //  *  [CONSTANT_Methodref_info] for above
-
-        // valueOf-method name
-        asm.emitConstantPoolUTF8("valueOf");
-        valueOfIdx = asm.cpi();
-
-        // Boolean
-        asm.emitConstantPoolUTF8("java/lang/Boolean");
-        asm.emitConstantPoolClass(asm.cpi());
-        booleanIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(Z)Ljava/lang/Boolean;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        booleanBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("booleanValue");
-        asm.emitConstantPoolUTF8("()Z");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        booleanUnboxIdx = asm.cpi();
-
-        // Byte
-        asm.emitConstantPoolUTF8("java/lang/Byte");
-        asm.emitConstantPoolClass(asm.cpi());
-        byteIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(B)Ljava/lang/Byte;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        byteBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("byteValue");
-        asm.emitConstantPoolUTF8("()B");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        byteUnboxIdx = asm.cpi();
-
-        // Character
-        asm.emitConstantPoolUTF8("java/lang/Character");
-        asm.emitConstantPoolClass(asm.cpi());
-        characterIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(C)Ljava/lang/Character;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        characterBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("charValue");
-        asm.emitConstantPoolUTF8("()C");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        characterUnboxIdx = asm.cpi();
-
-        // Double
-        asm.emitConstantPoolUTF8("java/lang/Double");
-        asm.emitConstantPoolClass(asm.cpi());
-        doubleIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(D)Ljava/lang/Double;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        doubleBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("doubleValue");
-        asm.emitConstantPoolUTF8("()D");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        doubleUnboxIdx = asm.cpi();
-
-        // Float
-        asm.emitConstantPoolUTF8("java/lang/Float");
-        asm.emitConstantPoolClass(asm.cpi());
-        floatIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(F)Ljava/lang/Float;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        floatBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("floatValue");
-        asm.emitConstantPoolUTF8("()F");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        floatUnboxIdx = asm.cpi();
-
-        // Integer
-        asm.emitConstantPoolUTF8("java/lang/Integer");
-        asm.emitConstantPoolClass(asm.cpi());
-        integerIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(I)Ljava/lang/Integer;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        integerBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("intValue");
-        asm.emitConstantPoolUTF8("()I");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        integerUnboxIdx = asm.cpi();
-
-        // Long
-        asm.emitConstantPoolUTF8("java/lang/Long");
-        asm.emitConstantPoolClass(asm.cpi());
-        longIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(J)Ljava/lang/Long;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        longBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("longValue");
-        asm.emitConstantPoolUTF8("()J");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        longUnboxIdx = asm.cpi();
-
-        // Short
-        asm.emitConstantPoolUTF8("java/lang/Short");
-        asm.emitConstantPoolClass(asm.cpi());
-        shortIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("(S)Ljava/lang/Short;");
-        asm.emitConstantPoolNameAndType(valueOfIdx, asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S2), asm.cpi());
-        shortBoxIdx = asm.cpi();
-        asm.emitConstantPoolUTF8("shortValue");
-        asm.emitConstantPoolUTF8("()S");
-        asm.emitConstantPoolNameAndType(sub(asm.cpi(), S1), asm.cpi());
-        asm.emitConstantPoolMethodref(sub(asm.cpi(), S6), asm.cpi());
-        shortUnboxIdx = asm.cpi();
-    }
-
-    // Necessary because of Java's annoying promotion rules
-    protected static short add(short s1, short s2) {
-        return (short) (s1 + s2);
-    }
-
-    protected static short sub(short s1, short s2) {
-        return (short) (s1 - s2);
-    }
-
-    protected boolean isStatic() {
-        return Modifier.isStatic(modifiers);
-    }
-
-    protected boolean isPrivate() {
-        return Modifier.isPrivate(modifiers);
-    }
-
-    /** Returns class name in "internal" form (i.e., '/' separators
-        instead of '.') */
-    protected static String getClassName
-        (Class<?> c, boolean addPrefixAndSuffixForNonPrimitiveTypes)
-    {
-        if (c.isPrimitive()) {
-            if (c == Boolean.TYPE) {
-                return "Z";
-            } else if (c == Byte.TYPE) {
-                return "B";
-            } else if (c == Character.TYPE) {
-                return "C";
-            } else if (c == Double.TYPE) {
-                return "D";
-            } else if (c == Float.TYPE) {
-                return "F";
-            } else if (c == Integer.TYPE) {
-                return "I";
-            } else if (c == Long.TYPE) {
-                return "J";
-            } else if (c == Short.TYPE) {
-                return "S";
-            } else if (c == Void.TYPE) {
-                return "V";
-            }
-            throw new InternalError("Should have found primitive type");
-        } else if (c.isArray()) {
-            return "[" + getClassName(c.getComponentType(), true);
-        } else {
-            if (addPrefixAndSuffixForNonPrimitiveTypes) {
-                return internalize("L" + c.getName() + ";");
-            } else {
-                return internalize(c.getName());
-            }
-        }
-    }
-
-    private static String internalize(String className) {
-        return className.replace('.', '/');
-    }
-
-    protected void emitConstructor() {
-        // Generate code into fresh code buffer
-        ClassFileAssembler cb = new ClassFileAssembler();
-        // 0 incoming arguments
-        cb.setMaxLocals(1);
-        cb.opc_aload_0();
-        cb.opc_invokespecial(superCtorIdx, 0, 0);
-        cb.opc_return();
-
-        // Emit method
-        emitMethod(initIdx, cb.getMaxLocals(), cb, null, null);
-    }
-
-    // The descriptor's index in the constant pool must be (1 +
-    // nameIdx). "numArgs" must indicate ALL arguments, including the
-    // implicit "this" argument; double and long arguments each count
-    // as 2 in this count. The code buffer must NOT contain the code
-    // length. The exception table may be null, but if non-null must
-    // NOT contain the exception table's length. The checked exception
-    // indices may be null.
-    protected void emitMethod(short nameIdx,
-                              int numArgs,
-                              ClassFileAssembler code,
-                              ClassFileAssembler exceptionTable,
-                              short[] checkedExceptionIndices)
-    {
-        int codeLen = code.getLength();
-        int excLen  = 0;
-        if (exceptionTable != null) {
-            excLen = exceptionTable.getLength();
-            if ((excLen % 8) != 0) {
-                throw new IllegalArgumentException("Illegal exception table");
-            }
-        }
-        int attrLen = 12 + codeLen + excLen;
-        excLen = excLen / 8; // No-op if no exception table
-
-        asm.emitShort(ACC_PUBLIC);
-        asm.emitShort(nameIdx);
-        asm.emitShort(add(nameIdx, S1));
-        if (checkedExceptionIndices == null) {
-            // Code attribute only
-            asm.emitShort(S1);
-        } else {
-            // Code and Exceptions attributes
-            asm.emitShort(S2);
-        }
-        // Code attribute
-        asm.emitShort(codeIdx);
-        asm.emitInt(attrLen);
-        asm.emitShort(code.getMaxStack());
-        asm.emitShort((short) Math.max(numArgs, code.getMaxLocals()));
-        asm.emitInt(codeLen);
-        asm.append(code);
-        asm.emitShort((short) excLen);
-        if (exceptionTable != null) {
-            asm.append(exceptionTable);
-        }
-        asm.emitShort(S0); // No additional attributes for Code attribute
-        if (checkedExceptionIndices != null) {
-            // Exceptions attribute
-            asm.emitShort(exceptionsIdx);
-            asm.emitInt(2 + 2 * checkedExceptionIndices.length);
-            asm.emitShort((short) checkedExceptionIndices.length);
-            for (int i = 0; i < checkedExceptionIndices.length; i++) {
-                asm.emitShort(checkedExceptionIndices[i]);
-            }
-        }
-    }
-
-    protected short indexForPrimitiveType(Class<?> type) {
-        if (type == Boolean.TYPE) {
-            return booleanIdx;
-        } else if (type == Byte.TYPE) {
-            return byteIdx;
-        } else if (type == Character.TYPE) {
-            return characterIdx;
-        } else if (type == Double.TYPE) {
-            return doubleIdx;
-        } else if (type == Float.TYPE) {
-            return floatIdx;
-        } else if (type == Integer.TYPE) {
-            return integerIdx;
-        } else if (type == Long.TYPE) {
-            return longIdx;
-        } else if (type == Short.TYPE) {
-            return shortIdx;
-        }
-        throw new InternalError("Should have found primitive type");
-    }
-
-    protected short boxingMethodForPrimitiveType(Class<?> type) {
-        if (type == Boolean.TYPE) {
-            return booleanBoxIdx;
-        } else if (type == Byte.TYPE) {
-            return byteBoxIdx;
-        } else if (type == Character.TYPE) {
-            return characterBoxIdx;
-        } else if (type == Double.TYPE) {
-            return doubleBoxIdx;
-        } else if (type == Float.TYPE) {
-            return floatBoxIdx;
-        } else if (type == Integer.TYPE) {
-            return integerBoxIdx;
-        } else if (type == Long.TYPE) {
-            return longBoxIdx;
-        } else if (type == Short.TYPE) {
-            return shortBoxIdx;
-        }
-        throw new InternalError("Should have found primitive type");
-    }
-
-    /** Returns true for widening or identity conversions for primitive
-        types only */
-    protected static boolean canWidenTo(Class<?> type, Class<?> otherType) {
-        if (!type.isPrimitive()) {
-            return false;
-        }
-
-        // Widening conversions (from JVM spec):
-        //  byte to short, int, long, float, or double
-        //  short to int, long, float, or double
-        //  char to int, long, float, or double
-        //  int to long, float, or double
-        //  long to float or double
-        //  float to double
-
-        if (type == Boolean.TYPE) {
-            if (otherType == Boolean.TYPE) {
-                return true;
-            }
-        } else if (type == Byte.TYPE) {
-            if (   otherType == Byte.TYPE
-                   || otherType == Short.TYPE
-                   || otherType == Integer.TYPE
-                   || otherType == Long.TYPE
-                   || otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Short.TYPE) {
-            if (   otherType == Short.TYPE
-                   || otherType == Integer.TYPE
-                   || otherType == Long.TYPE
-                   || otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Character.TYPE) {
-            if (   otherType == Character.TYPE
-                   || otherType == Integer.TYPE
-                   || otherType == Long.TYPE
-                   || otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Integer.TYPE) {
-            if (   otherType == Integer.TYPE
-                   || otherType == Long.TYPE
-                   || otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Long.TYPE) {
-            if (   otherType == Long.TYPE
-                   || otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Float.TYPE) {
-            if (   otherType == Float.TYPE
-                   || otherType == Double.TYPE) {
-                return true;
-            }
-        } else if (type == Double.TYPE) {
-            if (otherType == Double.TYPE) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /** Emits the widening bytecode for the given primitive conversion
-        (or none if the identity conversion). Requires that a primitive
-        conversion exists; i.e., canWidenTo must have already been
-        called and returned true. */
-    protected static void emitWideningBytecodeForPrimitiveConversion
-        (ClassFileAssembler cb,
-         Class<?> fromType,
-         Class<?> toType)
-    {
-        // Note that widening conversions for integral types (i.e., "b2s",
-        // "s2i") are no-ops since values on the Java stack are
-        // sign-extended.
-
-        // Widening conversions (from JVM spec):
-        //  byte to short, int, long, float, or double
-        //  short to int, long, float, or double
-        //  char to int, long, float, or double
-        //  int to long, float, or double
-        //  long to float or double
-        //  float to double
-
-        if (   fromType == Byte.TYPE
-               || fromType == Short.TYPE
-               || fromType == Character.TYPE
-               || fromType == Integer.TYPE) {
-            if (toType == Long.TYPE) {
-                cb.opc_i2l();
-            } else if (toType == Float.TYPE) {
-                cb.opc_i2f();
-            } else if (toType == Double.TYPE) {
-                cb.opc_i2d();
-            }
-        } else if (fromType == Long.TYPE) {
-            if (toType == Float.TYPE) {
-                cb.opc_l2f();
-            } else if (toType == Double.TYPE) {
-                cb.opc_l2d();
-            }
-        } else if (fromType == Float.TYPE) {
-            if (toType == Double.TYPE) {
-                cb.opc_f2d();
-            }
-        }
-
-        // Otherwise, was identity or no-op conversion. Fall through.
-    }
-
-    protected short unboxingMethodForPrimitiveType(Class<?> primType) {
-        if (primType == Boolean.TYPE) {
-            return booleanUnboxIdx;
-        } else if (primType == Byte.TYPE) {
-            return byteUnboxIdx;
-        } else if (primType == Character.TYPE) {
-            return characterUnboxIdx;
-        } else if (primType == Short.TYPE) {
-            return shortUnboxIdx;
-        } else if (primType == Integer.TYPE) {
-            return integerUnboxIdx;
-        } else if (primType == Long.TYPE) {
-            return longUnboxIdx;
-        } else if (primType == Float.TYPE) {
-            return floatUnboxIdx;
-        } else if (primType == Double.TYPE) {
-            return doubleUnboxIdx;
-        }
-        throw new InternalError("Illegal primitive type " + primType.getName());
-    }
-
-    protected static final Class<?>[] primitiveTypes = new Class<?>[] {
-        Boolean.TYPE,
-        Byte.TYPE,
-        Character.TYPE,
-        Short.TYPE,
-        Integer.TYPE,
-        Long.TYPE,
-        Float.TYPE,
-        Double.TYPE
-    };
-
-    /** We don't consider "Void" to be a primitive type */
-    protected static boolean isPrimitive(Class<?> c) {
-        return (c.isPrimitive() && c != Void.TYPE);
-    }
-
-    protected int typeSizeInStackSlots(Class<?> c) {
-        if (c == Void.TYPE) {
-            return 0;
-        }
-        if (c == Long.TYPE || c == Double.TYPE) {
-            return 2;
-        }
-        return 1;
-    }
-
-    private ClassFileAssembler illegalArgumentCodeBuffer;
-    protected ClassFileAssembler illegalArgumentCodeBuffer() {
-        if (illegalArgumentCodeBuffer == null) {
-            illegalArgumentCodeBuffer = new ClassFileAssembler();
-            illegalArgumentCodeBuffer.opc_new(illegalArgumentClass);
-            illegalArgumentCodeBuffer.opc_dup();
-            illegalArgumentCodeBuffer.opc_invokespecial(illegalArgumentCtorIdx, 0, 0);
-            illegalArgumentCodeBuffer.opc_athrow();
-        }
-
-        return illegalArgumentCodeBuffer;
-    }
-}