Class BytecodeHelper

java.lang.Object
org.codehaus.groovy.classgen.asm.BytecodeHelper

public class BytecodeHelper extends Object
A helper class for bytecode generation with AsmClassGenerator.
  • Constructor Details

    • BytecodeHelper

      public BytecodeHelper()
  • Method Details

    • getClassInternalName

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

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

      public static String getClassInternalName(String name)
      Returns:
      the ASM internal name of the type
    • 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(ClassNode returnType, Parameter[] parameters)
      Returns:
      the ASM method type descriptor
    • getMethodDescriptor

      public static String getMethodDescriptor(ClassNode returnType, ClassNode[] parameterTypes)
      Returns:
      the ASM method type descriptor
    • getMethodDescriptor

      public static String getMethodDescriptor(Class returnType, Class[] paramTypes)
      Returns:
      the ASM method type descriptor
    • 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(Class c)
    • 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.
    • 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
    • getGenericsMethodSignature

      public static String getGenericsMethodSignature(MethodNode node)
    • getTypeGenericsSignature

      public static String getTypeGenericsSignature(ClassNode node)
    • getGenericsSignature

      public static String getGenericsSignature(ClassNode node)
    • getGenericsBounds

      public static 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 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)
    • box

      @Deprecated public static boolean box(org.objectweb.asm.MethodVisitor mv, ClassNode type)
      Deprecated.
      Generates the bytecode to autobox the current value on the stack.
    • 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.
    • unbox

      public static void unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)
      Generates the bytecode to unbox the current value on the stack.
    • unbox

      public static void unbox(org.objectweb.asm.MethodVisitor mv, Class type)
      Generates the bytecode to unbox 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
    • convertPrimitiveToBoolean

      public 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
    • 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)