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.Opcodes
A helper class for bytecode generation with AsmClassGenerator.
-
-
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, V21, V9
-
-
Constructor Summary
Constructors Constructor Description BytecodeHelper()
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static boolean
box(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
Deprecated.static boolean
box(org.objectweb.asm.MethodVisitor mv, ClassNode type)
Deprecated.static void
convertPrimitiveToBoolean(org.objectweb.asm.MethodVisitor mv, ClassNode type)
Converts a primitive type to boolean.static void
doCast(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
static void
doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)
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
doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode type)
static java.lang.String
formatNameForClassLoading(java.lang.String name)
returns a name that Class.forName() can take.static java.lang.String
getClassInternalName(java.lang.Class t)
static java.lang.String
getClassInternalName(java.lang.String name)
static java.lang.String
getClassInternalName(ClassNode t)
static java.lang.String[]
getClassInternalNames(ClassNode[] names)
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 '/'.static java.lang.String
getGenericsBounds(ClassNode type)
static java.lang.String
getGenericsMethodSignature(MethodNode node)
static java.lang.String
getGenericsSignature(ClassNode node)
static java.lang.String
getMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)
static java.lang.String
getMethodDescriptor(ClassNode returnType, Parameter[] parameters)
static java.lang.String
getMethodDescriptor(MethodNode methodNode)
Returns a method descriptor for the givenMethodNode
.static java.lang.String
getTypeDescription(java.lang.Class c)
static java.lang.String
getTypeDescription(ClassNode c)
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [Istatic int
hashCode(java.lang.String str)
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
isSameCompilationUnit(ClassNode a, ClassNode b)
Returns true if the two classes share the same compilation unit.static void
load(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
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
store(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
static void
unbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
Generates the bytecode to unbox the current value on the stackstatic void
unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)
static void
visitClassLiteral(org.objectweb.asm.MethodVisitor mv, ClassNode classNode)
Visits a class literal.
-
-
-
Method Detail
-
getClassInternalName
public static java.lang.String getClassInternalName(ClassNode t)
-
getClassInternalName
public static java.lang.String getClassInternalName(java.lang.Class t)
-
getClassInternalName
public static java.lang.String getClassInternalName(java.lang.String name)
- Returns:
- the ASM internal name of the type
-
getMethodDescriptor
public static java.lang.String getMethodDescriptor(ClassNode returnType, Parameter[] parameters)
-
getMethodDescriptor
public 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
-
getMethodDescriptor
public static java.lang.String getMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)
- Returns:
- the ASM method type descriptor
-
getTypeDescription
public static java.lang.String getTypeDescription(java.lang.Class c)
-
getClassLoadingTypeDescription
public 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
-
getTypeDescription
public static java.lang.String getTypeDescription(ClassNode c)
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I- Returns:
- the ASM type description
-
getClassInternalNames
public static java.lang.String[] getClassInternalNames(ClassNode[] names)
- 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.
-
formatNameForClassLoading
public 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
-
getGenericsMethodSignature
public static java.lang.String getGenericsMethodSignature(MethodNode node)
-
getGenericsSignature
public static java.lang.String getGenericsSignature(ClassNode node)
-
getGenericsBounds
public static java.lang.String getGenericsBounds(ClassNode type)
-
doCast
public static void doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)
-
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
public static void doCast(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
-
unbox
public static void unbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
Generates the bytecode to unbox the current value on the stack
-
unbox
public 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
-
visitClassLiteral
public 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.
-
isClassLiteralPossible
public 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
-
isSameCompilationUnit
public static boolean isSameCompilationUnit(ClassNode a, ClassNode b)
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
public 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
-
convertPrimitiveToBoolean
public static void convertPrimitiveToBoolean(org.objectweb.asm.MethodVisitor mv, ClassNode type)
Converts a primitive type to boolean.- Parameters:
mv
- method visitortype
- primitive type to convert
-
doReturn
public static void doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode type)
-
load
public static void load(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
-
store
public static void store(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
-
-