⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmclassgenerator.java

📁 大名鼎鼎的java动态脚本语言。已经通过了sun的认证
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
            // 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 + -