org.codehaus.groovy.classgen.asm
Class BytecodeHelper

java.lang.Object
  extended by 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_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM4, 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, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7
 
Constructor Summary
BytecodeHelper()
           
 
Method Summary
static boolean box(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
          Generates the bytecode to autobox the current value on the stack
static boolean box(org.objectweb.asm.MethodVisitor mv, ClassNode type)
          box top level operand
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.
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
static void doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode returnType)
           
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(ClassNode t)
           
static java.lang.String getClassInternalName(java.lang.String name)
           
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 getTypeDescription(java.lang.Class c)
           
static java.lang.String getTypeDescription(ClassNode c)
          array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
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. true->false, false->true
static void pushConstant(org.objectweb.asm.MethodVisitor mv, int value)
           
static void unbox(org.objectweb.asm.MethodVisitor mv, java.lang.Class type)
          Generates the bytecode to unbox the current value on the stack
static void unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)
           
static void visitClassLiteral(org.objectweb.asm.MethodVisitor mv, ClassNode classNode)
          Visits a class literal.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BytecodeHelper

public BytecodeHelper()
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(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. true->false, false->true


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

Parameters:
name -

doReturn

public static void doReturn(org.objectweb.asm.MethodVisitor mv,
                            ClassNode returnType)

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)

load

public static void load(org.objectweb.asm.MethodVisitor mv,
                        ClassNode type,
                        int idx)

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 visitor
sourceType - the wrapped number type
targetType - 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 visitor
sourceType - the primitive number type
targetType - 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

public static boolean box(org.objectweb.asm.MethodVisitor mv,
                          ClassNode type)
box top level operand


box

public static boolean box(org.objectweb.asm.MethodVisitor mv,
                          java.lang.Class type)
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 a
b - class b
Returns:
true if both classes share the same compilation unit