public abstract class Operator extends SpelNodeImpl
Modifier and Type | Class and Description |
---|---|
protected static class |
Operator.DescriptorComparison
A descriptor comparison encapsulates the result of comparing descriptor
for two operands and describes at what level they are compatible.
|
Modifier and Type | Field and Description |
---|---|
protected String |
leftActualDescriptor |
protected String |
rightActualDescriptor |
children, exitTypeDescriptor
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, ASM8_EXPERIMENTAL, 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, V9
Constructor and Description |
---|
Operator(String payload,
int startPos,
int endPos,
SpelNodeImpl... operands) |
Modifier and Type | Method and Description |
---|---|
static boolean |
equalityCheck(EvaluationContext context,
Object left,
Object right)
Perform an equality check for the given operand values.
|
protected void |
generateComparisonCode(MethodVisitor mv,
CodeFlow cf,
int compInstruction1,
int compInstruction2)
Numeric comparison operators share very similar generated code, only differing in
two comparison instructions.
|
SpelNodeImpl |
getLeftOperand() |
String |
getOperatorName() |
SpelNodeImpl |
getRightOperand() |
protected boolean |
isCompilableOperatorUsingNumerics() |
String |
toStringAST()
String format for all operators is the same
'(' [operand] [operator] [operand] ')' . |
generateCode, generateCodeForArgument, generateCodeForArguments, getChild, getChildCount, getEndPosition, getExitDescriptor, getObjectClass, getStartPosition, getTypedValue, getValue, getValue, getValueInternal, getValueRef, isCompilable, isWritable, nextChildIs, setValue, setValueInternal
public Operator(String payload, int startPos, int endPos, SpelNodeImpl... operands)
public SpelNodeImpl getLeftOperand()
public SpelNodeImpl getRightOperand()
public final String getOperatorName()
public String toStringAST()
'(' [operand] [operator] [operand] ')'
.protected boolean isCompilableOperatorUsingNumerics()
protected void generateComparisonCode(MethodVisitor mv, CodeFlow cf, int compInstruction1, int compInstruction2)
public static boolean equalityCheck(EvaluationContext context, @Nullable Object left, @Nullable Object right)
This method is not just used for reflective comparisons in subclasses
but also from compiled expression code, which is why it needs to be
declared as public static
here.
context
- the current evaluation contextleft
- the left-hand operand valueright
- the right-hand operand value