org.codehaus.groovy.classgen
Class BytecodeHelper

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

public class BytecodeHelper
extends java.lang.Object
implements org.objectweb.asm.Opcodes

A helper class for bytecode generation with AsmClassGenerator.

Version:
$Revision: 8045 $
Author:
James Strachan, Bing Ran, Jochen Theodorou

Field Summary
private  org.objectweb.asm.MethodVisitor mv
           
 
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_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, 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, 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, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6
 
Constructor Summary
BytecodeHelper(org.objectweb.asm.MethodVisitor mv)
           
 
Method Summary
private static void addSubTypes(java.lang.StringBuffer ret, GenericsType[] types, java.lang.String start, java.lang.String end)
           
 void box(java.lang.Class type)
          Generates the bytecode to autobox the current value on the stack
 void box(ClassNode type)
           
 void boxBoolean()
          convert boolean to Boolean
static ClassNode boxOnPrimitive(ClassNode type)
           
 void doCast(java.lang.Class type)
           
 void doCast(ClassNode type)
           
 void doReturn(ClassNode returnType)
           
 void dup()
           
static java.lang.String formatNameForClassLoading(java.lang.String name)
          returns a name that Class.forName() can take.
static java.lang.String getClassInternalName(java.lang.Class t)
           
static java.lang.String getClassInternalName(ClassNode t)
           
static java.lang.String getClassInternalName(java.lang.String name)
           
static java.lang.String[] getClassInternalNames(ClassNode[] names)
           
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)
           
private static void getGenericsTypeSpec(java.lang.StringBuffer ret, GenericsType[] genericsTypes)
           
static java.lang.String getMethodDescriptor(java.lang.Class returnType, java.lang.Class[] paramTypes)
           
static java.lang.String getMethodDescriptor(ClassNode returnType, Parameter[] parameters)
           
 org.objectweb.asm.MethodVisitor getMethodVisitor()
           
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
private static java.lang.String getTypeDescription(ClassNode c, boolean end)
          array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
private static boolean hasGenerics(Parameter[] param)
           
 void load(ClassNode type, int idx)
           
 void load(Variable v)
           
(package private)  void loadConstant(java.lang.Object value)
          load the constant on the operand stack.
 void loadVar(Variable variable)
          load the value of the variable on the operand stack.
 void mark(java.lang.String msg)
          load a message on the stack and remove it right away.
 void negateBoolean()
          negate a boolean on stack.
protected  void pushConstant(boolean value)
           
 void pushConstant(int value)
           
 void putField(FieldNode fld)
           
 void putField(FieldNode fld, java.lang.String ownerName)
           
 void quickBoxIfNecessary(ClassNode type)
          box the primitive value on the stack
 void quickUnboxIfNecessary(ClassNode type)
           
 void store(Variable v)
           
 void store(Variable v, boolean markStart)
           
 void storeVar(Variable variable)
           
 void swapObjectWith(ClassNode type)
           
 void swapWithObject(ClassNode type)
           
 void unbox(java.lang.Class type)
          Generates the bytecode to unbox the current value on the stack
 void unbox(ClassNode type)
           
private static boolean usesGenericsInClassSignature(ClassNode node)
           
private static void writeGenericsBounds(java.lang.StringBuffer ret, GenericsType type, boolean writeInterfaceMarker)
           
private static void writeGenericsBoundType(java.lang.StringBuffer ret, ClassNode printType, boolean writeInterfaceMarker)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

mv

private org.objectweb.asm.MethodVisitor mv
Constructor Detail

BytecodeHelper

public BytecodeHelper(org.objectweb.asm.MethodVisitor mv)
Method Detail

getMethodVisitor

public org.objectweb.asm.MethodVisitor getMethodVisitor()

quickBoxIfNecessary

public void quickBoxIfNecessary(ClassNode type)
box the primitive value on the stack

Parameters:
type -

quickUnboxIfNecessary

public void quickUnboxIfNecessary(ClassNode type)

box

public void box(java.lang.Class type)
Generates the bytecode to autobox the current value on the stack


box

public void box(ClassNode type)

unbox

public void unbox(java.lang.Class type)
Generates the bytecode to unbox the current value on the stack


unbox

public void unbox(ClassNode type)

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

getMethodDescriptor

public static java.lang.String getMethodDescriptor(ClassNode returnType,
                                                   Parameter[] parameters)
Returns:
the ASM method type descriptor

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)

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

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

getTypeDescription

private static java.lang.String getTypeDescription(ClassNode c,
                                                   boolean end)
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I

Returns:
the ASM type description

getClassInternalNames

public static java.lang.String[] getClassInternalNames(ClassNode[] names)
Returns:
an array of ASM internal names of the type

pushConstant

protected void pushConstant(boolean value)

pushConstant

public void pushConstant(int value)

doCast

public void doCast(java.lang.Class type)

doCast

public void doCast(ClassNode type)

load

public void load(ClassNode type,
                 int idx)

load

public void load(Variable v)

store

public void store(Variable v,
                  boolean markStart)

store

public void store(Variable v)

loadConstant

void loadConstant(java.lang.Object value)
load the constant on the operand stack. primitives auto-boxed.


loadVar

public void loadVar(Variable variable)
load the value of the variable on the operand stack. unbox it if it's a reference

Parameters:
variable -

storeVar

public void storeVar(Variable variable)

putField

public void putField(FieldNode fld)

putField

public void putField(FieldNode fld,
                     java.lang.String ownerName)

swapObjectWith

public void swapObjectWith(ClassNode type)

swapWithObject

public void swapWithObject(ClassNode type)

boxOnPrimitive

public static ClassNode boxOnPrimitive(ClassNode type)

boxBoolean

public void boxBoolean()
convert boolean to Boolean


negateBoolean

public void negateBoolean()
negate a boolean on stack. true->false, false->true


mark

public void mark(java.lang.String msg)
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 -

formatNameForClassLoading

public static java.lang.String formatNameForClassLoading(java.lang.String name)
returns a name that Class.forName() can take. Notablely for arrays: [I, [Ljava.lang.String; etc Regular object type: java.lang.String

Parameters:
name -

dup

public void dup()

doReturn

public void doReturn(ClassNode returnType)

hasGenerics

private static boolean hasGenerics(Parameter[] param)

getGenericsMethodSignature

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

usesGenericsInClassSignature

private static boolean usesGenericsInClassSignature(ClassNode node)

getGenericsSignature

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

getGenericsTypeSpec

private static void getGenericsTypeSpec(java.lang.StringBuffer ret,
                                        GenericsType[] genericsTypes)

getGenericsBounds

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

writeGenericsBoundType

private static void writeGenericsBoundType(java.lang.StringBuffer ret,
                                           ClassNode printType,
                                           boolean writeInterfaceMarker)

writeGenericsBounds

private static void writeGenericsBounds(java.lang.StringBuffer ret,
                                        GenericsType type,
                                        boolean writeInterfaceMarker)

addSubTypes

private static void addSubTypes(java.lang.StringBuffer ret,
                                GenericsType[] types,
                                java.lang.String start,
                                java.lang.String end)


Copyright © ${year} The Codehaus. All Rights Reserved.