📄 asmclassgenerator.java
字号:
// return is based on class type // we may need to cast helper.unbox(returnType); if (returnType==ClassHelper.double_TYPE) { cv.visitInsn(DRETURN); } else if (returnType==ClassHelper.float_TYPE) { cv.visitInsn(FRETURN); } else if (returnType==ClassHelper.long_TYPE) { cv.visitInsn(LRETURN); } else if (returnType==ClassHelper.boolean_TYPE) { cv.visitInsn(IRETURN); } else if ( returnType==ClassHelper.char_TYPE || returnType==ClassHelper.byte_TYPE || returnType==ClassHelper.int_TYPE || returnType==ClassHelper.short_TYPE) { //byte,short,boolean,int are all IRETURN cv.visitInsn(IRETURN); } else { doConvertAndCast(returnType, expression, false, true); cv.visitInsn(ARETURN); } } outputReturn = true; } /** * Casts to the given type unless it can be determined that the cast is unnecessary */ protected void doConvertAndCast(ClassNode type, Expression expression, boolean ignoreAutoboxing, boolean forceCast) { ClassNode expType = getExpressionType(expression); // temp resolution: convert all primitive casting to corresponsing Object type if (!ignoreAutoboxing && ClassHelper.isPrimitiveType(type)) { type = ClassHelper.getWrapper(type); } if (forceCast || (type!=null && !type.equals(expType))) { doConvertAndCast(type); } } /** * @param expression */ protected void evaluateExpression(Expression expression) { visitAndAutoboxBoolean(expression); //expression.visit(this); Expression assignExpr = createReturnLHSExpression(expression); if (assignExpr != null) { leftHandExpression = false; assignExpr.visit(this); } } public void visitExpressionStatement(ExpressionStatement statement) { onLineNumber(statement, "visitExpressionStatement: " + statement.getExpression().getClass().getName()); visitStatement(statement); Expression expression = statement.getExpression();// disabled in favor of JIT resolving// if (ENABLE_EARLY_BINDING)// expression.resolve(this); visitAndAutoboxBoolean(expression); if (isPopRequired(expression)) { cv.visitInsn(POP); } } // Expressions //------------------------------------------------------------------------- public void visitDeclarationExpression(DeclarationExpression expression) { onLineNumber(expression, "visitDeclarationExpression: \""+expression.getVariableExpression().getName()+"\""); Expression rightExpression = expression.getRightExpression(); // no need to visit left side, just get the variable name VariableExpression vex = expression.getVariableExpression(); ClassNode type = vex.getType(); // lets not cast for primitive types as we handle these in field setting etc if (ClassHelper.isPrimitiveType(type)) { rightExpression.visit(this); } else { if (type!=ClassHelper.OBJECT_TYPE){ visitCastExpression(new CastExpression(type, rightExpression)); } else { visitAndAutoboxBoolean(rightExpression); } } compileStack.defineVariable(vex,true); } public void visitBinaryExpression(BinaryExpression expression) { onLineNumber(expression, "visitBinaryExpression: \"" + expression.getOperation().getText() + "\" "); switch (expression.getOperation().getType()) { case Types.EQUAL : // = assignment evaluateEqual(expression); break; case Types.COMPARE_IDENTICAL : // === evaluateBinaryExpression(compareIdenticalMethod, expression); break; case Types.COMPARE_EQUAL : // == evaluateBinaryExpression(compareEqualMethod, expression); break; case Types.COMPARE_NOT_EQUAL : evaluateBinaryExpression(compareNotEqualMethod, expression); break; case Types.COMPARE_TO : evaluateCompareTo(expression); break; case Types.COMPARE_GREATER_THAN : evaluateBinaryExpression(compareGreaterThanMethod, expression); break; case Types.COMPARE_GREATER_THAN_EQUAL : evaluateBinaryExpression(compareGreaterThanEqualMethod, expression); break; case Types.COMPARE_LESS_THAN : evaluateBinaryExpression(compareLessThanMethod, expression); break; case Types.COMPARE_LESS_THAN_EQUAL : evaluateBinaryExpression(compareLessThanEqualMethod, expression); break; case Types.LOGICAL_AND : evaluateLogicalAndExpression(expression); break; case Types.LOGICAL_OR : evaluateLogicalOrExpression(expression); break; case Types.BITWISE_AND : evaluateBinaryExpression("and", expression); break; case Types.BITWISE_AND_EQUAL : evaluateBinaryExpressionWithAsignment("and", expression); break; case Types.BITWISE_OR : evaluateBinaryExpression("or", expression); break; case Types.BITWISE_OR_EQUAL : evaluateBinaryExpressionWithAsignment("or", expression); break; case Types.BITWISE_XOR : evaluateBinaryExpression("xor", expression); break; case Types.BITWISE_XOR_EQUAL : evaluateBinaryExpressionWithAsignment("xor", expression); break; case Types.PLUS : evaluateBinaryExpression("plus", expression); break; case Types.PLUS_EQUAL : evaluateBinaryExpressionWithAsignment("plus", expression); break; case Types.MINUS : evaluateBinaryExpression("minus", expression); break; case Types.MINUS_EQUAL : evaluateBinaryExpressionWithAsignment("minus", expression); break; case Types.MULTIPLY : evaluateBinaryExpression("multiply", expression); break; case Types.MULTIPLY_EQUAL : evaluateBinaryExpressionWithAsignment("multiply", expression); break; case Types.DIVIDE : evaluateBinaryExpression("div", expression); break; case Types.DIVIDE_EQUAL : //SPG don't use divide since BigInteger implements directly //and we want to dispatch through DefaultGroovyMethods to get a BigDecimal result evaluateBinaryExpressionWithAsignment("div", expression); break; case Types.INTDIV : evaluateBinaryExpression("intdiv", expression); break; case Types.INTDIV_EQUAL : evaluateBinaryExpressionWithAsignment("intdiv", expression); break; case Types.MOD : evaluateBinaryExpression("mod", expression); break; case Types.MOD_EQUAL : evaluateBinaryExpressionWithAsignment("mod", expression); break; case Types.POWER : evaluateBinaryExpression("power", expression); break; case Types.POWER_EQUAL : evaluateBinaryExpressionWithAsignment("power", expression); break; case Types.LEFT_SHIFT : evaluateBinaryExpression("leftShift", expression); break; case Types.LEFT_SHIFT_EQUAL : evaluateBinaryExpressionWithAsignment("leftShift", expression); break; case Types.RIGHT_SHIFT : evaluateBinaryExpression("rightShift", expression); break; case Types.RIGHT_SHIFT_EQUAL : evaluateBinaryExpressionWithAsignment("rightShift", expression); break; case Types.RIGHT_SHIFT_UNSIGNED : evaluateBinaryExpression("rightShiftUnsigned", expression); break; case Types.RIGHT_SHIFT_UNSIGNED_EQUAL : evaluateBinaryExpressionWithAsignment("rightShiftUnsigned", expression); break; case Types.KEYWORD_INSTANCEOF : evaluateInstanceof(expression); break; case Types.FIND_REGEX : evaluateBinaryExpression(findRegexMethod, expression); break; case Types.MATCH_REGEX : evaluateBinaryExpression(matchRegexMethod, expression); break; case Types.LEFT_SQUARE_BRACKET : if (leftHandExpression) { throwException("Should not be called here. Possible reason: postfix operation on array."); // This is handled right now in the evaluateEqual() // should support this here later //evaluateBinaryExpression("putAt", expression); } else { evaluateBinaryExpression("getAt", expression); } break; default : throwException("Operation: " + expression.getOperation() + " not supported"); } } private void load(Expression exp) { boolean wasLeft = leftHandExpression; leftHandExpression = false;// if (CREATE_DEBUG_INFO)// helper.mark("-- loading expression: " + exp.getClass().getName() +// " at [" + exp.getLineNumber() + ":" + exp.getColumnNumber() + "]"); //exp.visit(this); visitAndAutoboxBoolean(exp);// if (CREATE_DEBUG_INFO)// helper.mark(" -- end of loading --"); leftHandExpression = wasLeft; } public void visitPostfixExpression(PostfixExpression expression) { switch (expression.getOperation().getType()) { case Types.PLUS_PLUS : evaluatePostfixMethod("next", expression.getExpression()); break; case Types.MINUS_MINUS : evaluatePostfixMethod("previous", expression.getExpression()); break; } } // store the data on the stack to the expression (variablem, property, field, etc. private void store(Expression expression) { if (expression instanceof BinaryExpression) { throwException("BinaryExpression appeared on LHS. "); } if (ASM_DEBUG) { if (expression instanceof VariableExpression) { helper.mark(((VariableExpression)expression).getName()); } } boolean wasLeft = leftHandExpression; leftHandExpression = true; expression.visit(this); //evaluateExpression(expression);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -