org.codehaus.groovy.classgen
Class CompileStack

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

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

This class is a helper for AsmClassGenerator. It manages different aspects of the code of a code block like handling labels, defining variables, and scopes. After a MethodNode is visited clear should be called, for initialization the method init should be used.

Some Notes:

Author:
Jochen Theodorou
See Also:
AsmClassGenerator

Nested Class Summary
private  class CompileStack.StateStackElement
           
 
Field Summary
private  org.objectweb.asm.Label breakLabel
           
private  java.lang.String className
           
private  boolean clear
           
private  org.objectweb.asm.Label continueLabel
           
private  java.util.Map currentBlockNamedLabels
           
private  int currentClassIndex
           
private  int currentMetaClassIndex
           
private  int currentVariableIndex
           
private  java.util.LinkedList finallyBlocks
           
private  BytecodeHelper helper
           
private  int localVariableOffset
           
private  org.objectweb.asm.MethodVisitor mv
           
private  java.util.Map namedLoopBreakLabel
           
private  java.util.Map namedLoopContinueLabel
           
private  int nextVariableIndex
           
private  VariableScope scope
           
private  java.util.Map stackVariables
           
private  java.util.LinkedList stateStack
           
private  java.util.Map superBlockNamedLabels
           
private  java.util.List temporaryVariables
           
private  org.objectweb.asm.Label thisEndLabel
           
private  org.objectweb.asm.Label thisStartLabel
           
private  java.util.LinkedList usedVariables
           
private  java.util.List visitedBlocks
           
 
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
CompileStack()
           
 
Method Summary
 void applyFinallyBlocks()
           
 void applyFinallyBlocks(org.objectweb.asm.Label label, boolean isBreakLabel)
           
private  void applyFinallyBlocks(java.util.List blocks)
           
 void clear()
          Clears the state of the class.
 boolean containsVariable(java.lang.String name)
           
 org.objectweb.asm.Label createLocalLabel(java.lang.String name)
          creates a new named label
private  void createReference(Variable reference)
           
private  void defineMethodVariables(Parameter[] paras, boolean isInStaticContext)
           
 int defineTemporaryVariable(java.lang.String name, boolean store)
          creates a temporary variable.
 int defineTemporaryVariable(java.lang.String name, ClassNode node, boolean store)
          creates a temporary variable.
 int defineTemporaryVariable(Variable var, boolean store)
          creates a temporary variable.
private  Variable defineVar(java.lang.String name, ClassNode type, boolean methodParameterUsedInClosure)
           
 Variable defineVariable(Variable v, boolean initFromStack)
          Defines a new Variable using an AST variable.
 org.objectweb.asm.Label getBreakLabel()
           
 org.objectweb.asm.Label getContinueLabel()
           
 int getCurrentClassIndex()
           
 int getCurrentMetaClassIndex()
           
 org.objectweb.asm.Label getLabel(java.lang.String name)
          Returns the label for the given name
protected  org.objectweb.asm.Label getNamedBreakLabel(java.lang.String name)
          Used for break foo inside a loop to end the execution of the marked loop.
protected  org.objectweb.asm.Label getNamedContinueLabel(java.lang.String name)
          Used for continue foo inside a loop to continue the execution of the marked loop.
 VariableScope getScope()
           
 Variable getVariable(java.lang.String variableName)
           
 Variable getVariable(java.lang.String variableName, boolean mustExist)
           
 boolean hasFinallyBlocks()
           
protected  void init(VariableScope el, Parameter[] parameters, org.objectweb.asm.MethodVisitor mv, ClassNode cn)
          initializes this class for a MethodNode.
private  void initLoopLabels(java.lang.String labelName)
           
private  void makeLocalVariablesOffset(Parameter[] paras, boolean isInStaticContext)
           
private  void makeNextVariableID(ClassNode type)
          Calculates the index of the next free register stores ir and sets the current variable index to the old value
 void pop()
           
 void popFinallyBlock()
           
 void popFinallyBlockVisit(java.lang.Runnable block)
           
private  void popState()
           
protected  void pushBooleanExpression()
          because a boolean Expression may not be evaluated completly it is important to keep the registers clean
 void pushFinallyBlock(java.lang.Runnable block)
           
 void pushFinallyBlockVisit(java.lang.Runnable block)
           
protected  void pushLoop(java.lang.String labelName)
          Should be called when decending into a loop that does not define a scope.
protected  void pushLoop(VariableScope el, java.lang.String labelName)
          Should be called when decending into a loop that defines also a scope.
private  void pushState()
           
protected  org.objectweb.asm.Label pushSwitch()
          Creates a new break label and a element for the state stack so pop has to be called later
protected  void pushVariableScope(VariableScope el)
          Causes the statestack to add an element and sets the given scope as new current variable scope.
 void removeVar(int tempIndex)
           
private  void resetVariableIndex(boolean isStatic)
           
 void setCurrentClassIndex(int index)
           
 void setCurrentMetaClassIndex(int index)
           
private  void setEndLabels()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

clear

private boolean clear

scope

private VariableScope scope

continueLabel

private org.objectweb.asm.Label continueLabel

breakLabel

private org.objectweb.asm.Label breakLabel

stackVariables

private java.util.Map stackVariables

currentVariableIndex

private int currentVariableIndex

nextVariableIndex

private int nextVariableIndex

temporaryVariables

private final java.util.List temporaryVariables

usedVariables

private final java.util.LinkedList usedVariables

superBlockNamedLabels

private java.util.Map superBlockNamedLabels

currentBlockNamedLabels

private java.util.Map currentBlockNamedLabels

finallyBlocks

private java.util.LinkedList finallyBlocks

visitedBlocks

private final java.util.List visitedBlocks

thisStartLabel

private org.objectweb.asm.Label thisStartLabel

thisEndLabel

private org.objectweb.asm.Label thisEndLabel

currentClassIndex

private int currentClassIndex

currentMetaClassIndex

private int currentMetaClassIndex

mv

private org.objectweb.asm.MethodVisitor mv

helper

private BytecodeHelper helper

stateStack

private final java.util.LinkedList stateStack

localVariableOffset

private int localVariableOffset

namedLoopBreakLabel

private final java.util.Map namedLoopBreakLabel

namedLoopContinueLabel

private final java.util.Map namedLoopContinueLabel

className

private java.lang.String className
Constructor Detail

CompileStack

public CompileStack()
Method Detail

pushState

private void pushState()

popState

private void popState()

getContinueLabel

public org.objectweb.asm.Label getContinueLabel()

getBreakLabel

public org.objectweb.asm.Label getBreakLabel()

removeVar

public void removeVar(int tempIndex)

setEndLabels

private void setEndLabels()

pop

public void pop()

getScope

public VariableScope getScope()

defineTemporaryVariable

public int defineTemporaryVariable(Variable var,
                                   boolean store)
creates a temporary variable.

Parameters:
var - defines type and name
store - defines if the toplevel argument of the stack should be stored
Returns:
the index used for this temporary variable

getVariable

public Variable getVariable(java.lang.String variableName)

getVariable

public Variable getVariable(java.lang.String variableName,
                            boolean mustExist)

defineTemporaryVariable

public int defineTemporaryVariable(java.lang.String name,
                                   boolean store)
creates a temporary variable.

Parameters:
name - defines type and name
store - defines if the toplevel argument of the stack should be stored
Returns:
the index used for this temporary variable

defineTemporaryVariable

public int defineTemporaryVariable(java.lang.String name,
                                   ClassNode node,
                                   boolean store)
creates a temporary variable.

Parameters:
name - defines the name
node - defines the node
store - defines if the toplevel argument of the stack should be stored
Returns:
the index used for this temporary variable

resetVariableIndex

private void resetVariableIndex(boolean isStatic)

clear

public void clear()
Clears the state of the class. This method should be called after a MethodNode is visited. Note that a call to init will fail if clear is not called before


init

protected void init(VariableScope el,
                    Parameter[] parameters,
                    org.objectweb.asm.MethodVisitor mv,
                    ClassNode cn)
initializes this class for a MethodNode. This method will automatically define varibales for the method parameters and will create references if needed. the created variables can be get by getVariable


pushVariableScope

protected void pushVariableScope(VariableScope el)
Causes the statestack to add an element and sets the given scope as new current variable scope. Creates a element for the state stack so pop has to be called later


pushLoop

protected void pushLoop(VariableScope el,
                        java.lang.String labelName)
Should be called when decending into a loop that defines also a scope. Calls pushVariableScope and prepares labels for a loop structure. Creates a element for the state stack so pop has to be called later


initLoopLabels

private void initLoopLabels(java.lang.String labelName)

pushLoop

protected void pushLoop(java.lang.String labelName)
Should be called when decending into a loop that does not define a scope. Creates a element for the state stack so pop has to be called later


getNamedBreakLabel

protected org.objectweb.asm.Label getNamedBreakLabel(java.lang.String name)
Used for break foo inside a loop to end the execution of the marked loop. This method will return the break label of the loop if there is one found for the name. If not, the current break label is returned.


getNamedContinueLabel

protected org.objectweb.asm.Label getNamedContinueLabel(java.lang.String name)
Used for continue foo inside a loop to continue the execution of the marked loop. This method will return the break label of the loop if there is one found for the name. If not, getLabel is used.


pushSwitch

protected org.objectweb.asm.Label pushSwitch()
Creates a new break label and a element for the state stack so pop has to be called later


pushBooleanExpression

protected void pushBooleanExpression()
because a boolean Expression may not be evaluated completly it is important to keep the registers clean


defineVar

private Variable defineVar(java.lang.String name,
                           ClassNode type,
                           boolean methodParameterUsedInClosure)

makeLocalVariablesOffset

private void makeLocalVariablesOffset(Parameter[] paras,
                                      boolean isInStaticContext)

defineMethodVariables

private void defineMethodVariables(Parameter[] paras,
                                   boolean isInStaticContext)

createReference

private void createReference(Variable reference)

defineVariable

public Variable defineVariable(Variable v,
                               boolean initFromStack)
Defines a new Variable using an AST variable.

Parameters:
initFromStack - if true the last element of the stack will be used to initilize the new variable. If false null will be used.

containsVariable

public boolean containsVariable(java.lang.String name)
Parameters:
name - the name of the variable of interest
Returns:
true if a variable is already defined

makeNextVariableID

private void makeNextVariableID(ClassNode type)
Calculates the index of the next free register stores ir and sets the current variable index to the old value


getLabel

public org.objectweb.asm.Label getLabel(java.lang.String name)
Returns the label for the given name


createLocalLabel

public org.objectweb.asm.Label createLocalLabel(java.lang.String name)
creates a new named label


getCurrentClassIndex

public int getCurrentClassIndex()

setCurrentClassIndex

public void setCurrentClassIndex(int index)

getCurrentMetaClassIndex

public int getCurrentMetaClassIndex()

setCurrentMetaClassIndex

public void setCurrentMetaClassIndex(int index)

applyFinallyBlocks

public void applyFinallyBlocks(org.objectweb.asm.Label label,
                               boolean isBreakLabel)

applyFinallyBlocks

private void applyFinallyBlocks(java.util.List blocks)

applyFinallyBlocks

public void applyFinallyBlocks()

hasFinallyBlocks

public boolean hasFinallyBlocks()

pushFinallyBlock

public void pushFinallyBlock(java.lang.Runnable block)

popFinallyBlock

public void popFinallyBlock()

pushFinallyBlockVisit

public void pushFinallyBlockVisit(java.lang.Runnable block)

popFinallyBlockVisit

public void popFinallyBlockVisit(java.lang.Runnable block)


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