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 class
ASMCodeGenerator.MethodMetaData
-
Field Summary
Fields Modifier and Type Field Description private static java.util.concurrent.atomic.AtomicLong
CLASS_COUNTER
private java.lang.String
className
private ClassWriter
classWriter
private java.util.Map<Token<?>,java.lang.String>
constantPool
private static java.lang.String
CONSTRUCTOR_METHOD_NAME
private Label
currentLabel
private static java.lang.String
FIELD_PREFIX
private int
fieldCounter
static java.lang.String
FUNC_ARGS_INNER_VAR
private java.util.Map<java.lang.String,java.lang.String>
innerMethodMap
private java.util.Map<java.lang.String,java.lang.String>
innerVars
private static java.lang.String
JAVA_TYPE_OWNER
private java.util.Stack<Label>
l0stack
Label stack for ternary operatorprivate java.util.Stack<Label>
l1stack
private java.util.Map<Label,java.util.Map<java.lang.String,java.lang.Integer>>
labelNameIndexMap
private int
maxLocals
private int
maxStacks
private MethodVisitor
mv
private static java.lang.String
OBJECT_DESC
private static java.lang.String
OBJECT_OWNER
private int
operandsCount
Operands count to check stack framesprivate static java.lang.String
RUNTIME_UTILS
private static Label
START_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 void
checkExecutionTimeout()
private void
createAviatorFunctionObject(java.lang.String methodName)
private void
doCompareAndJump(Token<?> lookhead, int ints, OperatorType opType)
private void
end(boolean unboxObject)
private void
endVisitClass()
private void
endVisitMethodCode(boolean unboxObject)
private void
genCustomSerializeMethod()
void
genNewLambdaCode(LambdaFunctionBootstrap bootstrap)
private void
genReadObject()
private void
genWriteObject()
private java.lang.String
getInnerName(java.lang.String varName)
private static java.lang.String
getInvokeMethodDesc(int paramCount)
(package private) LambdaGenerator
getLambdaGenerator()
int
getLocalIndex()
Expression
getResult(boolean unboxObject)
void
initConstants(java.util.Set<Token<?>> constants)
Initial constant pool.void
initMethods(java.util.Map<java.lang.String,java.lang.Integer> methods)
void
initVariables(java.util.Map<java.lang.String,VariableMeta> vars)
private boolean
isEqNe(int ints)
private void
loadAviatorFunction(java.lang.String outterMethodName, java.lang.String innerMethodName)
private boolean
loadConstant(Token<?> lookhead, boolean inConstructor)
private void
loadEnv()
private void
loadOpType(OperatorType opType)
private void
makeConstructor()
Make a default constructorprivate Label
makeLabel()
Make a labelvoid
onAdd(Token<?> lookhead)
void
onAndLeft(Token<?> lookhead)
Do logic operation "&&" left operandvoid
onAndRight(Token<?> lookhead)
Do logic operation "&&" right operandvoid
onArray(Token<?> lookhead)
void
onArrayIndexEnd(Token<?> lookhead)
void
onArrayIndexStart(Token<?> token)
void
onAssignment(Token<?> lookhead)
void
onBitAnd(Token<?> lookhead)
void
onBitNot(Token<?> lookhead)
Bit operation '~'void
onBitOr(Token<?> lookhead)
void
onBitXor(Token<?> lookhead)
void
onConstant(Token<?> lookhead)
private void
onConstant0(Token<?> lookhead, boolean inConstructor)
void
onDiv(Token<?> lookhead)
void
onEq(Token<?> lookhead)
void
onExponent(Token<?> lookhead)
void
onGe(Token<?> lookhead)
void
onGt(Token<?> lookhead)
void
onJoinLeft(Token<?> lookhead)
Do logic operation "||" left operandvoid
onJoinRight(Token<?> lookhead)
Do logic operation "||" right operandvoid
onLambdaArgument(Token<?> lookhead, FunctionParam param)
void
onLambdaBodyEnd(Token<?> lookhead)
void
onLambdaBodyStart(Token<?> lookhead)
void
onLambdaDefineStart(Token<?> lookhead)
void
onLe(Token<?> lookhead)
void
onLt(Token<?> lookhead)
void
onMatch(Token<?> lookhead)
void
onMethodInvoke(Token<?> lookhead)
void
onMethodName(Token<?> lookhead)
void
onMethodParameter(Token<?> lookhead)
void
onMod(Token<?> lookhead)
void
onMult(Token<?> lookhead)
void
onNeg(Token<?> lookhead)
void
onNeq(Token<?> lookhead)
void
onNot(Token<?> lookhead)
Logic operation '!'void
onShiftLeft(Token<?> lookhead)
void
onShiftRight(Token<?> lookhead)
void
onSub(Token<?> lookhead)
void
onTernaryBoolean(Token<?> lookhead)
void
onTernaryEnd(Token<?> lookhead)
void
onTernaryLeft(Token<?> lookhead)
void
onTernaryRight(Token<?> lookhead)
void
onUnsignedShiftRight(Token<?> lookhead)
private Label
peekLabel0()
private Label
peekLabel1()
private Label
popLabel0()
private Label
popLabel1()
private void
popOperand()
Pop a operand from stackprivate void
popOperand(int n)
Pop a operand from stackprivate void
pushLabel0(Label l0)
private void
pushLabel1(Label l1)
private void
pushOperand()
private void
pushOperand(int delta)
private void
setMaxStacks(int newMaxStacks)
void
start()
private void
startVisitMethodCode()
private void
visitBinOperator(Token<?> token, OperatorType opType, java.lang.String methodName)
private void
visitBoolean()
private void
visitClass()
private void
visitCompare(int ints, OperatorType opType)
private void
visitLabel(Label label)
private void
visitLeftBranch(Token<?> lookhead, int ints, OperatorType opType)
private void
visitLineNumber(Token<?> token)
private void
visitRightBranch(Token<?> lookhead, int ints, OperatorType opType)
private void
visitUnaryOperator(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:
initMethods
in interfaceEvalCodeGenerator
- Overrides:
initMethods
in 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)
-
-