Package org.codehaus.groovy.classgen.asm

# 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 Summary

  Constructors
  Constructor
  Description
  `BytecodeHelper()`

- ## 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`
  `convertPrimitiveToBoolean(org.objectweb.asm.MethodVisitor mv, ClassNode type)`
  Converts a primitive type to boolean.
  `static void`
  `doCast(org.objectweb.asm.MethodVisitor mv, Class<?> type)`
  Generates bytecode for casting a value to the specified type.
  `static void`
  `doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)`
  Generates bytecode for casting a value to the specified 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 type)`
  Emits the appropriate return instruction for the supplied type.
  `static String`
  `formatNameForClassLoading(String name)`
  returns a name that Class.forName() can take.
  `static String`
  `getClassInternalName(Class t)`
  `static String`
  `getClassInternalName(String name)`
  `static String`
  `getClassInternalName(ClassNode t)`
  `static String[]`
  `getClassInternalNames(ClassNode[] names)`
  `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 '/'.
  `static String`
  `getGenericsBounds(ClassNode type)`
  Builds the generic bounds signature for a placeholder or parameterized type.
  `static String`
  `getGenericsMethodSignature(MethodNode node)`
  Builds the generic signature for a method when one is required.
  `static String`
  `getGenericsSignature(ClassNode node)`
  Builds the generic signature for a class declaration.
  `static String`
  `getMethodDescriptor(Class returnType, Class[] paramTypes)`
  `static String`
  `getMethodDescriptor(ClassNode returnType, ClassNode[] parameterTypes)`
  `static String`
  `getMethodDescriptor(ClassNode returnType, Parameter[] parameters)`
  `static String`
  `getMethodDescriptor(MethodNode methodNode)`
  Returns a method descriptor for the given `MethodNode`.
  `static String`
  `getTypeDescription(Class c)`
  Returns the JVM descriptor for the supplied runtime class.
  `static String`
  `getTypeDescription(ClassNode c)`
  array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
  `static String`
  `getTypeGenericsSignature(ClassNode node)`
  Builds the generic signature for a parameterized type reference.
  `static int`
  `hashCode(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)`
  Emits the appropriate load instruction for the supplied local variable.
  `static void`
  `negateBoolean(org.objectweb.asm.MethodVisitor mv)`
  Negates a boolean on stack.
  `static void`
  `pushConstant(org.objectweb.asm.MethodVisitor mv, int value)`
  Pushes an integer constant onto the operand stack.
  `static void`
  `store(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)`
  Emits the appropriate store instruction for the supplied local variable.
  `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)`
  Generates the bytecode to unbox the current value on the stack.
  `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)
    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)
    Returns the JVM descriptor for the supplied runtime class.
    Parameters:
      `c` - the runtime class
    Returns:
      the ASM type descriptor

  - ### 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)
    Pushes an integer constant onto the operand stack.
    Parameters:
      `mv` - the current method visitor
      `value` - the constant value

  - ### negateBoolean

    public static void negateBoolean(org.objectweb.asm.MethodVisitor mv)
    Negates 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)
    Builds the generic signature for a method when one is required.
    Parameters:
      `node` - the method node
    Returns:
      the generic signature, or `null` if none is needed

  - ### getTypeGenericsSignature

    public static String getTypeGenericsSignature(ClassNode node)
    Builds the generic signature for a parameterized type reference.
    Parameters:
      `node` - the type node
    Returns:
      the generic type signature, or `null` if none is needed

  - ### getGenericsSignature

    public static String getGenericsSignature(ClassNode node)
    Builds the generic signature for a class declaration.
    Parameters:
      `node` - the class node
    Returns:
      the generic class signature, or `null` if none is needed

  - ### getGenericsBounds

    public static String getGenericsBounds(ClassNode type)
    Builds the generic bounds signature for a placeholder or parameterized type.
    Parameters:
      `type` - the type node
    Returns:
      the bounds signature, or `null` if none is needed

  - ### doCast

    public static void doCast(org.objectweb.asm.MethodVisitor mv, Class<?> type)
    Generates bytecode for casting a value to the specified type.
    Parameters:
      `mv` - the MethodVisitor used to generate bytecode instructions
      `type` - the target Class type for the cast operation (must not be null)
    Since:
      6.0.0
    See Also:
      - `doCast(MethodVisitor, ClassNode)`
      - `unbox(MethodVisitor, Class)`

  - ### doCast

    public static void doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)
    Generates bytecode for casting a value to the specified type.
    Parameters:
      `mv` - the MethodVisitor used to generate bytecode instructions
      `type` - the target ClassNode type for the cast operation (must not be null)
    See Also:
      - `doCast(MethodVisitor, Class)`
      - `unbox(MethodVisitor, ClassNode)`

  - ### 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

  - ### 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)
    Emits the appropriate return instruction for the supplied type.
    Parameters:
      `mv` - the current method visitor
      `type` - the value type being returned

  - ### load

    public static void load(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
    Emits the appropriate load instruction for the supplied local variable.
    Parameters:
      `mv` - the current method visitor
      `type` - the local variable type
      `idx` - the local variable index

  - ### store

    public static void store(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx)
    Emits the appropriate store instruction for the supplied local variable.
    Parameters:
      `mv` - the current method visitor
      `type` - the local variable type
      `idx` - the local variable index