Package: org.codehaus.groovy.classgen.asm

## [Java] Class BytecodeHelper

- org.codehaus.groovy.classgen.asm.BytecodeHelper

- All Implemented Interfaces and Traits:
    org.objectweb.asm.Opcodes

      public class BytecodeHelper
      extends Object

  A helper class for bytecode generation with AsmClassGenerator.

  Authors:
    James Strachan
    Bing Ran
    Jochen Theodorou

- - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `static boolean` | `box(org.objectweb.asm.MethodVisitor mv, ClassNode type)` box top level operand
    `` | `static boolean` | `box(org.objectweb.asm.MethodVisitor mv, Class type)` Generates the bytecode to autobox the current value on the stack
    `` | `static void` | `doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)`
    `` | `static void` | `doCast(org.objectweb.asm.MethodVisitor mv, Class 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 String` | `formatNameForClassLoading(String name)` load a message on the stack and remove it right away.
    `` | `static String` | `getClassInternalName(ClassNode t)`
    `` | `static String` | `getClassInternalName(Class t)`
    `` | `static String` | `getClassInternalName(String name)` @return the ASM internal name of the type
    `` | `static String[]` | `getClassInternalNames(ClassNode[] names)` @return an array of ASM internal names of the type
    `` | `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)`
    `` | `static String` | `getGenericsMethodSignature(MethodNode node)`
    `` | `static String` | `getGenericsSignature(ClassNode node)`
    `` | `static String` | `getMethodDescriptor(ClassNode returnType, Parameter[] parameters)`
    `` | `static String` | `getMethodDescriptor(MethodNode methodNode)` Returns a method descriptor for the given MethodNode.
    `` | `static String` | `getMethodDescriptor(Class returnType, Class[] paramTypes)` @return the ASM method type descriptor
    `` | `static String` | `getTypeDescription(Class c)`
    `` | `static String` | `getTypeDescription(ClassNode c)` array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
    `` | `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)`
    `` | `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, 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.

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Object` | `wait, wait, wait, equals, toString, hashCode, getClass, notify, notifyAll`

- - ### Method Detail

    - #### @Deprecated public static boolean box(org.objectweb.asm.MethodVisitor mv, ClassNode type)

      box top level operand

    - #### @Deprecated public static boolean box(org.objectweb.asm.MethodVisitor mv, Class type)

      Generates the bytecode to autobox the current value on the stack

    - #### public static void doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type)

    - #### public static void doCast(org.objectweb.asm.MethodVisitor mv, Class type)

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

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

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

    - #### public static String formatNameForClassLoading(String name)

      load a message on the stack and remove it right away. Good for put a mark in the generated bytecode for debugging purpose.

      Parameters:
        msg

    - #### public static String getClassInternalName(ClassNode t)

    - #### public static String getClassInternalName(Class t)

    - #### public static String getClassInternalName(String name)

      Returns:
        the ASM internal name of the type

    - #### public static String[] getClassInternalNames(ClassNode[] names)

      Returns:
        an array of ASM internal names of the type

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

    - #### public static String getGenericsBounds(ClassNode type)

    - #### public static String getGenericsMethodSignature(MethodNode node)

    - #### public static String getGenericsSignature(ClassNode node)

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

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

    - #### public static String getMethodDescriptor(Class returnType, Class[] paramTypes)

      Returns:
        the ASM method type descriptor

    - #### public static String getTypeDescription(Class c)

    - #### public static String getTypeDescription(ClassNode c)

      array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I

      Returns:
        the ASM type description

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

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

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

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

    - #### public static void negateBoolean(org.objectweb.asm.MethodVisitor mv)

      negate a boolean on stack. true->false, false->true

    - #### public static void pushConstant(org.objectweb.asm.MethodVisitor mv, int value)

    - #### public static void unbox(org.objectweb.asm.MethodVisitor mv, Class type)

      Generates the bytecode to unbox the current value on the stack

    - #### public static void unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type)

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