public abstract class SpelNodeImpl extends java.lang.Object implements SpelNode, Opcodes
Modifier and Type | Field and Description |
---|---|
protected SpelNodeImpl[] |
children |
protected java.lang.String |
exitTypeDescriptor
Indicates the type descriptor for the result of this expression node.
|
private static SpelNodeImpl[] |
NO_CHILDREN |
private SpelNodeImpl |
parent |
protected int |
pos |
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_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, ASM4, ASM5, ASM6, ASM7, 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, 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, V9
Constructor and Description |
---|
SpelNodeImpl(int pos,
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,
java.lang.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,
java.lang.reflect.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.
|
java.lang.String |
getExitDescriptor() |
java.lang.Class<?> |
getObjectClass(java.lang.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.
|
java.lang.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,
java.lang.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(java.lang.Class<?>... classes)
Return
true if the next child is one of the specified classes. |
void |
setValue(ExpressionState expressionState,
java.lang.Object newValue)
Evaluate the expression to a node and then set the new value on that node.
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
toStringAST
private static final SpelNodeImpl[] NO_CHILDREN
protected final int pos
protected SpelNodeImpl[] children
@Nullable private SpelNodeImpl parent
@Nullable protected volatile java.lang.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 pos, SpelNodeImpl... operands)
protected boolean nextChildIs(java.lang.Class<?>... classes)
true
if the next child is one of the specified classes.@Nullable public final java.lang.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 java.lang.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 SpelNode getChild(int index)
SpelNode
public int getChildCount()
SpelNode
getChildCount
in interface SpelNode
@Nullable public java.lang.Class<?> getObjectClass(@Nullable java.lang.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 public java.lang.String getExitDescriptor()
@Nullable protected final <T> T getValue(ExpressionState state, java.lang.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, java.lang.reflect.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, java.lang.String paramDesc)