Package org.codehaus.groovy.classgen.asm
Class ClosureWriter
java.lang.Object
org.codehaus.groovy.classgen.asm.ClosureWriter
- Direct Known Subclasses:
LambdaWriter,StaticTypesClosureWriter
Generates bytecode for closure expressions.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected static classVisitor that rewritesVariableExpressionnodes whose accessed variable is aFieldNodein an outer class to instead reference the corresponding field in the generated closure inner class.protected static interfaceMarker interface for using existing reference. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final WriterControllerThe controller coordinating all bytecode writers for the current class.static final StringField name for the outer instance reference.static final StringField name for the this object reference. -
Constructor Summary
ConstructorsConstructorDescriptionClosureWriter(WriterController controller) Creates a closure writer with the given controller. -
Method Summary
Modifier and TypeMethodDescriptionprotected ConstructorNodeaddConstructor(ClosureExpression expression, Parameter[] localVariableParams, InnerClassNode answer, BlockStatement block) Adds a syntheticpublicconstructor to the closure inner class that accepts the outer instance,thisobject, and all captured local variable references.protected voidaddFieldsForLocalVariables(InnerClassNode closureClass, Parameter[] localVariableParams) Adds synthetic private fields to the closure inner class for each captured local variable parameter, promoting them toReferenceholders.booleanEmits asuper(outerInstance, thisObject)constructor call for a generated closure class.protected voidaddSerialVersionUIDField(ClassNode classNode) Adds a syntheticserialVersionUIDfield to the closure class, derived from a hash of the class name.protected BlockStatementcreateBlockStatementForConstructor(ClosureExpression expression, ClassNode outerClass, ClassNode thisClassNode) Creates the block statement for the closure's synthetic constructor, setting up thesuper(outerInstance, thisObject)call and captured variable references.protected ClassNodecreateClosureClass(ClosureExpression expression, int modifiers) Creates a new inner class node representing the compiled form of a closure expression.protected Parameter[]getClosureSharedVariables(ClosureExpression expression) Collects the closure-shared local variables referenced by a closure expression as an array ofParameters, using the type chooser to infer each variable's type.getOrAddClosureClass(ClosureExpression expression, int modifiers) Returns the existing generated class for a closure expression, or creates and registers a new one if none exists yet.static voidloadReference(String name, WriterController controller) Loads a closure-shared variable reference onto the operand stack, looking it up as a field, local variable, or outer closure field as appropriate.protected voidloadThis()Loads the effectivethisreference onto the operand stack — either the actual receiver for a regular method, or the result ofgetThisObject()for a generated closure/lambda.protected static voidremoveInitialValues(Parameter[] params) Strips initial-value expressions from parameters that are closure-shared, ensuring the closure constructor is not duplicated.voidwriteClosure(ClosureExpression expression) Generates bytecode for a closure expression.
-
Field Details
-
OUTER_INSTANCE
Field name for the outer instance reference.- See Also:
-
THIS_OBJECT
Field name for the this object reference.- See Also:
-
controller
The controller coordinating all bytecode writers for the current class.
-
-
Constructor Details
-
ClosureWriter
Creates a closure writer with the given controller.- Parameters:
controller- the writer controller
-
-
Method Details
-
writeClosure
Generates bytecode for a closure expression.- Parameters:
expression- the closure expression
-
loadReference
Loads a closure-shared variable reference onto the operand stack, looking it up as a field, local variable, or outer closure field as appropriate.- Parameters:
name- the variable name to loadcontroller- the writer controller for the enclosing class
-
getOrAddClosureClass
Returns the existing generated class for a closure expression, or creates and registers a new one if none exists yet.- Parameters:
expression- the closure expression to compile as an inner classmodifiers- the access modifiers for the generated class- Returns:
- the generated closure class node
-
createClosureClass
Creates a new inner class node representing the compiled form of a closure expression.- Parameters:
expression- the closure expression to compilemodifiers- the access modifiers for the generated class- Returns:
- the newly created closure class node
-
addSerialVersionUIDField
Adds a syntheticserialVersionUIDfield to the closure class, derived from a hash of the class name.- Parameters:
classNode- the closure class node to add the field to
-
addConstructor
protected ConstructorNode addConstructor(ClosureExpression expression, Parameter[] localVariableParams, InnerClassNode answer, BlockStatement block) Adds a syntheticpublicconstructor to the closure inner class that accepts the outer instance,thisobject, and all captured local variable references.- Parameters:
expression- the closure expressionlocalVariableParams- parameters for closure-shared local variablesanswer- the closure inner class nodeblock- the constructor body- Returns:
- the created constructor node
-
addFieldsForLocalVariables
protected void addFieldsForLocalVariables(InnerClassNode closureClass, Parameter[] localVariableParams) Adds synthetic private fields to the closure inner class for each captured local variable parameter, promoting them toReferenceholders.- Parameters:
closureClass- the closure inner class nodelocalVariableParams- the closure-shared local variable parameters
-
createBlockStatementForConstructor
protected BlockStatement createBlockStatementForConstructor(ClosureExpression expression, ClassNode outerClass, ClassNode thisClassNode) Creates the block statement for the closure's synthetic constructor, setting up thesuper(outerInstance, thisObject)call and captured variable references.- Parameters:
expression- the closure expressionouterClass- the class declaring the closurethisClassNode- thethistype in scope at the closure declaration site- Returns:
- the block statement for the constructor body
-
removeInitialValues
Strips initial-value expressions from parameters that are closure-shared, ensuring the closure constructor is not duplicated.- Parameters:
params- the parameters to mutate in-place
-
addGeneratedClosureConstructorCall
Emits asuper(outerInstance, thisObject)constructor call for a generated closure class. Returnsfalseif the current class is not a generated closure.- Parameters:
call- the constructor call expression representingsuper(...)- Returns:
trueif the closure constructor call was emitted
-
loadThis
protected void loadThis()Loads the effectivethisreference onto the operand stack — either the actual receiver for a regular method, or the result ofgetThisObject()for a generated closure/lambda.
-