Package org.codehaus.groovy.classgen
Class Verifier
java.lang.Object
org.codehaus.groovy.classgen.Verifier
- All Implemented Interfaces:
GroovyClassVisitor
,org.objectweb.asm.Opcodes
public class Verifier extends java.lang.Object implements GroovyClassVisitor, org.objectweb.asm.Opcodes
Verifies the AST node and adds any default AST code before bytecode generation occurs.
Checks include:
- Methods with duplicate signatures
- Duplicate interfaces
- Reassigned final variables/parameters
- Uninitialized variables
- Bad code in object initializers or constructors
- Mismatches in modifiers or return types between implementations and interfaces/abstract classes
- Methods needed to implement GroovyObject
- Property accessor methods
- Covariant methods
- Additional methods/constructors as needed for default parameters
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
Verifier.DefaultArgsAction
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
__TIMESTAMP
static java.lang.String
__TIMESTAMP__
static java.lang.String
DEFAULT_PARAMETER_GENERATED
static java.lang.String
INITIAL_EXPRESSION
static java.lang.String
STATIC_METACLASS_BOOL
static java.lang.String
SWAP_INIT
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_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, 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, INTEGER, INVOKEDYNAMIC, 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, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V9
-
Constructor Summary
Constructors Constructor Description Verifier()
-
Method Summary
Modifier and Type Method Description protected void
addClosureCode(InnerClassNode node)
protected void
addConstructor(Parameter[] newParams, ConstructorNode ctor, Statement code, ClassNode type)
protected void
addCovariantMethods(ClassNode classNode)
protected void
addDefaultConstructor(ClassNode node)
protected void
addDefaultParameterConstructors(ClassNode type)
Creates a new constructor for each combination of default parameter expressions.protected void
addDefaultParameterMethods(ClassNode type)
Creates a new method for each combination of default parameter expressions.protected void
addDefaultParameters(java.util.List<? extends MethodNode> methods, Verifier.DefaultArgsAction action)
Creates a new helper method for each combination of default parameter expressions.protected void
addDefaultParameters(Verifier.DefaultArgsAction action, MethodNode method)
protected void
addFieldInitialization(java.util.List list, java.util.List staticList, FieldNode fieldNode, boolean isEnumClassNode, java.util.List initStmtsAfterEnumValuesInit, java.util.Set explicitStaticPropsInEnum)
protected void
addGroovyObjectInterfaceAndMethods(ClassNode node, java.lang.String classInternalName)
protected void
addInitialization(ClassNode node)
protected void
addInitialization(ClassNode node, ConstructorNode constructorNode)
protected MethodNode
addMethod(ClassNode node, boolean shouldBeSynthetic, java.lang.String name, int modifiers, ClassNode returnType, Parameter[] parameters, ClassNode[] exceptions, Statement code)
Helper method to add a new method to a ClassNode.protected void
addMethod$$bridge(ClassNode node, boolean shouldBeSynthetic, java.lang.String name, int modifiers, ClassNode returnType, Parameter[] parameters, ClassNode[] exceptions, Statement code)
protected void
addPropertyMethod(MethodNode method)
protected void
addReturnIfNeeded(MethodNode node)
protected void
addTimeStamp(ClassNode node)
Deprecated.static java.lang.String
capitalize(java.lang.String name)
Capitalizes the start of the given bean property name.protected Statement
createGetterBlock(PropertyNode propertyNode, FieldNode field)
protected Statement
createSetterBlock(PropertyNode propertyNode, FieldNode field)
ClassNode
getClassNode()
protected FinalVariableAnalyzer.VariableNotFinalCallback
getFinalVariablesCallback()
MethodNode
getMethodNode()
static long
getTimestamp(java.lang.Class<?> clazz)
static java.lang.Long
getTimestampFromFieldName(java.lang.String fieldName)
protected void
setClassNode(ClassNode classNode)
static ConstantExpression
transformToPrimitiveConstantIfPossible(ConstantExpression constantExpression)
When constant expressions are created, the value is always wrapped to a non primitive type.void
visitClass(ClassNode node)
Visit a ClassNode.void
visitConstructor(ConstructorNode node)
Visit a ConstructorNode.void
visitField(FieldNode node)
Visit a FieldNode.void
visitGenericType(GenericsType genericsType)
void
visitMethod(MethodNode node)
Visit a MethodNode.void
visitProperty(PropertyNode node)
Visit a PropertyNode.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Field Details
-
SWAP_INIT
public static final java.lang.String SWAP_INIT- See Also:
- Constant Field Values
-
STATIC_METACLASS_BOOL
public static final java.lang.String STATIC_METACLASS_BOOL- See Also:
- Constant Field Values
-
INITIAL_EXPRESSION
public static final java.lang.String INITIAL_EXPRESSION- See Also:
- Constant Field Values
-
DEFAULT_PARAMETER_GENERATED
public static final java.lang.String DEFAULT_PARAMETER_GENERATED- See Also:
- Constant Field Values
-
__TIMESTAMP
public static final java.lang.String __TIMESTAMP- See Also:
- Constant Field Values
-
__TIMESTAMP__
public static final java.lang.String __TIMESTAMP__- See Also:
- Constant Field Values
-
-
Constructor Details
-
Verifier
public Verifier()
-
-
Method Details
-
getClassNode
-
setClassNode
-
getMethodNode
-
visitClass
Description copied from interface:GroovyClassVisitor
Visit a ClassNode.- Specified by:
visitClass
in interfaceGroovyClassVisitor
-
getFinalVariablesCallback
-
addDefaultConstructor
-
addGroovyObjectInterfaceAndMethods
protected void addGroovyObjectInterfaceAndMethods(ClassNode node, java.lang.String classInternalName) -
addMethod
protected MethodNode addMethod(ClassNode node, boolean shouldBeSynthetic, java.lang.String name, int modifiers, ClassNode returnType, Parameter[] parameters, ClassNode[] exceptions, Statement code)Helper method to add a new method to a ClassNode. Depending on the shouldBeSynthetic flag the call will either be made to ClassNode.addSyntheticMethod() or ClassNode.addMethod(). If a non-synthetic method is to be added the ACC_SYNTHETIC modifier is removed if it has been accidentally supplied. -
addMethod$$bridge
-
addTimeStamp
Deprecated. -
visitConstructor
Description copied from interface:GroovyClassVisitor
Visit a ConstructorNode.- Specified by:
visitConstructor
in interfaceGroovyClassVisitor
-
visitMethod
Description copied from interface:GroovyClassVisitor
Visit a MethodNode.- Specified by:
visitMethod
in interfaceGroovyClassVisitor
-
addReturnIfNeeded
-
visitField
Description copied from interface:GroovyClassVisitor
Visit a FieldNode.- Specified by:
visitField
in interfaceGroovyClassVisitor
-
visitProperty
Description copied from interface:GroovyClassVisitor
Visit a PropertyNode.- Specified by:
visitProperty
in interfaceGroovyClassVisitor
-
addPropertyMethod
-
addDefaultParameterMethods
Creates a new method for each combination of default parameter expressions. -
addDefaultParameterConstructors
Creates a new constructor for each combination of default parameter expressions. -
addConstructor
protected void addConstructor(Parameter[] newParams, ConstructorNode ctor, Statement code, ClassNode type) -
addDefaultParameters
protected void addDefaultParameters(java.util.List<? extends MethodNode> methods, Verifier.DefaultArgsAction action)Creates a new helper method for each combination of default parameter expressions. -
addDefaultParameters
-
addClosureCode
-
addInitialization
-
addInitialization
-
addFieldInitialization
protected void addFieldInitialization(java.util.List list, java.util.List staticList, FieldNode fieldNode, boolean isEnumClassNode, java.util.List initStmtsAfterEnumValuesInit, java.util.Set explicitStaticPropsInEnum) -
capitalize
public static java.lang.String capitalize(java.lang.String name)Capitalizes the start of the given bean property name. -
createGetterBlock
-
createSetterBlock
-
visitGenericType
-
getTimestampFromFieldName
public static java.lang.Long getTimestampFromFieldName(java.lang.String fieldName) -
getTimestamp
public static long getTimestamp(java.lang.Class<?> clazz) -
addCovariantMethods
-
transformToPrimitiveConstantIfPossible
public static ConstantExpression transformToPrimitiveConstantIfPossible(ConstantExpression constantExpression)When constant expressions are created, the value is always wrapped to a non primitive type. Some constant expressions are optimized to return primitive types, but not all primitives are handled. This method guarantees to return a similar constant expression but with a primitive type instead of a boxed type. Additionally, single char strings are converted to 'char' types.- Parameters:
constantExpression
- a constant expression- Returns:
- the same instance of constant expression if the type is already primitive, or a primitive constant if possible.
-