Package org.codehaus.groovy.classgen.asm
Class DelegatingController
java.lang.Object
org.codehaus.groovy.classgen.asm.WriterController
org.codehaus.groovy.classgen.asm.DelegatingController
- Direct Known Subclasses:
StaticTypesWriterController
This class will delegate all calls to a WriterController given in the constructor.
-
Field Summary
Fields inherited from class org.codehaus.groovy.classgen.asm.WriterController
optimizeForInt -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptiongetAcg()Returns the AsmClassGenerator managing overall compilation for this class.Returns the AssertionWriter for compiling Groovy assert statements into bytecode that evaluates conditions and raises AssertionError.Returns the appropriate BinaryExpressionHelper for the current code path.intReturns the bytecode version (target JVM version) for classes being compiled.Returns the CallSiteWriter responsible for generating dynamic call site infrastructure.getCallSiteWriterFor(Expression expression) Returns the CallSiteWriter for a specific expression.Returns the internal (JVM) name of the class being compiled.Returns the ClassNode representing the class currently being compiled.org.objectweb.asm.ClassVisitorReturns the ASM ClassVisitor for emitting class-level bytecode directives.Returns the ClosureWriter for compiling Groovy closure literals into inner classes implementing GroovyObject and supporting variable capture.Returns the CompileStack managing local variable slots, scope boundaries, and control flow labels during method compilation.Returns the ConstructorNode for the constructor currently being compiled, or null if no constructor is active or a method is being compiled instead.Returns the GeneratorContext tracking compilation state across the entire compilation unit, including helper classes and shared resources.org.objectweb.asm.ClassVisitorgetCv()Deprecated.Returns the InterfaceHelperClassNode used for interface static method loading, or null if the compiled class is not an interface or needs no helper class.Returns the internal (JVM) name of the immediate superclass.Returns the internal (JVM) name of the class being compiled.Returns the InvocationWriter for compiling method calls and dynamic function invocations into appropriate bytecode patterns.Returns the LambdaWriter for compiling Java-style lambda expressions (using the->operator) into functional interfaces.intReturns the source line number currently being compiled.Returns the MethodNode for the method currently being compiled, or null if no method is active or a constructor is being compiled instead.Returns the MethodPointerExpressionWriter for compiling method pointer expressions (e.g.,String.&length) into method reference objects.Returns the MethodReferenceExpressionWriter for compiling method reference expressions compatible with Java functional interface targets.org.objectweb.asm.MethodVisitorReturns the ASM MethodVisitor for emitting bytecode instructions within the currently-active method or constructor.Returns the OperandStack managing the JVM operand stack, tracking stack depth and type information for bytecode verification and optimization.Returns the outermost enclosing class in the nesting hierarchy.Returns the declared return type of the current method or constructor.Returns the SourceUnit containing the source code being compiled.Returns the StatementWriter for compiling Groovy statements into bytecode.Returns the TypeChooser used to select appropriate type representations for expressions during compilation, supporting both dynamic and typed paths.Returns the appropriate UnaryExpressionHelper for the current code path.voidinit(AsmClassGenerator asmClassGenerator, GeneratorContext gcon, org.objectweb.asm.ClassVisitor cv, ClassNode cn) Initializes this controller with compilation context and ASM infrastructure.booleanReturns true if a constructor is currently being compiled.booleanReturns true if the compiler is currently in fast-path mode, emitting specialized bytecode for primitive type operations.booleanReturns true if the class being compiled is a generated function wrapper (e.g., an inner class synthesized for a closure or lambda expression).booleanReturns true if compiling a constructor within a generated function class.booleanbooleanReturns true if the current method is NOT a static class initializer (<clinit>).booleanReturns true if the current method is a static class initializer (<clinit>).booleanDetermines whether the current execution context is statically scoped.booleanReturns true if the current method is explicitly declared as static.voidResets the tracked line number to -1 (invalid).voidSets the ConstructorNode for the constructor currently being compiled.voidSets the InterfaceHelperClassNode for interface static method loading.voidsetLineNumber(int n) Updates the current source line number being compiled.voidSets the MethodNode for the method currently being compiled.voidsetMethodVisitor(org.objectweb.asm.MethodVisitor methodVisitor) Sets the ASM MethodVisitor for the currently-active method or constructor.booleanReturns true if the bytecode generator should emit optimized fast-path code for integer operations.voidSwitches compilation to fast-path mode for specialized numeric handling.voidSwitches compilation to slow-path mode, reverting to general-purpose bytecode generation.Methods inherited from class org.codehaus.groovy.classgen.asm.WriterController
getNextHelperMethodIndex, getSuperMethodNames, getThisType, visitLineNumber
-
Constructor Details
-
DelegatingController
-
-
Method Details
-
init
public void init(AsmClassGenerator asmClassGenerator, GeneratorContext gcon, org.objectweb.asm.ClassVisitor cv, ClassNode cn) Description copied from class:WriterControllerInitializes this controller with compilation context and ASM infrastructure. Must be called exactly once before any bytecode generation operations. Sets up all supporting writers (call site, closure, lambda, etc.) and configures optimization strategies based on compiler configuration.- Overrides:
initin classWriterController- Parameters:
asmClassGenerator- the class generator managing the overall compilationgcon- the compilation context tracking state across the compilation unitcv- the ASM ClassVisitor for emitting bytecode directivescn- the ClassNode being compiled
-
setMethodNode
Description copied from class:WriterControllerSets the MethodNode for the method currently being compiled. Automatically clears any active constructor node, since only one can be active. Used during compilation to track which method's bytecode is being generated.- Overrides:
setMethodNodein classWriterController- Parameters:
mn- the MethodNode to compile, or null to deactivate
-
setConstructorNode
Description copied from class:WriterControllerSets the ConstructorNode for the constructor currently being compiled. Automatically clears any active method node, since only one can be active. Used during compilation to track which constructor's bytecode is being generated.- Overrides:
setConstructorNodein classWriterController- Parameters:
cn- the ConstructorNode to compile, or null to deactivate
-
isFastPath
public boolean isFastPath()Description copied from class:WriterControllerReturns true if the compiler is currently in fast-path mode, emitting specialized bytecode for primitive type operations. Use this to determine whether expression helpers should apply optimizations.- Overrides:
isFastPathin classWriterController- Returns:
- true if fast-path compilation mode is active
-
getCallSiteWriter
Description copied from class:WriterControllerReturns the CallSiteWriter responsible for generating dynamic call site infrastructure. Behavior depends on bytecode strategy: either invokedynamic for modern JVMs or traditional call-site caching for broader compatibility.- Overrides:
getCallSiteWriterin classWriterController
-
getCallSiteWriterFor
Description copied from class:WriterControllerReturns the CallSiteWriter for a specific expression. Currently delegates to the default CallSiteWriter; reserved for future expression-specific optimization strategies.- Overrides:
getCallSiteWriterForin classWriterController- Parameters:
expression- the expression being processed- Returns:
- the appropriate call site writer for this expression
-
getStatementWriter
Description copied from class:WriterControllerReturns the StatementWriter for compiling Groovy statements into bytecode. Selection depends on optimization mode: OptimizingStatementWriter forWriterController.optimizeForInt, otherwise generic StatementWriter.- Overrides:
getStatementWriterin classWriterController
-
getTypeChooser
Description copied from class:WriterControllerReturns the TypeChooser used to select appropriate type representations for expressions during compilation, supporting both dynamic and typed paths.- Overrides:
getTypeChooserin classWriterController
-
getAcg
Description copied from class:WriterControllerReturns the AsmClassGenerator managing overall compilation for this class. Provides access to source units, compiler configuration, and other compilation-wide state.- Overrides:
getAcgin classWriterController
-
getAssertionWriter
Description copied from class:WriterControllerReturns the AssertionWriter for compiling Groovy assert statements into bytecode that evaluates conditions and raises AssertionError.- Overrides:
getAssertionWriterin classWriterController
-
getBinaryExpressionHelper
Description copied from class:WriterControllerReturns the appropriate BinaryExpressionHelper for the current code path. Selects fast-path specialized handling whenWriterController.isFastPath()is true, otherwise delegates to the general-purpose binary expression handler. Fast-path optimization is controlled byWriterController.optimizeForInt.- Overrides:
getBinaryExpressionHelperin classWriterController- Returns:
- the binary expression writer for the active compilation mode
-
getUnaryExpressionHelper
Description copied from class:WriterControllerReturns the appropriate UnaryExpressionHelper for the current code path. Selects fast-path specialized handling whenWriterController.isFastPath()is true, otherwise delegates to the general-purpose unary expression handler. Fast-path optimization is controlled byWriterController.optimizeForInt.- Overrides:
getUnaryExpressionHelperin classWriterController- Returns:
- the unary expression writer for the active compilation mode
-
getClassName
Description copied from class:WriterControllerReturns the internal (JVM) name of the class being compiled. For interface types with a helper loading class, returns the helper class name; otherwise returns the standard internal class name. Format: package segments separated by '/', e.g., "java/lang/String"- Overrides:
getClassNamein classWriterController- Returns:
- the fully-qualified internal class name
-
getClassNode
Description copied from class:WriterControllerReturns the ClassNode representing the class currently being compiled. Contains the complete AST structure including fields, methods, and metadata. This is immutable for the duration of the compilation process.- Overrides:
getClassNodein classWriterController- Returns:
- the ClassNode for this compilation unit
-
getClassVisitor
public org.objectweb.asm.ClassVisitor getClassVisitor()Description copied from class:WriterControllerReturns the ASM ClassVisitor for emitting class-level bytecode directives. This is the primary interface for writing class metadata, fields, methods, and attributes to the compiled bytecode.- Overrides:
getClassVisitorin classWriterController
-
getClosureWriter
Description copied from class:WriterControllerReturns the ClosureWriter for compiling Groovy closure literals into inner classes implementing GroovyObject and supporting variable capture.- Overrides:
getClosureWriterin classWriterController
-
getLambdaWriter
Description copied from class:WriterControllerReturns the LambdaWriter for compiling Java-style lambda expressions (using the->operator) into functional interfaces.- Overrides:
getLambdaWriterin classWriterController
-
getMethodPointerExpressionWriter
Description copied from class:WriterControllerReturns the MethodPointerExpressionWriter for compiling method pointer expressions (e.g.,String.&length) into method reference objects.- Overrides:
getMethodPointerExpressionWriterin classWriterController
-
getMethodReferenceExpressionWriter
Description copied from class:WriterControllerReturns the MethodReferenceExpressionWriter for compiling method reference expressions compatible with Java functional interface targets.- Overrides:
getMethodReferenceExpressionWriterin classWriterController
-
getCompileStack
Description copied from class:WriterControllerReturns the CompileStack managing local variable slots, scope boundaries, and control flow labels during method compilation.- Overrides:
getCompileStackin classWriterController
-
getConstructorNode
Description copied from class:WriterControllerReturns the ConstructorNode for the constructor currently being compiled, or null if no constructor is active or a method is being compiled instead.- Overrides:
getConstructorNodein classWriterController- Returns:
- the current ConstructorNode, or null if none is active
-
getContext
Description copied from class:WriterControllerReturns the GeneratorContext tracking compilation state across the entire compilation unit, including helper classes and shared resources.- Overrides:
getContextin classWriterController
-
getCv
Deprecated.Description copied from class:WriterControllerReturns the ASM ClassVisitor for emitting class-level bytecode directives.- Overrides:
getCvin classWriterController
-
getInterfaceClassLoadingClass
Description copied from class:WriterControllerReturns the InterfaceHelperClassNode used for interface static method loading, or null if the compiled class is not an interface or needs no helper class. Interface helper classes bridge the gap between interface static methods and their actual implementation in Java 8+ runtime environments.- Overrides:
getInterfaceClassLoadingClassin classWriterController- Returns:
- the helper class node, or null if not applicable
-
getInternalBaseClassName
Description copied from class:WriterControllerReturns the internal (JVM) name of the immediate superclass. The internal name format uses '/' as package separator, e.g., "java/lang/Object". Typically "java/lang/Object" for classes without explicit superclass, or the superclass name for classes with explicit inheritance.- Overrides:
getInternalBaseClassNamein classWriterController- Returns:
- the fully-qualified internal name of the parent class
-
getInternalClassName
Description copied from class:WriterControllerReturns the internal (JVM) name of the class being compiled. The internal name format uses '/' as package separator, e.g., "org/groovy/MyClass". This corresponds to the formal name used in bytecode class descriptors.- Overrides:
getInternalClassNamein classWriterController- Returns:
- the fully-qualified internal class name
-
getInvocationWriter
Description copied from class:WriterControllerReturns the InvocationWriter for compiling method calls and dynamic function invocations into appropriate bytecode patterns.- Overrides:
getInvocationWriterin classWriterController
-
getMethodNode
Description copied from class:WriterControllerReturns the MethodNode for the method currently being compiled, or null if no method is active or a constructor is being compiled instead.- Overrides:
getMethodNodein classWriterController- Returns:
- the current MethodNode, or null if none is active
-
getMethodVisitor
public org.objectweb.asm.MethodVisitor getMethodVisitor()Description copied from class:WriterControllerReturns the ASM MethodVisitor for emitting bytecode instructions within the currently-active method or constructor. Null if no method is active.- Overrides:
getMethodVisitorin classWriterController
-
getOperandStack
Description copied from class:WriterControllerReturns the OperandStack managing the JVM operand stack, tracking stack depth and type information for bytecode verification and optimization.- Overrides:
getOperandStackin classWriterController
-
getOutermostClass
Description copied from class:WriterControllerReturns the outermost enclosing class in the nesting hierarchy. For top-level classes, returns the class itself. For nested classes, traverses outward to find the top-level class.- Overrides:
getOutermostClassin classWriterController- Returns:
- the outermost ClassNode in the nest
-
getReturnType
Description copied from class:WriterControllerReturns the declared return type of the current method or constructor. The return type reflects the method signature from the source code.- Overrides:
getReturnTypein classWriterController- Returns:
- the return type ClassNode
-
getSourceUnit
Description copied from class:WriterControllerReturns the SourceUnit containing the source code being compiled. Provides access to source URLs, encoding, and error reporting infrastructure.- Overrides:
getSourceUnitin classWriterController
-
isConstructor
public boolean isConstructor()Description copied from class:WriterControllerReturns true if a constructor is currently being compiled. False if a regular instance or static method is active, or if no method is active.- Overrides:
isConstructorin classWriterController- Returns:
- true if in constructor compilation context
-
isInGeneratedFunction
public boolean isInGeneratedFunction()Description copied from class:WriterControllerReturns true if the class being compiled is a generated function wrapper (e.g., an inner class synthesized for a closure or lambda expression). Generated functions have an outer class and are marked as generated.- Overrides:
isInGeneratedFunctionin classWriterController- Returns:
- true if compiling a closure or lambda's wrapper class
-
isInGeneratedFunctionConstructor
public boolean isInGeneratedFunctionConstructor()Description copied from class:WriterControllerReturns true if compiling a constructor within a generated function class. Combines two checks: that we're in constructor context AND in a generated function. This condition indicates we're initializing a closure or lambda wrapper.- Overrides:
isInGeneratedFunctionConstructorin classWriterController- Returns:
- true if in a generated function's constructor
-
isNotClinit
public boolean isNotClinit()Description copied from class:WriterControllerReturns true if the current method is NOT a static class initializer (<clinit>). Equivalent to: no method is active OR the method is not a static constructor. Used to guard code that should not execute in class initialization.- Overrides:
isNotClinitin classWriterController- Returns:
- true if not in static initializer context
-
isInScriptBody
public boolean isInScriptBody()- Overrides:
isInScriptBodyin classWriterController- Returns:
- true if we are in a script body, where all variables declared are no longer local variables but are properties
-
isStaticConstructor
public boolean isStaticConstructor()Description copied from class:WriterControllerReturns true if the current method is a static class initializer (<clinit>). The static initializer runs once when the class is loaded by the JVM. Returns false if no method is active or the method is not static.- Overrides:
isStaticConstructorin classWriterController- Returns:
- true if the current method is the static class initializer
-
isStaticContext
public boolean isStaticContext()Description copied from class:WriterControllerDetermines whether the current execution context is statically scoped. Returns true when compiling inside a static method or static class initializer. For instance constructors, checks whether we're in a special constructor call (e.g., super or this call) which requires static semantics.- Overrides:
isStaticContextin classWriterController- Returns:
- true if executing in static context, false for instance context
-
isStaticMethod
public boolean isStaticMethod()Description copied from class:WriterControllerReturns true if the current method is explicitly declared as static. Returns false if no method is active or the method is instance-scoped.- Overrides:
isStaticMethodin classWriterController- Returns:
- true if the current method has the static modifier
-
setInterfaceClassLoadingClass
Description copied from class:WriterControllerSets the InterfaceHelperClassNode for interface static method loading. Called during interface compilation to register the synthesized helper class that provides access to static interface methods in compatible runtimes. The helper class allows proper method lookup and invocation for interface statics.- Overrides:
setInterfaceClassLoadingClassin classWriterController- Parameters:
ihc- the helper class node, or null to deactivate
-
setMethodVisitor
public void setMethodVisitor(org.objectweb.asm.MethodVisitor methodVisitor) Description copied from class:WriterControllerSets the ASM MethodVisitor for the currently-active method or constructor. Called before each method body compilation to direct bytecode emission.- Overrides:
setMethodVisitorin classWriterController- Parameters:
methodVisitor- the visitor for the current method, or null to deactivate
-
shouldOptimizeForInt
public boolean shouldOptimizeForInt()Description copied from class:WriterControllerReturns true if the bytecode generator should emit optimized fast-path code for integer operations. Corresponds to theWriterController.optimizeForIntconfiguration which is disabled when invokedynamic is enabled.- Overrides:
shouldOptimizeForIntin classWriterController- Returns:
- true if integer-optimized fast-path code generation is enabled
-
switchToFastPath
public void switchToFastPath()Description copied from class:WriterControllerSwitches compilation to fast-path mode for specialized numeric handling. In fast-path mode, the compiler emits optimized bytecode for common operations on primitive integer types, bypassing dynamic method invocation overhead. Also resets line number tracking to allow proper debug attribute synchronization.- Overrides:
switchToFastPathin classWriterController
-
switchToSlowPath
public void switchToSlowPath()Description copied from class:WriterControllerSwitches compilation to slow-path mode, reverting to general-purpose bytecode generation. Slow-path mode uses dynamic method dispatch for all operations, suitable when type information is insufficient for safe optimization or type specialization is not beneficial. Also resets line number tracking.- Overrides:
switchToSlowPathin classWriterController
-
getBytecodeVersion
public int getBytecodeVersion()Description copied from class:WriterControllerReturns the bytecode version (target JVM version) for classes being compiled. Examples: V1_8 (Java 8), V11 (Java 11), V17 (Java 17), etc. Determined from compiler configuration and affects class file format and available bytecode features in generated code.- Overrides:
getBytecodeVersionin classWriterController- Returns:
- the target bytecode version constant from ASM
-
setLineNumber
public void setLineNumber(int n) Description copied from class:WriterControllerUpdates the current source line number being compiled. The line number is used for debug information (LineNumberTable attribute) and must be set before emitting bytecode for the corresponding source line.- Overrides:
setLineNumberin classWriterController- Parameters:
n- the new source line number, or -1 to reset
-
getLineNumber
public int getLineNumber()Description copied from class:WriterControllerReturns the source line number currently being compiled. Line numbers are tracked for debug attribute generation in the bytecode, allowing debuggers and profilers to map bytecode instructions to source lines. Returns -1 when no valid line number is active.- Overrides:
getLineNumberin classWriterController- Returns:
- the current source line number, or -1 if invalid/not set
-
resetLineNumber
public void resetLineNumber()Description copied from class:WriterControllerResets the tracked line number to -1 (invalid). Called when switching compilation modes or after line number emission to avoid stale line number information in subsequent bytecode.- Overrides:
resetLineNumberin classWriterController
-