Package org.mvel2.optimizers.impl.asm
Class ASMAccessorOptimizer
- java.lang.Object
-
- org.mvel2.compiler.AbstractParser
-
- org.mvel2.optimizers.AbstractOptimizer
-
- org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer
-
- All Implemented Interfaces:
java.io.Serializable
,Parser
,AccessorOptimizer
public class ASMAccessorOptimizer extends AbstractOptimizer implements AccessorOptimizer
Implementation of the MVEL Just-in-Time (JIT) compiler for Property Accessors using the ASM bytecode engineering library.- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
ASMAccessorOptimizer.ContextClassLoader
-
Field Summary
Fields Modifier and Type Field Description private static int
ARRAY
private StringAppender
buildLog
private static MVELClassLoader
classLoader
private java.lang.String
className
private int
compileDepth
private java.util.ArrayList<ExecutableStatement>
compiledInputs
private java.lang.Object
ctx
private org.objectweb.asm.ClassWriter
cw
private boolean
deferFinish
private static java.lang.Object[]
EMPTYARG
private static java.lang.Class[]
EMPTYCLS
private boolean
first
private java.lang.Class
ingressType
private static int
LIST
private static java.lang.String
LIST_IMPL
private boolean
literal
private static int
MAP
private static java.lang.String
MAP_IMPL
private int
maxlocals
private boolean
methNull
private org.objectweb.asm.MethodVisitor
mv
private static java.lang.String
NAMESPACE
private boolean
noinit
private static int
OPCODES_VERSION
private boolean
propNull
private java.lang.Class
returnType
private int
stacksize
private java.lang.Object
thisRef
private long
time
private java.lang.Object
val
private static int
VAL
private VariableResolverFactory
variableFactory
-
Fields inherited from class org.mvel2.optimizers.AbstractOptimizer
BEAN, COL, collection, currType, METH, nullSafe, staticAccess, tkStart, WITH
-
Fields inherited from class org.mvel2.compiler.AbstractParser
CLASS_LITERALS, compileMode, cursor, debugSymbols, dStack, end, expr, fields, GET, GET_OR_CREATE, greedy, lastLineStart, lastNode, lastWasComment, lastWasIdentifier, lastWasLineLabel, length, LEVEL_0_PROPERTY_ONLY, LEVEL_1_BASIC_LANG, LEVEL_2_MULTI_STATEMENT, LEVEL_3_ITERATION, LEVEL_4_ASSIGNMENT, LEVEL_5_CONTROL_FLOW, line, literalOnly, LITERALS, OP_CONTINUE, OP_NOT_LITERAL, OP_OVERFLOW, OP_RESET_FRAME, OP_TERMINATE, OPERATORS, pCtx, REMOVE, SET, splitAccumulator, st, start, stk
-
-
Constructor Summary
Constructors Modifier Constructor Description ASMAccessorOptimizer()
private
ASMAccessorOptimizer(org.objectweb.asm.ClassWriter cw, org.objectweb.asm.MethodVisitor mv, java.util.ArrayList<ExecutableStatement> compiledInputs, java.lang.String className, StringAppender buildLog, int compileDepth)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
_finishJIT()
private int
_getAccessor(java.lang.Object o, java.lang.Class type)
private Accessor
_initializeAccessor()
private void
_initJIT()
Does all the boilerplate for initiating the JIT.private void
_initJIT2()
private void
addPrintOut(java.lang.String text)
private java.lang.Object
addSubstatement(ExecutableStatement stmt)
private void
anyArrayCheck(java.lang.Class cls)
void
arrayStore(java.lang.Class cls)
private void
buildInputs()
private void
checkcast(java.lang.Class cls)
private Accessor
compileAccessor()
private void
createArray(java.lang.Class componentType, int length)
Create an array of any type (primitive or reference)private void
dataConversion(java.lang.Class target)
private boolean
debug(java.lang.String instruction)
private void
dumpAdvancedDebugging()
private java.lang.Object
getBeanProperty(java.lang.Object ctx, java.lang.String property)
private java.lang.Object
getBeanPropertyAO(java.lang.Object ctx, java.lang.String property)
private java.lang.Object
getCollectionProperty(java.lang.Object ctx, java.lang.String prop)
private java.lang.Object
getCollectionPropertyAO(java.lang.Object ctx, java.lang.String prop)
private ASMAccessorOptimizer.ContextClassLoader
getContextClassLoader()
java.lang.Class
getEgressType()
private java.lang.Object
getMethod(java.lang.Object ctx, java.lang.String name)
static MVELClassLoader
getMVELClassLoader()
java.lang.String
getName()
java.lang.Object
getResultOptPass()
private java.lang.Object
getWithProperty(java.lang.Object ctx)
private java.lang.Class
getWrapperClass(java.lang.Class cls)
void
init()
private void
intPush(int index)
boolean
isLiteralOnly()
private void
ldcClassConstant(java.lang.Class cls)
private java.lang.Class
loadClass(java.lang.String className, byte[] b)
private void
loadField(int number)
private void
loadVariableByIndex(int pos)
private void
loadVariableByName(java.lang.String name)
Accessor
optimizeAccessor(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object staticContext, java.lang.Object thisRef, VariableResolverFactory factory, boolean root, java.lang.Class ingressType)
Accessor
optimizeCollection(ParserContext pCtx, java.lang.Object o, java.lang.Class type, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory)
private java.lang.Object
optimizeFieldMethodProperty(java.lang.Object ctx, java.lang.String property, java.lang.Class<?> cls, java.lang.reflect.Member member)
Accessor
optimizeObjectCreation(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory)
Accessor
optimizeSetAccessor(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory, boolean rootThisRef, java.lang.Object value, java.lang.Class ingressType)
private java.lang.Object
propHandlerByteCode(java.lang.String property, java.lang.Object ctx, java.lang.Class handler)
private void
propHandlerByteCodePut(java.lang.String property, java.lang.Object ctx, java.lang.Class handler, java.lang.Object value)
static void
setMVELClassLoader(MVELClassLoader cl)
static int
toPrimitiveTypeOperand(java.lang.Class<?> c)
Gets the ASM instruction operand for the given primitive type.private void
unwrapPrimitive(java.lang.Class cls)
private void
visitConstantClass(java.lang.Class<?> clazz)
private void
wrapPrimitive(java.lang.Class<? extends java.lang.Object> cls)
void
wrapRuntimeConverstion(java.lang.Class toType)
private void
writeFunctionPointerStub(java.lang.Class c, java.lang.reflect.Method m)
private java.lang.Class
writeLiteralOrSubexpression(java.lang.Object stmt)
private java.lang.Class
writeLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget)
private java.lang.Class
writeLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget, java.lang.Class knownIngressType)
private void
writeOutLiteralWrapped(java.lang.Object lit)
private void
writeOutNullHandler(java.lang.reflect.Member member, int type)
-
Methods inherited from class org.mvel2.optimizers.AbstractOptimizer
capture, findLastUnion, nextSubToken, scanTo, tryStaticAccess, whiteSpaceSkip
-
Methods inherited from class org.mvel2.compiler.AbstractParser
addFatalError, addFatalError, arithmeticFunctionReduction, captureIdentifier, captureToEOS, captureToEOSorEOL, captureToEOT, captureToNextTokenJunction, expectEOS, expectNextChar_IW, getCursor, getExpression, handleSubstatement, handleUnion, ifThenElseBlockContinues, incNextNonBlank, isArithmeticOperator, isNextIdentifier, isNextIdentifierOrLiteral, isStatementNotManuallyTerminated, lastNonWhite, loadLanguageFeaturesByLevel, lookAhead, lookAhead, lookBehind, lookToLast, nextNonBlank, nextToken, nextTokenSkipSymbols, reduce, setExpression, setExpression, setLanguageLevel, setupParser, skipWhitespace, tokenContinues, trimLeft, trimRight, trimWhitespace
-
-
-
-
Field Detail
-
MAP_IMPL
private static final java.lang.String MAP_IMPL
- See Also:
- Constant Field Values
-
LIST_IMPL
private static java.lang.String LIST_IMPL
-
NAMESPACE
private static java.lang.String NAMESPACE
-
OPCODES_VERSION
private static final int OPCODES_VERSION
-
ctx
private java.lang.Object ctx
-
thisRef
private java.lang.Object thisRef
-
variableFactory
private VariableResolverFactory variableFactory
-
EMPTYARG
private static final java.lang.Object[] EMPTYARG
-
EMPTYCLS
private static final java.lang.Class[] EMPTYCLS
-
first
private boolean first
-
noinit
private boolean noinit
-
deferFinish
private boolean deferFinish
-
literal
private boolean literal
-
propNull
private boolean propNull
-
methNull
private boolean methNull
-
className
private java.lang.String className
-
cw
private org.objectweb.asm.ClassWriter cw
-
mv
private org.objectweb.asm.MethodVisitor mv
-
val
private java.lang.Object val
-
stacksize
private int stacksize
-
maxlocals
private int maxlocals
-
time
private long time
-
compiledInputs
private java.util.ArrayList<ExecutableStatement> compiledInputs
-
ingressType
private java.lang.Class ingressType
-
returnType
private java.lang.Class returnType
-
compileDepth
private int compileDepth
-
buildLog
private StringAppender buildLog
-
classLoader
private static MVELClassLoader classLoader
-
ARRAY
private static final int ARRAY
- See Also:
- Constant Field Values
-
LIST
private static final int LIST
- See Also:
- Constant Field Values
-
MAP
private static final int MAP
- See Also:
- Constant Field Values
-
VAL
private static final int VAL
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
ASMAccessorOptimizer
public ASMAccessorOptimizer()
-
ASMAccessorOptimizer
private ASMAccessorOptimizer(org.objectweb.asm.ClassWriter cw, org.objectweb.asm.MethodVisitor mv, java.util.ArrayList<ExecutableStatement> compiledInputs, java.lang.String className, StringAppender buildLog, int compileDepth)
-
-
Method Detail
-
_initJIT
private void _initJIT()
Does all the boilerplate for initiating the JIT.
-
_initJIT2
private void _initJIT2()
-
optimizeAccessor
public Accessor optimizeAccessor(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object staticContext, java.lang.Object thisRef, VariableResolverFactory factory, boolean root, java.lang.Class ingressType)
- Specified by:
optimizeAccessor
in interfaceAccessorOptimizer
-
optimizeSetAccessor
public Accessor optimizeSetAccessor(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory, boolean rootThisRef, java.lang.Object value, java.lang.Class ingressType)
- Specified by:
optimizeSetAccessor
in interfaceAccessorOptimizer
-
_finishJIT
private void _finishJIT()
-
visitConstantClass
private void visitConstantClass(java.lang.Class<?> clazz)
-
_initializeAccessor
private Accessor _initializeAccessor() throws java.lang.Exception
- Throws:
java.lang.Exception
-
compileAccessor
private Accessor compileAccessor()
-
getWithProperty
private java.lang.Object getWithProperty(java.lang.Object ctx)
-
getBeanPropertyAO
private java.lang.Object getBeanPropertyAO(java.lang.Object ctx, java.lang.String property) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
- Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
-
getBeanProperty
private java.lang.Object getBeanProperty(java.lang.Object ctx, java.lang.String property) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
- Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
-
optimizeFieldMethodProperty
private java.lang.Object optimizeFieldMethodProperty(java.lang.Object ctx, java.lang.String property, java.lang.Class<?> cls, java.lang.reflect.Member member) throws java.lang.IllegalAccessException
- Throws:
java.lang.IllegalAccessException
-
writeFunctionPointerStub
private void writeFunctionPointerStub(java.lang.Class c, java.lang.reflect.Method m)
-
getCollectionProperty
private java.lang.Object getCollectionProperty(java.lang.Object ctx, java.lang.String prop) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
- Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
-
getCollectionPropertyAO
private java.lang.Object getCollectionPropertyAO(java.lang.Object ctx, java.lang.String prop) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
- Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
-
getMethod
private java.lang.Object getMethod(java.lang.Object ctx, java.lang.String name) throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException
- Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
-
dataConversion
private void dataConversion(java.lang.Class target)
-
setMVELClassLoader
public static void setMVELClassLoader(MVELClassLoader cl)
-
getMVELClassLoader
public static MVELClassLoader getMVELClassLoader()
-
init
public void init()
- Specified by:
init
in interfaceAccessorOptimizer
-
getContextClassLoader
private ASMAccessorOptimizer.ContextClassLoader getContextClassLoader()
-
loadClass
private java.lang.Class loadClass(java.lang.String className, byte[] b) throws java.lang.Exception
- Throws:
java.lang.Exception
-
debug
private boolean debug(java.lang.String instruction)
-
getName
public java.lang.String getName()
-
getResultOptPass
public java.lang.Object getResultOptPass()
- Specified by:
getResultOptPass
in interfaceAccessorOptimizer
-
getWrapperClass
private java.lang.Class getWrapperClass(java.lang.Class cls)
-
unwrapPrimitive
private void unwrapPrimitive(java.lang.Class cls)
-
wrapPrimitive
private void wrapPrimitive(java.lang.Class<? extends java.lang.Object> cls)
-
anyArrayCheck
private void anyArrayCheck(java.lang.Class cls)
-
writeOutLiteralWrapped
private void writeOutLiteralWrapped(java.lang.Object lit)
-
toPrimitiveTypeOperand
public static int toPrimitiveTypeOperand(java.lang.Class<?> c)
Gets the ASM instruction operand for the given primitive type. Will throw IllegalStateException if the type is not primitive.- Parameters:
c
- The class representing the primitive type.- Returns:
- The operand
-
createArray
private void createArray(java.lang.Class componentType, int length)
Create an array of any type (primitive or reference)- Parameters:
componentType
- The type of array elementslength
- The length of the array
-
arrayStore
public void arrayStore(java.lang.Class cls)
-
wrapRuntimeConverstion
public void wrapRuntimeConverstion(java.lang.Class toType)
-
addSubstatement
private java.lang.Object addSubstatement(ExecutableStatement stmt)
-
loadVariableByName
private void loadVariableByName(java.lang.String name)
-
loadVariableByIndex
private void loadVariableByIndex(int pos)
-
loadField
private void loadField(int number)
-
ldcClassConstant
private void ldcClassConstant(java.lang.Class cls)
-
buildInputs
private void buildInputs()
-
_getAccessor
private int _getAccessor(java.lang.Object o, java.lang.Class type)
-
writeLiteralOrSubexpression
private java.lang.Class writeLiteralOrSubexpression(java.lang.Object stmt)
-
writeLiteralOrSubexpression
private java.lang.Class writeLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget)
-
writeLiteralOrSubexpression
private java.lang.Class writeLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget, java.lang.Class knownIngressType)
-
addPrintOut
private void addPrintOut(java.lang.String text)
-
optimizeCollection
public Accessor optimizeCollection(ParserContext pCtx, java.lang.Object o, java.lang.Class type, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory)
- Specified by:
optimizeCollection
in interfaceAccessorOptimizer
-
checkcast
private void checkcast(java.lang.Class cls)
-
intPush
private void intPush(int index)
-
optimizeObjectCreation
public Accessor optimizeObjectCreation(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory)
- Specified by:
optimizeObjectCreation
in interfaceAccessorOptimizer
-
getEgressType
public java.lang.Class getEgressType()
- Specified by:
getEgressType
in interfaceAccessorOptimizer
-
dumpAdvancedDebugging
private void dumpAdvancedDebugging()
-
propHandlerByteCode
private java.lang.Object propHandlerByteCode(java.lang.String property, java.lang.Object ctx, java.lang.Class handler)
-
propHandlerByteCodePut
private void propHandlerByteCodePut(java.lang.String property, java.lang.Object ctx, java.lang.Class handler, java.lang.Object value)
-
writeOutNullHandler
private void writeOutNullHandler(java.lang.reflect.Member member, int type)
-
isLiteralOnly
public boolean isLiteralOnly()
- Specified by:
isLiteralOnly
in interfaceAccessorOptimizer
-
-