Package org.codehaus.groovy.classgen.asm
Class BytecodeHelper
- java.lang.Object
- 
- org.codehaus.groovy.classgen.asm.BytecodeHelper
 
- 
- All Implemented Interfaces:
- org.objectweb.asm.Opcodes
 
 public class BytecodeHelper extends java.lang.Object implements org.objectweb.asm.OpcodesA helper class for bytecode generation with AsmClassGenerator.
- 
- 
Field Summary- 
Fields inherited from interface org.objectweb.asm.OpcodesAALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V9
 
- 
 - 
Constructor SummaryConstructors Constructor Description BytecodeHelper()
 - 
Method SummaryAll Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static booleanbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)Deprecated.static booleanbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)Deprecated.static voidconvertPrimitiveToBoolean(org.objectweb.asm.MethodVisitor mv, ClassNode type)Converts a primitive type to boolean.static voiddoCast(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)static voiddoCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)static voiddoCastToPrimitive(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType)Given a wrapped number type (Byte, Integer, Short, ...), generates bytecode to convert it to a primitive number (int, long, double) using calls to wrapped.[targetType]Value()static voiddoCastToWrappedType(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType)Given a primitive number type (byte, integer, short, ...), generates bytecode to convert it to a wrapped number (Integer, Long, Double) using calls to [WrappedType].valueOfstatic voiddoReturn(org.objectweb.asm.MethodVisitor mv, ClassNode type)static java.lang.StringformatNameForClassLoading(java.lang.String name)returns a name that Class.forName() can take.static java.lang.StringgetClassInternalName(java.lang.Class t)static java.lang.StringgetClassInternalName(java.lang.String name)static java.lang.StringgetClassInternalName(ClassNode t)static java.lang.String[]getClassInternalNames(ClassNode[] names)static java.lang.StringgetClassLoadingTypeDescription(ClassNode c)array types are special: eg.: String[]: classname: [Ljava.lang.String; Object: classname: java.lang.Object int[] : classname: [I unlike getTypeDescription '.' is not replaced by '/'.static java.lang.StringgetGenericsBounds(ClassNode type)static java.lang.StringgetGenericsMethodSignature(MethodNode node)static java.lang.StringgetGenericsSignature(ClassNode node)static java.lang.StringgetMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)static java.lang.StringgetMethodDescriptor(ClassNode returnType, Parameter[] parameters)static java.lang.StringgetMethodDescriptor(MethodNode methodNode)Returns a method descriptor for the givenMethodNode.static java.lang.StringgetTypeDescription(java.lang.Class c)static java.lang.StringgetTypeDescription(ClassNode c)array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [Istatic inthashCode(java.lang.String str)Computes a hash code for a string.static booleanisClassLiteralPossible(ClassNode classNode)Tells if a class node is candidate for class literal bytecode optimization.static booleanisSameCompilationUnit(ClassNode a, ClassNode b)Returns true if the two classes share the same compilation unit.static voidload(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)static voidnegateBoolean(org.objectweb.asm.MethodVisitor mv)Negate a boolean on stack.static voidpushConstant(org.objectweb.asm.MethodVisitor mv, int value)static voidstore(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)static voidunbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)Generates the bytecode to unbox the current value on the stackstatic voidunbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)static voidvisitClassLiteral(org.objectweb.asm.MethodVisitor mv, ClassNode classNode)Visits a class literal.
 
- 
- 
- 
Method Detail- 
getClassInternalNamepublic static java.lang.String getClassInternalName(ClassNode t) 
 - 
getClassInternalNamepublic static java.lang.String getClassInternalName(java.lang.Class t) 
 - 
getClassInternalNamepublic static java.lang.String getClassInternalName(java.lang.String name) - Returns:
- the ASM internal name of the type
 
 - 
getMethodDescriptorpublic static java.lang.String getMethodDescriptor(ClassNode returnType, Parameter[] parameters) 
 - 
getMethodDescriptorpublic static java.lang.String getMethodDescriptor(MethodNode methodNode) Returns a method descriptor for the givenMethodNode.- Parameters:
- methodNode- the method node for which to create the descriptor
- Returns:
- a method descriptor as defined in section JVMS section 4.3.3
 
 - 
getMethodDescriptorpublic static java.lang.String getMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)- Returns:
- the ASM method type descriptor
 
 - 
getTypeDescriptionpublic static java.lang.String getTypeDescription(java.lang.Class c) 
 - 
getClassLoadingTypeDescriptionpublic static java.lang.String getClassLoadingTypeDescription(ClassNode c) array types are special: eg.: String[]: classname: [Ljava.lang.String; Object: classname: java.lang.Object int[] : classname: [I unlike getTypeDescription '.' is not replaced by '/'. it seems that makes problems for the class loading if '.' is replaced by '/'- Returns:
- the ASM type description for class loading
 
 - 
getTypeDescriptionpublic static java.lang.String getTypeDescription(ClassNode c) array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I- Returns:
- the ASM type description
 
 - 
getClassInternalNamespublic static java.lang.String[] getClassInternalNames(ClassNode[] names) - Returns:
- an array of ASM internal names of the type
 
 - 
pushConstantpublic static void pushConstant(org.objectweb.asm.MethodVisitor mv, int value)
 - 
negateBooleanpublic static void negateBoolean(org.objectweb.asm.MethodVisitor mv) Negate a boolean on stack.
 - 
formatNameForClassLoadingpublic static java.lang.String formatNameForClassLoading(java.lang.String name) returns a name that Class.forName() can take. Notably for arrays: [I, [Ljava.lang.String; etc Regular object type: java.lang.String
 - 
getGenericsMethodSignaturepublic static java.lang.String getGenericsMethodSignature(MethodNode node) 
 - 
getGenericsSignaturepublic static java.lang.String getGenericsSignature(ClassNode node) 
 - 
getGenericsBoundspublic static java.lang.String getGenericsBounds(ClassNode type) 
 - 
doCastpublic static void doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)
 - 
doCastToPrimitivepublic static void doCastToPrimitive(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType)Given a wrapped number type (Byte, Integer, Short, ...), generates bytecode to convert it to a primitive number (int, long, double) using calls to wrapped.[targetType]Value()- Parameters:
- mv- method visitor
- sourceType- the wrapped number type
- targetType- the primitive target type
 
 - 
doCastToWrappedTypepublic static void doCastToWrappedType(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType)Given a primitive number type (byte, integer, short, ...), generates bytecode to convert it to a wrapped number (Integer, Long, Double) using calls to [WrappedType].valueOf- Parameters:
- mv- method visitor
- sourceType- the primitive number type
- targetType- the wrapped target type
 
 - 
doCastpublic static void doCast(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
 - 
unboxpublic static void unbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)Generates the bytecode to unbox the current value on the stack
 - 
unboxpublic static void unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)
 - 
box@Deprecated public static boolean box(org.objectweb.asm.MethodVisitor mv, ClassNode type)Deprecated.box top level operand
 - 
box@Deprecated public static boolean box(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)Deprecated.Generates the bytecode to autobox the current value on the stack
 - 
visitClassLiteralpublic static void visitClassLiteral(org.objectweb.asm.MethodVisitor mv, ClassNode classNode)Visits a class literal. If the type of the classnode is a primitive type, the generated bytecode will be a GETSTATIC Integer.TYPE. If the classnode is not a primitive type, we will generate a LDC instruction.
 - 
isClassLiteralPossiblepublic static boolean isClassLiteralPossible(ClassNode classNode) Tells if a class node is candidate for class literal bytecode optimization. If so, bytecode may use LDC instructions instead of static constant Class fields to retrieve class literals.- Parameters:
- classNode- the classnode for which we want to know if bytecode optimization is possible
- Returns:
- true if the bytecode can be optimized
 
 - 
isSameCompilationUnitpublic static boolean isSameCompilationUnit(ClassNode a, ClassNode b) Returns true if the two classes share the same compilation unit.- Parameters:
- a- class a
- b- class b
- Returns:
- true if both classes share the same compilation unit
 
 - 
hashCodepublic static int hashCode(java.lang.String str) Computes a hash code for a string. The purpose of this hashcode is to be constant independently of the JDK being used.- Parameters:
- str- the string for which to compute the hashcode
- Returns:
- hashcode of the string
 
 - 
convertPrimitiveToBooleanpublic static void convertPrimitiveToBoolean(org.objectweb.asm.MethodVisitor mv, ClassNode type)Converts a primitive type to boolean.- Parameters:
- mv- method visitor
- type- primitive type to convert
 
 - 
doReturnpublic static void doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode type)
 - 
loadpublic static void load(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
 - 
storepublic static void store(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
 
- 
 
-