public class CompileStack extends Object
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:
Modifiers | Name | Description |
---|---|---|
static class |
CompileStack.BlockRecorder |
|
protected static class |
CompileStack.LabelRange |
Type Params | Return Type | Name and description |
---|---|---|
|
def |
CompileStack(WriterController wc) |
|
void |
addExceptionBlock(org.objectweb.asm.Label start, org.objectweb.asm.Label end, org.objectweb.asm.Label goal, String sig) |
|
void |
applyBlockRecorder() |
|
void |
applyFinallyBlocks(org.objectweb.asm.Label label, boolean isBreakLabel) |
|
void |
clear() Clears the state of the class. |
|
boolean |
containsVariable(String name) @param name the name of the variable of interest |
|
org.objectweb.asm.Label |
createLocalLabel(String name) creates a new named label |
|
int |
defineTemporaryVariable(Variable var, boolean store) creates a temporary variable. |
|
int |
defineTemporaryVariable(String name, boolean store) creates a temporary variable. |
|
int |
defineTemporaryVariable(String name, ClassNode node, boolean store) creates a temporary variable. |
|
BytecodeVariable |
defineVariable(Variable v, boolean initFromStack) Defines a new Variable using an AST variable. |
|
BytecodeVariable |
defineVariable(Variable v, ClassNode variableType, boolean initFromStack) |
|
org.objectweb.asm.Label |
getBreakLabel() |
|
org.objectweb.asm.Label |
getContinueLabel() |
|
org.objectweb.asm.Label |
getLabel(String name) Returns the label for the given name |
|
org.objectweb.asm.Label |
getNamedBreakLabel(String name) Used for break foo inside a loop to end the
execution of the marked loop. |
|
org.objectweb.asm.Label |
getNamedContinueLabel(String name) Used for continue foo inside a loop to continue
the execution of the marked loop. |
|
VariableScope |
getScope() |
|
BytecodeVariable |
getVariable(String variableName) |
|
BytecodeVariable |
getVariable(String variableName, boolean mustExist) Returns a normal variable. |
|
boolean |
hasBlockRecorder() |
|
void |
init(VariableScope el, Parameter[] parameters) initializes this class for a MethodNode. |
|
boolean |
isImplicitThis() |
|
boolean |
isInSpecialConstructorCall() |
|
boolean |
isLHS() |
|
void |
pop() |
|
void |
popBlockRecorderVisit(CompileStack.BlockRecorder finallyBlock) |
|
void |
popImplicitThis() |
|
void |
popLHS() |
|
void |
pushBlockRecorder(CompileStack.BlockRecorder recorder) |
|
void |
pushBlockRecorderVisit(CompileStack.BlockRecorder finallyBlock) |
|
void |
pushBooleanExpression() because a boolean Expression may not be evaluated completely it is important to keep the registers clean |
|
void |
pushImplicitThis(boolean implicitThis) |
|
void |
pushInSpecialConstructorCall() |
|
void |
pushLHS(boolean lhs) |
|
void |
pushLoop(VariableScope el, String labelName) Should be called when descending into a loop that defines also a scope. |
|
void |
pushLoop(VariableScope el, List<String> labelNames) Should be called when descending into a loop that defines also a scope. |
|
void |
pushLoop(String labelName) Should be called when descending into a loop that does not define a scope. |
|
void |
pushLoop(List<String> labelNames) Should be called when descending into a loop that does not define a scope. |
|
void |
pushState() |
|
org.objectweb.asm.Label |
pushSwitch() Creates a new break label and a element for the state stack so pop has to be called later |
|
void |
pushVariableScope(VariableScope el) Causes the state-stack to add an element and sets the given scope as new current variable scope. |
|
void |
removeVar(int tempIndex) |
|
void |
writeExceptionTable(CompileStack.BlockRecorder block, org.objectweb.asm.Label goal, String sig) |
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
name
- the name of the variable of interestcreates a new named label
creates a temporary variable.
var
- defines type and namestore
- defines if the toplevel argument of the stack should be storedcreates a temporary variable.
name
- defines type and namestore
- defines if the top-level argument of the stack should be storedcreates a temporary variable.
name
- defines the namenode
- defines the nodestore
- defines if the top-level argument of the stack should be storedDefines a new Variable using an AST variable.
initFromStack
- if true the last element of the
stack will be used to initialize
the new variable. If false null
will be used.Returns the label for the given 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.
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.
Returns a normal variable.
If mustExist
is true and the normal variable doesn't exist,
then this method will throw a GroovyBugError. It is not the intention of
this method to let this happen! And the exception should not be used for
flow control - it is just acting as an assertion. If the exception is thrown
then it indicates a bug in the class using CompileStack.
This method can also not be used to return a temporary variable.
Temporary variables are not normal variables.
variableName
- name of the variablemustExist
- throw exception if variable does not existmustExist
not true)initializes this class for a MethodNode. This method will automatically define variables for the method parameters and will create references if needed. The created variables can be accessed by calling getVariable().
because a boolean Expression may not be evaluated completely it is important to keep the registers clean
Should be called when descending 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, TODO:
Should be called when descending 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
Should be called when descending into a loop that does not define a scope. Creates a element for the state stack so pop has to be called later, TODO:
Should be called when descending into a loop that does not define a scope. Creates a element for the state stack so pop has to be called later
Creates a new break label and a element for the state stack so pop has to be called later
Causes the state-stack 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