Package com.googlecode.aviator.code.asm
Class ASMCodeGenerator
- java.lang.Object
-
- com.googlecode.aviator.code.BaseEvalCodeGenerator
-
- com.googlecode.aviator.code.asm.ASMCodeGenerator
-
- All Implemented Interfaces:
CodeGenerator,EvalCodeGenerator
public class ASMCodeGenerator extends BaseEvalCodeGenerator
Code generator using asm
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classASMCodeGenerator.MethodMetaData
-
Field Summary
Fields Modifier and Type Field Description private static java.util.concurrent.atomic.AtomicLongCLASS_COUNTERprivate java.lang.StringclassNameprivate ClassWriterclassWriterprivate java.util.Map<Token<?>,java.lang.String>constantPoolprivate static java.lang.StringCONSTRUCTOR_METHOD_NAMEprivate LabelcurrentLabelprivate static java.lang.StringFIELD_PREFIXprivate intfieldCounterstatic java.lang.StringFUNC_ARGS_INNER_VARprivate java.util.Map<java.lang.String,java.lang.String>innerMethodMapprivate java.util.Map<java.lang.String,java.lang.String>innerVarsprivate static java.lang.StringJAVA_TYPE_OWNERprivate java.util.Stack<Label>l0stackLabel stack for ternary operatorprivate java.util.Stack<Label>l1stackprivate java.util.Map<Label,java.util.Map<java.lang.String,java.lang.Integer>>labelNameIndexMapprivate intmaxLocalsprivate intmaxStacksprivate MethodVisitormvprivate static java.lang.StringOBJECT_DESCprivate static java.lang.StringOBJECT_OWNERprivate intoperandsCountOperands count to check stack framesprivate static java.lang.StringRUNTIME_UTILSprivate static LabelSTART_LABEL-
Fields inherited from class com.googlecode.aviator.code.BaseEvalCodeGenerator
classLoader, compileEnv, funcsArgs, instance, lambdaBootstraps, lambdaGenerator, methodMetaDataStack, methodTokens, parentCodeGenerator, parser, sourceFile, symbolTable, variables
-
-
Constructor Summary
Constructors Constructor Description ASMCodeGenerator(AviatorEvaluatorInstance instance, java.lang.String sourceFile, AviatorClassLoader classLoader, java.io.OutputStream traceOut)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private voidcheckExecutionTimeout()private voidcreateAviatorFunctionObject(java.lang.String methodName)private voiddoCompareAndJump(Token<?> lookhead, int ints, OperatorType opType)private voidend(boolean unboxObject)private voidendVisitClass()private voidendVisitMethodCode(boolean unboxObject)private voidgenCustomSerializeMethod()voidgenNewLambdaCode(LambdaFunctionBootstrap bootstrap)private voidgenReadObject()private voidgenWriteObject()private java.lang.StringgetInnerName(java.lang.String varName)private static java.lang.StringgetInvokeMethodDesc(int paramCount)(package private) LambdaGeneratorgetLambdaGenerator()intgetLocalIndex()ExpressiongetResult(boolean unboxObject)voidinitConstants(java.util.Set<Token<?>> constants)Initial constant pool.voidinitMethods(java.util.Map<java.lang.String,java.lang.Integer> methods)voidinitVariables(java.util.Map<java.lang.String,VariableMeta> vars)private booleanisEqNe(int ints)private voidloadAviatorFunction(java.lang.String outterMethodName, java.lang.String innerMethodName)private booleanloadConstant(Token<?> lookhead, boolean inConstructor)private voidloadEnv()private voidloadOpType(OperatorType opType)private voidmakeConstructor()Make a default constructorprivate LabelmakeLabel()Make a labelvoidonAdd(Token<?> lookhead)voidonAndLeft(Token<?> lookhead)Do logic operation "&&" left operandvoidonAndRight(Token<?> lookhead)Do logic operation "&&" right operandvoidonArray(Token<?> lookhead)voidonArrayIndexEnd(Token<?> lookhead)voidonArrayIndexStart(Token<?> token)voidonAssignment(Token<?> lookhead)voidonBitAnd(Token<?> lookhead)voidonBitNot(Token<?> lookhead)Bit operation '~'voidonBitOr(Token<?> lookhead)voidonBitXor(Token<?> lookhead)voidonConstant(Token<?> lookhead)private voidonConstant0(Token<?> lookhead, boolean inConstructor)voidonDiv(Token<?> lookhead)voidonEq(Token<?> lookhead)voidonExponent(Token<?> lookhead)voidonGe(Token<?> lookhead)voidonGt(Token<?> lookhead)voidonJoinLeft(Token<?> lookhead)Do logic operation "||" left operandvoidonJoinRight(Token<?> lookhead)Do logic operation "||" right operandvoidonLambdaArgument(Token<?> lookhead, FunctionParam param)voidonLambdaBodyEnd(Token<?> lookhead)voidonLambdaBodyStart(Token<?> lookhead)voidonLambdaDefineStart(Token<?> lookhead)voidonLe(Token<?> lookhead)voidonLt(Token<?> lookhead)voidonMatch(Token<?> lookhead)voidonMethodInvoke(Token<?> lookhead)voidonMethodName(Token<?> lookhead)voidonMethodParameter(Token<?> lookhead)voidonMod(Token<?> lookhead)voidonMult(Token<?> lookhead)voidonNeg(Token<?> lookhead)voidonNeq(Token<?> lookhead)voidonNot(Token<?> lookhead)Logic operation '!'voidonShiftLeft(Token<?> lookhead)voidonShiftRight(Token<?> lookhead)voidonSub(Token<?> lookhead)voidonTernaryBoolean(Token<?> lookhead)voidonTernaryEnd(Token<?> lookhead)voidonTernaryLeft(Token<?> lookhead)voidonTernaryRight(Token<?> lookhead)voidonUnsignedShiftRight(Token<?> lookhead)private LabelpeekLabel0()private LabelpeekLabel1()private LabelpopLabel0()private LabelpopLabel1()private voidpopOperand()Pop a operand from stackprivate voidpopOperand(int n)Pop a operand from stackprivate voidpushLabel0(Label l0)private voidpushLabel1(Label l1)private voidpushOperand()private voidpushOperand(int delta)private voidsetMaxStacks(int newMaxStacks)voidstart()private voidstartVisitMethodCode()private voidvisitBinOperator(Token<?> token, OperatorType opType, java.lang.String methodName)private voidvisitBoolean()private voidvisitClass()private voidvisitCompare(int ints, OperatorType opType)private voidvisitLabel(Label label)private voidvisitLeftBranch(Token<?> lookhead, int ints, OperatorType opType)private voidvisitLineNumber(Token<?> token)private voidvisitRightBranch(Token<?> lookhead, int ints, OperatorType opType)private voidvisitUnaryOperator(Token<?> lookhead, OperatorType opType, java.lang.String methodName)-
Methods inherited from class com.googlecode.aviator.code.BaseEvalCodeGenerator
getClassLoader, getFuncsArgs, getNextFuncInvocationId, setLambdaBootstraps, setParser
-
-
-
-
Field Detail
-
RUNTIME_UTILS
private static final java.lang.String RUNTIME_UTILS
- See Also:
- Constant Field Values
-
OBJECT_DESC
private static final java.lang.String OBJECT_DESC
- See Also:
- Constant Field Values
-
JAVA_TYPE_OWNER
private static final java.lang.String JAVA_TYPE_OWNER
- See Also:
- Constant Field Values
-
CONSTRUCTOR_METHOD_NAME
private static final java.lang.String CONSTRUCTOR_METHOD_NAME
- See Also:
- Constant Field Values
-
OBJECT_OWNER
private static final java.lang.String OBJECT_OWNER
- See Also:
- Constant Field Values
-
FUNC_ARGS_INNER_VAR
public static final java.lang.String FUNC_ARGS_INNER_VAR
- See Also:
- Constant Field Values
-
FIELD_PREFIX
private static final java.lang.String FIELD_PREFIX
- See Also:
- Constant Field Values
-
classWriter
private final ClassWriter classWriter
-
mv
private MethodVisitor mv
-
className
private final java.lang.String className
-
CLASS_COUNTER
private static final java.util.concurrent.atomic.AtomicLong CLASS_COUNTER
-
operandsCount
private int operandsCount
Operands count to check stack frames
-
maxStacks
private int maxStacks
-
maxLocals
private int maxLocals
-
fieldCounter
private int fieldCounter
-
innerVars
private java.util.Map<java.lang.String,java.lang.String> innerVars
-
innerMethodMap
private java.util.Map<java.lang.String,java.lang.String> innerMethodMap
-
constantPool
private java.util.Map<Token<?>,java.lang.String> constantPool
-
labelNameIndexMap
private final java.util.Map<Label,java.util.Map<java.lang.String,java.lang.Integer>> labelNameIndexMap
-
START_LABEL
private static final Label START_LABEL
-
currentLabel
private Label currentLabel
-
l0stack
private final java.util.Stack<Label> l0stack
Label stack for ternary operator
-
l1stack
private final java.util.Stack<Label> l1stack
-
-
Constructor Detail
-
ASMCodeGenerator
public ASMCodeGenerator(AviatorEvaluatorInstance instance, java.lang.String sourceFile, AviatorClassLoader classLoader, java.io.OutputStream traceOut)
-
-
Method Detail
-
setMaxStacks
private void setMaxStacks(int newMaxStacks)
-
getLambdaGenerator
LambdaGenerator getLambdaGenerator()
-
start
public void start()
-
startVisitMethodCode
private void startVisitMethodCode()
-
endVisitMethodCode
private void endVisitMethodCode(boolean unboxObject)
-
endVisitClass
private void endVisitClass()
-
makeConstructor
private void makeConstructor()
Make a default constructor
-
visitClass
private void visitClass()
-
makeLabel
private Label makeLabel()
Make a label- Returns:
-
onAdd
public void onAdd(Token<?> lookhead)
-
loadOpType
private void loadOpType(OperatorType opType)
-
popOperand
private void popOperand()
Pop a operand from stack
-
popOperand
private void popOperand(int n)
Pop a operand from stack
-
onSub
public void onSub(Token<?> lookhead)
-
onMult
public void onMult(Token<?> lookhead)
-
onExponent
public void onExponent(Token<?> lookhead)
-
onAssignment
public void onAssignment(Token<?> lookhead)
-
onDiv
public void onDiv(Token<?> lookhead)
-
onMod
public void onMod(Token<?> lookhead)
-
onAndLeft
public void onAndLeft(Token<?> lookhead)
Do logic operation "&&" left operand
-
visitBoolean
private void visitBoolean()
-
pushLabel0
private void pushLabel0(Label l0)
-
onAndRight
public void onAndRight(Token<?> lookhead)
Do logic operation "&&" right operand
-
visitRightBranch
private void visitRightBranch(Token<?> lookhead, int ints, OperatorType opType)
-
onTernaryBoolean
public void onTernaryBoolean(Token<?> lookhead)
-
pushLabel1
private void pushLabel1(Label l1)
-
onTernaryLeft
public void onTernaryLeft(Token<?> lookhead)
-
peekLabel1
private Label peekLabel1()
-
onTernaryRight
public void onTernaryRight(Token<?> lookhead)
-
onTernaryEnd
public void onTernaryEnd(Token<?> lookhead)
-
popLabel1
private Label popLabel1()
-
onJoinRight
public void onJoinRight(Token<?> lookhead)
Do logic operation "||" right operand
-
visitLabel
private void visitLabel(Label label)
-
peekLabel0
private Label peekLabel0()
-
popLabel0
private Label popLabel0()
-
onJoinLeft
public void onJoinLeft(Token<?> lookhead)
Do logic operation "||" left operand
-
visitLeftBranch
private void visitLeftBranch(Token<?> lookhead, int ints, OperatorType opType)
-
onEq
public void onEq(Token<?> lookhead)
-
onMatch
public void onMatch(Token<?> lookhead)
-
onNeq
public void onNeq(Token<?> lookhead)
-
doCompareAndJump
private void doCompareAndJump(Token<?> lookhead, int ints, OperatorType opType)
-
isEqNe
private boolean isEqNe(int ints)
-
visitCompare
private void visitCompare(int ints, OperatorType opType)
-
onGe
public void onGe(Token<?> lookhead)
-
onGt
public void onGt(Token<?> lookhead)
-
onLe
public void onLe(Token<?> lookhead)
-
onLt
public void onLt(Token<?> lookhead)
-
pushOperand
private void pushOperand(int delta)
-
onNot
public void onNot(Token<?> lookhead)
Logic operation '!'
-
visitBinOperator
private void visitBinOperator(Token<?> token, OperatorType opType, java.lang.String methodName)
-
visitLineNumber
private void visitLineNumber(Token<?> token)
-
visitUnaryOperator
private void visitUnaryOperator(Token<?> lookhead, OperatorType opType, java.lang.String methodName)
-
onBitNot
public void onBitNot(Token<?> lookhead)
Bit operation '~'
-
onNeg
public void onNeg(Token<?> lookhead)
-
getResult
public Expression getResult(boolean unboxObject)
-
genReadObject
private void genReadObject()
-
genCustomSerializeMethod
private void genCustomSerializeMethod()
-
genWriteObject
private void genWriteObject()
-
end
private void end(boolean unboxObject)
-
onConstant
public void onConstant(Token<?> lookhead)
-
onConstant0
private void onConstant0(Token<?> lookhead, boolean inConstructor)
-
loadConstant
private boolean loadConstant(Token<?> lookhead, boolean inConstructor)
-
initVariables
public void initVariables(java.util.Map<java.lang.String,VariableMeta> vars)
-
initConstants
public void initConstants(java.util.Set<Token<?>> constants)
Initial constant pool.- Parameters:
constants-
-
initMethods
public void initMethods(java.util.Map<java.lang.String,java.lang.Integer> methods)
- Specified by:
initMethodsin interfaceEvalCodeGenerator- Overrides:
initMethodsin classBaseEvalCodeGenerator
-
getInnerName
private java.lang.String getInnerName(java.lang.String varName)
-
getInvokeMethodDesc
private static java.lang.String getInvokeMethodDesc(int paramCount)
-
onMethodInvoke
public void onMethodInvoke(Token<?> lookhead)
-
onMethodParameter
public void onMethodParameter(Token<?> lookhead)
-
pushOperand
private void pushOperand()
-
onArray
public void onArray(Token<?> lookhead)
-
onArrayIndexStart
public void onArrayIndexStart(Token<?> token)
-
onArrayIndexEnd
public void onArrayIndexEnd(Token<?> lookhead)
-
getLocalIndex
public int getLocalIndex()
-
onLambdaDefineStart
public void onLambdaDefineStart(Token<?> lookhead)
-
onLambdaArgument
public void onLambdaArgument(Token<?> lookhead, FunctionParam param)
-
onLambdaBodyStart
public void onLambdaBodyStart(Token<?> lookhead)
-
onLambdaBodyEnd
public void onLambdaBodyEnd(Token<?> lookhead)
-
genNewLambdaCode
public void genNewLambdaCode(LambdaFunctionBootstrap bootstrap)
-
onMethodName
public void onMethodName(Token<?> lookhead)
-
checkExecutionTimeout
private void checkExecutionTimeout()
-
loadAviatorFunction
private void loadAviatorFunction(java.lang.String outterMethodName, java.lang.String innerMethodName)
-
loadEnv
private void loadEnv()
-
createAviatorFunctionObject
private void createAviatorFunctionObject(java.lang.String methodName)
-
onBitAnd
public void onBitAnd(Token<?> lookhead)
-
onBitOr
public void onBitOr(Token<?> lookhead)
-
onBitXor
public void onBitXor(Token<?> lookhead)
-
onShiftLeft
public void onShiftLeft(Token<?> lookhead)
-
onShiftRight
public void onShiftRight(Token<?> lookhead)
-
onUnsignedShiftRight
public void onUnsignedShiftRight(Token<?> lookhead)
-
-