Package org.codehaus.groovy.classgen.asm
Class BytecodeHelper
java.lang.Object
org.codehaus.groovy.classgen.asm.BytecodeHelper
- All Implemented Interfaces:
org.objectweb.asm.Opcodes
A helper class for bytecode generation with AsmClassGenerator.
- Author:
- James Strachan, Bing Ran, Jochen Theodorou
-
Field Summary
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, 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, V9
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic boolean
Deprecated.static boolean
Deprecated.static void
static void
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()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].valueOfstatic void
static String
returns a name that Class.forName() can take.static String
static String
getClassInternalName
(String name) static String
static String[]
getClassInternalNames
(ClassNode[] names) static String
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 String
getGenericsBounds
(ClassNode type) static String
static String
static String
getMethodDescriptor
(Class returnType, Class[] paramTypes) static String
getMethodDescriptor
(ClassNode returnType, Parameter[] parameters) static String
getMethodDescriptor
(MethodNode methodNode) Returns a method descriptor for the givenMethodNode
.static String
static String
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [Istatic int
Computes a hash code for a string.static boolean
isClassLiteralPossible
(ClassNode classNode) Tells if a class node is candidate for class literal bytecode optimization.static boolean
Returns true if the two classes share the same compilation unit.static void
static void
negateBoolean
(org.objectweb.asm.MethodVisitor mv) negate a boolean on stack.static void
pushConstant
(org.objectweb.asm.MethodVisitor mv, int value) static void
Generates the bytecode to unbox the current value on the stackstatic void
static void
visitClassLiteral
(org.objectweb.asm.MethodVisitor mv, ClassNode classNode) Visits a class literal.
-
Constructor Details
-
BytecodeHelper
public BytecodeHelper()
-
-
Method Details
-
getClassInternalName
-
getClassInternalName
-
getClassInternalName
- Returns:
- the ASM internal name of the type
-
getMethodDescriptor
-
getMethodDescriptor
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
-
getMethodDescriptor
- Returns:
- the ASM method type descriptor
-
getTypeDescription
-
getClassLoadingTypeDescription
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
-
getTypeDescription
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I- Returns:
- the ASM type description
-
getClassInternalNames
- Returns:
- an array of ASM internal names of the type
-
pushConstant
public static void pushConstant(org.objectweb.asm.MethodVisitor mv, int value) -
negateBoolean
public static void negateBoolean(org.objectweb.asm.MethodVisitor mv) negate a boolean on stack. true->false, false->true -
formatNameForClassLoading
returns a name that Class.forName() can take. Notably for arrays: [I, [Ljava.lang.String; etc Regular object type: java.lang.String- Parameters:
name
-
-
doReturn
-
getGenericsMethodSignature
-
getGenericsSignature
-
getGenericsBounds
-
load
-
doCast
-
doCastToPrimitive
public 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 visitorsourceType
- the wrapped number typetargetType
- the primitive target type
-
doCastToWrappedType
public 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 visitorsourceType
- the primitive number typetargetType
- the wrapped target type
-
doCast
-
unbox
Generates the bytecode to unbox the current value on the stack -
unbox
-
box
Deprecated.box top level operand -
box
Deprecated.Generates the bytecode to autobox the current value on the stack -
visitClassLiteral
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. -
isClassLiteralPossible
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
-
isSameCompilationUnit
Returns true if the two classes share the same compilation unit.- Parameters:
a
- class ab
- class b- Returns:
- true if both classes share the same compilation unit
-
hashCode
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
-