public abstract class SpelNodeImpl extends Object implements SpelNode, Opcodes
Modifier and Type | Field and Description |
---|---|
protected SpelNodeImpl[] |
children |
protected String |
exitTypeDescriptor
Indicates the type descriptor for the result of this expression node.
|
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, V21, V9
Constructor and Description |
---|
SpelNodeImpl(int startPos,
int endPos,
SpelNodeImpl... operands) |
Modifier and Type | Method and Description |
---|---|
void |
generateCode(MethodVisitor mv,
CodeFlow cf)
Generate the bytecode for this node into the supplied visitor.
|
protected static void |
generateCodeForArgument(MethodVisitor mv,
CodeFlow cf,
SpelNodeImpl argument,
String paramDesc)
Ask an argument to generate its bytecode and then follow it up
with any boxing/unboxing/checkcasting to ensure it matches the expected parameter descriptor.
|
protected static void |
generateCodeForArguments(MethodVisitor mv,
CodeFlow cf,
Member member,
SpelNodeImpl[] arguments)
Generate code that handles building the argument values for the specified method.
|
SpelNode |
getChild(int index)
Helper method that returns a SpelNode rather than an Antlr Tree node.
|
int |
getChildCount()
Return the number of children under this node.
|
int |
getEndPosition()
Return the end position of this AST node in the expression string.
|
String |
getExitDescriptor() |
Class<?> |
getObjectClass(Object obj)
Determine the class of the object passed in, unless it is already a class object.
|
int |
getStartPosition()
Return the start position of this AST node in the expression string.
|
TypedValue |
getTypedValue(ExpressionState expressionState)
Evaluate the expression node in the context of the supplied expression state
and return the typed value.
|
Object |
getValue(ExpressionState expressionState)
Evaluate the expression node in the context of the supplied expression state
and return the value.
|
protected <T> T |
getValue(ExpressionState state,
Class<T> desiredReturnType) |
abstract TypedValue |
getValueInternal(ExpressionState expressionState) |
protected ValueRef |
getValueRef(ExpressionState state) |
boolean |
isCompilable()
Check whether a node can be compiled to bytecode.
|
boolean |
isWritable(ExpressionState expressionState)
Determine if this expression node will support a setValue() call.
|
protected boolean |
nextChildIs(Class<?>... classes)
Return
true if the next child is one of the specified classes. |
void |
setValue(ExpressionState expressionState,
Object newValue)
Evaluate the expression to a node and then set the new value on that node.
|
TypedValue |
setValueInternal(ExpressionState expressionState,
Supplier<TypedValue> valueSupplier)
Evaluate the expression to a node and then set the new value created by the
specified
Supplier on that node. |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
toStringAST
protected SpelNodeImpl[] children
@Nullable protected volatile String exitTypeDescriptor
The descriptor is like the bytecode form but is slightly easier to work with. It does not include the trailing semicolon (for non array reference types). Some examples: Ljava/lang/String, I, [I
public SpelNodeImpl(int startPos, int endPos, SpelNodeImpl... operands)
protected boolean nextChildIs(Class<?>... classes)
true
if the next child is one of the specified classes.@Nullable public final Object getValue(ExpressionState expressionState) throws EvaluationException
SpelNode
getValue
in interface SpelNode
expressionState
- the current expression state (includes the context)EvaluationException
public final TypedValue getTypedValue(ExpressionState expressionState) throws EvaluationException
SpelNode
getTypedValue
in interface SpelNode
expressionState
- the current expression state (includes the context)EvaluationException
public boolean isWritable(ExpressionState expressionState) throws EvaluationException
SpelNode
isWritable
in interface SpelNode
expressionState
- the current expression state (includes the context)EvaluationException
- if something went wrong trying to determine
if the node supports writingpublic void setValue(ExpressionState expressionState, @Nullable Object newValue) throws EvaluationException
SpelNode
setValue
in interface SpelNode
expressionState
- the current expression state (includes the context)newValue
- the new valueEvaluationException
- if any problem occurs evaluating the expression or
setting the new valuepublic TypedValue setValueInternal(ExpressionState expressionState, Supplier<TypedValue> valueSupplier) throws EvaluationException
Supplier
on that node.
For example, if the expression evaluates to a property reference, then the property will be set to the new value.
Favor this method over setValue(ExpressionState, Object)
when
the value should be lazily computed.
By default, this method throws a SpelEvaluationException
,
effectively disabling this feature. Subclasses may override this method to
provide an actual implementation.
expressionState
- the current expression state (includes the context)valueSupplier
- a supplier of the new valueEvaluationException
- if any problem occurs evaluating the expression or
setting the new valuepublic SpelNode getChild(int index)
SpelNode
public int getChildCount()
SpelNode
getChildCount
in interface SpelNode
@Nullable public Class<?> getObjectClass(@Nullable Object obj)
SpelNode
getObjectClass
in interface SpelNode
obj
- the object that the caller wants the class ofnull
if the object is null
public int getStartPosition()
SpelNode
getStartPosition
in interface SpelNode
public int getEndPosition()
SpelNode
getEndPosition
in interface SpelNode
public boolean isCompilable()
true
if this node can be compiled to bytecodepublic void generateCode(MethodVisitor mv, CodeFlow cf)
mv
- the ASM MethodVisitor into which code should be generatedcf
- a context object with info about what is on the stack@Nullable protected final <T> T getValue(ExpressionState state, Class<T> desiredReturnType) throws EvaluationException
EvaluationException
protected ValueRef getValueRef(ExpressionState state) throws EvaluationException
EvaluationException
public abstract TypedValue getValueInternal(ExpressionState expressionState) throws EvaluationException
EvaluationException
protected static void generateCodeForArguments(MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)
mv
- the method visitor where code should be generatedcf
- the current codeflowmember
- the method or constructor for which arguments are being setuparguments
- the expression nodes for the expression supplied argument valuesprotected static void generateCodeForArgument(MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)