Class BytecodeHelper

java.lang.Object
org.codehaus.groovy.classgen.asm.BytecodeHelper
All Implemented Interfaces:
org.objectweb.asm.Opcodes

public class BytecodeHelper extends Object implements 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

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static boolean
    box(org.objectweb.asm.MethodVisitor mv, Class type)
    Deprecated.
    static boolean
    box(org.objectweb.asm.MethodVisitor mv, ClassNode type)
    Deprecated.
    static void
    doCast(org.objectweb.asm.MethodVisitor mv, 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].valueOf
    static void
    doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode returnType)
     
    static String
    returns a name that Class.forName() can take.
    static String
     
    static String
     
    static String
     
    static String[]
     
    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
     
    static String
     
    static String
     
    static String
    getMethodDescriptor(Class returnType, Class[] paramTypes)
     
    static String
    getMethodDescriptor(ClassNode returnType, Parameter[] parameters)
     
    static String
    Returns a method descriptor for the given MethodNode.
    static String
     
    static String
    array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
    static int
    Computes a hash code for a string.
    static boolean
    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
    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
    unbox(org.objectweb.asm.MethodVisitor mv, 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 Details

    • BytecodeHelper

      public BytecodeHelper()
  • Method Details

    • getClassInternalName

      public static String getClassInternalName(ClassNode t)
    • getClassInternalName

      public static String getClassInternalName(Class t)
    • getClassInternalName

      public static String getClassInternalName(String name)
      Returns:
      the ASM internal name of the type
    • getMethodDescriptor

      public static String getMethodDescriptor(ClassNode returnType, Parameter[] parameters)
    • getMethodDescriptor

      public static String getMethodDescriptor(MethodNode methodNode)
      Returns a method descriptor for the given MethodNode.
      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 String getMethodDescriptor(Class returnType, Class[] paramTypes)
      Returns:
      the ASM method type descriptor
    • getTypeDescription

      public static String getTypeDescription(Class c)
    • getClassLoadingTypeDescription

      public static 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 String getTypeDescription(ClassNode c)
      array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
      Returns:
      the ASM type description
    • getClassInternalNames

      public static 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 String formatNameForClassLoading(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 String getGenericsMethodSignature(MethodNode node)
    • getGenericsSignature

      public static String getGenericsSignature(ClassNode node)
    • getGenericsBounds

      public static 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, Class type)
    • unbox

      public static void unbox(org.objectweb.asm.MethodVisitor mv, 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, 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 a
      b - class b
      Returns:
      true if both classes share the same compilation unit
    • hashCode

      public static int hashCode(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