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 classASMAccessorOptimizer.ContextClassLoader
-
Field Summary
Fields Modifier and Type Field Description private static intARRAYprivate StringAppenderbuildLogprivate static MVELClassLoaderclassLoaderprivate java.lang.StringclassNameprivate intcompileDepthprivate java.util.ArrayList<ExecutableStatement>compiledInputsprivate java.lang.Objectctxprivate org.objectweb.asm.ClassWritercwprivate booleandeferFinishprivate static java.lang.Object[]EMPTYARGprivate static java.lang.Class[]EMPTYCLSprivate booleanfirstprivate java.lang.ClassingressTypeprivate static intLISTprivate static java.lang.StringLIST_IMPLprivate booleanliteralprivate static intMAPprivate static java.lang.StringMAP_IMPLprivate intmaxlocalsprivate booleanmethNullprivate org.objectweb.asm.MethodVisitormvprivate static java.lang.StringNAMESPACEprivate booleannoinitprivate static intOPCODES_VERSIONprivate booleanpropNullprivate java.lang.ClassreturnTypeprivate intstacksizeprivate java.lang.ObjectthisRefprivate longtimeprivate java.lang.Objectvalprivate static intVALprivate VariableResolverFactoryvariableFactory-
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()privateASMAccessorOptimizer(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 voidaddPrintOut(java.lang.String text)private java.lang.ObjectaddSubstatement(ExecutableStatement stmt)private voidanyArrayCheck(java.lang.Class cls)voidarrayStore(java.lang.Class cls)private voidbuildInputs()private voidcheckcast(java.lang.Class cls)private AccessorcompileAccessor()private voidcreateArray(java.lang.Class componentType, int length)Create an array of any type (primitive or reference)private voiddataConversion(java.lang.Class target)private booleandebug(java.lang.String instruction)private voiddumpAdvancedDebugging()private java.lang.ObjectgetBeanProperty(java.lang.Object ctx, java.lang.String property)private java.lang.ObjectgetBeanPropertyAO(java.lang.Object ctx, java.lang.String property)private java.lang.ObjectgetCollectionProperty(java.lang.Object ctx, java.lang.String prop)private java.lang.ObjectgetCollectionPropertyAO(java.lang.Object ctx, java.lang.String prop)private ASMAccessorOptimizer.ContextClassLoadergetContextClassLoader()java.lang.ClassgetEgressType()private java.lang.ObjectgetMethod(java.lang.Object ctx, java.lang.String name)static MVELClassLoadergetMVELClassLoader()java.lang.StringgetName()java.lang.ObjectgetResultOptPass()private java.lang.ObjectgetWithProperty(java.lang.Object ctx)private java.lang.ClassgetWrapperClass(java.lang.Class cls)voidinit()private voidintPush(int index)booleanisLiteralOnly()private voidldcClassConstant(java.lang.Class cls)private java.lang.ClassloadClass(java.lang.String className, byte[] b)private voidloadField(int number)private voidloadVariableByIndex(int pos)private voidloadVariableByName(java.lang.String name)AccessoroptimizeAccessor(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object staticContext, java.lang.Object thisRef, VariableResolverFactory factory, boolean root, java.lang.Class ingressType)AccessoroptimizeCollection(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.ObjectoptimizeFieldMethodProperty(java.lang.Object ctx, java.lang.String property, java.lang.Class<?> cls, java.lang.reflect.Member member)AccessoroptimizeObjectCreation(ParserContext pCtx, char[] property, int start, int offset, java.lang.Object ctx, java.lang.Object thisRef, VariableResolverFactory factory)AccessoroptimizeSetAccessor(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.ObjectpropHandlerByteCode(java.lang.String property, java.lang.Object ctx, java.lang.Class handler)private voidpropHandlerByteCodePut(java.lang.String property, java.lang.Object ctx, java.lang.Class handler, java.lang.Object value)static voidsetMVELClassLoader(MVELClassLoader cl)static inttoPrimitiveTypeOperand(java.lang.Class<?> c)Gets the ASM instruction operand for the given primitive type.private voidunwrapPrimitive(java.lang.Class cls)private voidvisitConstantClass(java.lang.Class<?> clazz)private voidwrapPrimitive(java.lang.Class<? extends java.lang.Object> cls)voidwrapRuntimeConverstion(java.lang.Class toType)private voidwriteFunctionPointerStub(java.lang.Class c, java.lang.reflect.Method m)private java.lang.ClasswriteLiteralOrSubexpression(java.lang.Object stmt)private java.lang.ClasswriteLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget)private java.lang.ClasswriteLiteralOrSubexpression(java.lang.Object stmt, java.lang.Class desiredTarget, java.lang.Class knownIngressType)private voidwriteOutLiteralWrapped(java.lang.Object lit)private voidwriteOutNullHandler(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:
optimizeAccessorin 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:
optimizeSetAccessorin 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.IllegalAccessExceptionjava.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.IllegalAccessExceptionjava.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.IllegalAccessExceptionjava.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.IllegalAccessExceptionjava.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.IllegalAccessExceptionjava.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:
initin 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:
getResultOptPassin 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:
optimizeCollectionin 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:
optimizeObjectCreationin interfaceAccessorOptimizer
-
getEgressType
public java.lang.Class getEgressType()
- Specified by:
getEgressTypein 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:
isLiteralOnlyin interfaceAccessorOptimizer
-
-