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
Code generator using asm
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final AtomicLong
private final String
private final ClassWriter
private static final String
private Label
private static final String
private int
static final String
private static final String
Label stack for ternary operatorprivate int
private int
private MethodVisitor
private static final String
private static final String
private int
Operands count to check stack framesprivate static final String
private static final 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
ConstructorsConstructorDescriptionASMCodeGenerator
(AviatorEvaluatorInstance instance, String sourceFile, AviatorClassLoader classLoader, OutputStream traceOut) -
Method Summary
Modifier and TypeMethodDescriptionprivate void
private void
createAviatorFunctionObject
(String methodName) private void
doCompareAndJump
(Token<?> lookhead, int ints, OperatorType opType) private void
end
(boolean unboxObject) private void
private void
endVisitMethodCode
(boolean unboxObject) private void
void
genNewLambdaCode
(LambdaFunctionBootstrap bootstrap) private void
private void
private String
getInnerName
(String varName) private static String
getInvokeMethodDesc
(int paramCount) (package private) LambdaGenerator
int
getResult
(boolean unboxObject) void
initConstants
(Set<Token<?>> constants) Initial constant pool.void
initMethods
(Map<String, Integer> methods) void
initVariables
(Map<String, VariableMeta> vars) private boolean
isEqNe
(int ints) private void
loadAviatorFunction
(String outterMethodName, String innerMethodName) private boolean
loadConstant
(Token<?> lookhead, boolean inConstructor) private void
loadEnv()
private void
loadOpType
(OperatorType opType) private void
Make a default constructorprivate Label
Make a labelvoid
void
Do logic operation "invalid input: '&'invalid input: '&'" left operandvoid
onAndRight
(Token<?> lookhead) Do logic operation "invalid input: '&'invalid input: '&'" right operandvoid
void
onArrayIndexEnd
(Token<?> lookhead) void
onArrayIndexStart
(Token<?> token) void
onAssignment
(Token<?> lookhead) void
void
Bit operation '~'void
void
void
onConstant
(Token<?> lookhead) private void
onConstant0
(Token<?> lookhead, boolean inConstructor) void
void
void
onExponent
(Token<?> lookhead) void
void
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
void
void
void
onMethodInvoke
(Token<?> lookhead) void
onMethodName
(Token<?> lookhead) void
onMethodParameter
(Token<?> lookhead) void
void
void
void
void
Logic operation '!'void
onShiftLeft
(Token<?> lookhead) void
onShiftRight
(Token<?> lookhead) void
void
onTernaryBoolean
(Token<?> lookhead) void
onTernaryEnd
(Token<?> lookhead) void
onTernaryLeft
(Token<?> lookhead) void
onTernaryRight
(Token<?> lookhead) void
onUnsignedShiftRight
(Token<?> lookhead) private Label
private Label
private Label
private Label
private void
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
private void
pushOperand
(int delta) private void
setMaxStacks
(int newMaxStacks) void
start()
private void
private void
visitBinOperator
(Token<?> token, OperatorType opType, String methodName) private void
private void
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, String methodName) Methods inherited from class com.googlecode.aviator.code.BaseEvalCodeGenerator
getClassLoader, getFuncsArgs, getNextFuncInvocationId, setLambdaBootstraps, setParser
-
Field Details
-
RUNTIME_UTILS
- See Also:
-
OBJECT_DESC
- See Also:
-
JAVA_TYPE_OWNER
- See Also:
-
CONSTRUCTOR_METHOD_NAME
- See Also:
-
OBJECT_OWNER
- See Also:
-
FUNC_ARGS_INNER_VAR
- See Also:
-
FIELD_PREFIX
- See Also:
-
classWriter
-
mv
-
className
-
CLASS_COUNTER
-
operandsCount
private int operandsCountOperands count to check stack frames -
maxStacks
private int maxStacks -
maxLocals
private int maxLocals -
fieldCounter
private int fieldCounter -
innerVars
-
innerMethodMap
-
constantPool
-
labelNameIndexMap
-
START_LABEL
-
currentLabel
-
l0stack
Label stack for ternary operator -
l1stack
-
-
Constructor Details
-
ASMCodeGenerator
public ASMCodeGenerator(AviatorEvaluatorInstance instance, String sourceFile, AviatorClassLoader classLoader, OutputStream traceOut)
-
-
Method Details
-
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
Make a label- Returns:
-
onAdd
-
loadOpType
-
popOperand
private void popOperand()Pop a operand from stack -
popOperand
private void popOperand(int n) Pop a operand from stack -
onSub
-
onMult
-
onExponent
-
onAssignment
-
onDiv
-
onMod
-
onAndLeft
Do logic operation "invalid input: '&'invalid input: '&'" left operand -
visitBoolean
private void visitBoolean() -
pushLabel0
-
onAndRight
Do logic operation "invalid input: '&'invalid input: '&'" right operand -
visitRightBranch
-
onTernaryBoolean
-
pushLabel1
-
onTernaryLeft
-
peekLabel1
-
onTernaryRight
-
onTernaryEnd
-
popLabel1
-
onJoinRight
Do logic operation "||" right operand -
visitLabel
-
peekLabel0
-
popLabel0
-
onJoinLeft
Do logic operation "||" left operand -
visitLeftBranch
-
onEq
-
onMatch
-
onNeq
-
doCompareAndJump
-
isEqNe
private boolean isEqNe(int ints) -
visitCompare
-
onGe
-
onGt
-
onLe
-
onLt
-
pushOperand
private void pushOperand(int delta) -
onNot
Logic operation '!' -
visitBinOperator
-
visitLineNumber
-
visitUnaryOperator
-
onBitNot
Bit operation '~' -
onNeg
-
getResult
-
genReadObject
private void genReadObject() -
genCustomSerializeMethod
private void genCustomSerializeMethod() -
genWriteObject
private void genWriteObject() -
end
private void end(boolean unboxObject) -
onConstant
-
onConstant0
-
loadConstant
-
initVariables
-
initConstants
Initial constant pool.- Parameters:
constants
-
-
initMethods
- Specified by:
initMethods
in interfaceEvalCodeGenerator
- Overrides:
initMethods
in classBaseEvalCodeGenerator
-
getInnerName
-
getInvokeMethodDesc
-
onMethodInvoke
-
onMethodParameter
-
pushOperand
private void pushOperand() -
onArray
-
onArrayIndexStart
-
onArrayIndexEnd
-
getLocalIndex
public int getLocalIndex() -
onLambdaDefineStart
-
onLambdaArgument
-
onLambdaBodyStart
-
onLambdaBodyEnd
-
genNewLambdaCode
-
onMethodName
-
checkExecutionTimeout
private void checkExecutionTimeout() -
loadAviatorFunction
-
loadEnv
private void loadEnv() -
createAviatorFunctionObject
-
onBitAnd
-
onBitOr
-
onBitXor
-
onShiftLeft
-
onShiftRight
-
onUnsignedShiftRight
-