Class ClosureWriter

java.lang.Object
org.codehaus.groovy.classgen.asm.ClosureWriter
Direct Known Subclasses:
LambdaWriter, StaticTypesClosureWriter

public class ClosureWriter extends Object
Generates bytecode for closure expressions.
  • Field Details

    • OUTER_INSTANCE

      public static final String OUTER_INSTANCE
      Field name for the outer instance reference.
      See Also:
    • THIS_OBJECT

      public static final String THIS_OBJECT
      Field name for the this object reference.
      See Also:
    • controller

      protected final WriterController controller
      The controller coordinating all bytecode writers for the current class.
  • Constructor Details

    • ClosureWriter

      public ClosureWriter(WriterController controller)
      Creates a closure writer with the given controller.
      Parameters:
      controller - the writer controller
  • Method Details

    • writeClosure

      public void writeClosure(ClosureExpression expression)
      Generates bytecode for a closure expression.
      Parameters:
      expression - the closure expression
    • loadReference

      public static void loadReference(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.
      Parameters:
      name - the variable name to load
      controller - the writer controller for the enclosing class
    • getOrAddClosureClass

      public ClassNode 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.
      Parameters:
      expression - the closure expression to compile as an inner class
      modifiers - the access modifiers for the generated class
      Returns:
      the generated closure class node
    • createClosureClass

      protected ClassNode createClosureClass(ClosureExpression expression, int modifiers)
      Creates a new inner class node representing the compiled form of a closure expression.
      Parameters:
      expression - the closure expression to compile
      modifiers - the access modifiers for the generated class
      Returns:
      the newly created closure class node
    • addSerialVersionUIDField

      protected void addSerialVersionUIDField(ClassNode classNode)
      Adds a synthetic serialVersionUID field 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 synthetic public constructor to the closure inner class that accepts the outer instance, this object, and all captured local variable references.
      Parameters:
      expression - the closure expression
      localVariableParams - parameters for closure-shared local variables
      answer - the closure inner class node
      block - 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 to Reference holders.
      Parameters:
      closureClass - the closure inner class node
      localVariableParams - 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 the super(outerInstance, thisObject) call and captured variable references.
      Parameters:
      expression - the closure expression
      outerClass - the class declaring the closure
      thisClassNode - the this type in scope at the closure declaration site
      Returns:
      the block statement for the constructor body
    • removeInitialValues

      protected static void removeInitialValues(Parameter[] params)
      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

      public boolean addGeneratedClosureConstructorCall(ConstructorCallExpression call)
      Emits a super(outerInstance, thisObject) constructor call for a generated closure class. Returns false if the current class is not a generated closure.
      Parameters:
      call - the constructor call expression representing super(...)
      Returns:
      true if the closure constructor call was emitted
    • getClosureSharedVariables

      protected Parameter[] getClosureSharedVariables(ClosureExpression expression)
      Collects the closure-shared local variables referenced by a closure expression as an array of Parameters, using the type chooser to infer each variable's type.
      Parameters:
      expression - the closure expression
      Returns:
      the array of parameters representing captured shared variables
    • loadThis

      protected void loadThis()
      Loads the effective this reference onto the operand stack — either the actual receiver for a regular method, or the result of getThisObject() for a generated closure/lambda.