Groovy Documentation

## org.codehaus.groovy.classgen.asm
[Java] Class BytecodeHelper

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

All Implemented Interfaces:
  org.objectweb.asm.Opcodes

    public class BytecodeHelper
    extends java.lang.Object

A helper class for bytecode generation with AsmClassGenerator.

Authors:
  James Strachan
  Bing Ran
  Jochen Theodorou

Version:
  \$Revision\$

Method Summary
`static boolean` | `box(org.objectweb.asm.MethodVisitor mv, ClassNode type)` box top level operand
`static boolean` | `box(org.objectweb.asm.MethodVisitor mv, java.lang.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, java.lang.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 java.lang.String` | `formatNameForClassLoading(java.lang.String name)` load a message on the stack and remove it right away.
`static java.lang.String` | `getClassInternalName(ClassNode t)`
`static java.lang.String` | `getClassInternalName(java.lang.Class t)`
`static java.lang.String` | `getClassInternalName(java.lang.String name)` @return the ASM internal name of the type
`static java.lang.String[]` | `getClassInternalNames(ClassNode[] names)` @return an array of ASM internal names of the type
`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(ClassNode returnType, Parameter[] parameters)`
`static java.lang.String` | `getMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)` @return the ASM method type descriptor
`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
java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#wait(), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll()

Method Detail

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

### doCast

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

### doCast

    public static void doCast(org.objectweb.asm.MethodVisitor mv, java.lang.Class 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

### doReturn

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

### formatNameForClassLoading

    public static java.lang.String formatNameForClassLoading(java.lang.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

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

### getClassInternalNames

    public static java.lang.String[] getClassInternalNames(ClassNode[] names)

  Returns:
    an array of ASM internal names of the type

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

### getGenericsBounds

    public static java.lang.String getGenericsBounds(ClassNode type)

### getGenericsMethodSignature

    public static java.lang.String getGenericsMethodSignature(MethodNode node)

### getGenericsSignature

    public static java.lang.String getGenericsSignature(ClassNode node)

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

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

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

### load

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

### negateBoolean

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

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

### pushConstant

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

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

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

Groovy Documentation