Search in sources :

Example 6 with OperandStack

use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy by apache.

the class InvokeDynamicWriter method makeIndyCall.

private void makeIndyCall(MethodCallerMultiAdapter adapter, Expression receiver, boolean implicitThis, boolean safe, String methodName, Expression arguments) {
    OperandStack operandStack = controller.getOperandStack();
    String sig = prepareIndyCall(receiver, implicitThis);
    // load arguments
    int numberOfArguments = 1;
    ArgumentListExpression ae = makeArgumentList(arguments);
    boolean containsSpreadExpression = AsmClassGenerator.containsSpreadExpression(arguments);
    if (containsSpreadExpression) {
        controller.getAcg().despreadList(ae.getExpressions(), true);
        sig += getTypeDescription(Object[].class);
    } else {
        for (Expression arg : ae.getExpressions()) {
            arg.visit(controller.getAcg());
            if (arg instanceof CastExpression) {
                operandStack.box();
                controller.getAcg().loadWrapper(arg);
                sig += getTypeDescription(Wrapper.class);
            } else {
                sig += getTypeDescription(operandStack.getTopOperand());
            }
            numberOfArguments++;
        }
    }
    sig += ")Ljava/lang/Object;";
    String callSiteName = METHOD.getCallSiteName();
    if (adapter == null)
        callSiteName = INIT.getCallSiteName();
    int flags = getMethodCallFlags(adapter, safe, containsSpreadExpression);
    finishIndyCall(BSM, callSiteName, sig, numberOfArguments, methodName, flags);
}
Also used : OperandStack(org.codehaus.groovy.classgen.asm.OperandStack) Wrapper(org.codehaus.groovy.runtime.wrappers.Wrapper) ConstantExpression(org.codehaus.groovy.ast.expr.ConstantExpression) EmptyExpression(org.codehaus.groovy.ast.expr.EmptyExpression) Expression(org.codehaus.groovy.ast.expr.Expression) ConstructorCallExpression(org.codehaus.groovy.ast.expr.ConstructorCallExpression) ArgumentListExpression(org.codehaus.groovy.ast.expr.ArgumentListExpression) ClassExpression(org.codehaus.groovy.ast.expr.ClassExpression) CastExpression(org.codehaus.groovy.ast.expr.CastExpression) ArgumentListExpression(org.codehaus.groovy.ast.expr.ArgumentListExpression) CastExpression(org.codehaus.groovy.ast.expr.CastExpression)

Example 7 with OperandStack

use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy-core by groovy.

the class InvokeDynamicWriter method prepareIndyCall.

private String prepareIndyCall(Expression receiver, boolean implicitThis) {
    CompileStack compileStack = controller.getCompileStack();
    OperandStack operandStack = controller.getOperandStack();
    compileStack.pushLHS(false);
    // load normal receiver as first argument
    compileStack.pushImplicitThis(implicitThis);
    receiver.visit(controller.getAcg());
    compileStack.popImplicitThis();
    return "(" + getTypeDescription(operandStack.getTopOperand());
}
Also used : OperandStack(org.codehaus.groovy.classgen.asm.OperandStack) CompileStack(org.codehaus.groovy.classgen.asm.CompileStack)

Example 8 with OperandStack

use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy-core by groovy.

the class AsmClassGenerator method visitRangeExpression.

public void visitRangeExpression(RangeExpression expression) {
    OperandStack operandStack = controller.getOperandStack();
    expression.getFrom().visit(this);
    operandStack.box();
    expression.getTo().visit(this);
    operandStack.box();
    operandStack.pushBool(expression.isInclusive());
    createRangeMethod.call(controller.getMethodVisitor());
    operandStack.replace(ClassHelper.RANGE_TYPE, 3);
}
Also used : OperandStack(org.codehaus.groovy.classgen.asm.OperandStack)

Example 9 with OperandStack

use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy-core by groovy.

the class AsmClassGenerator method visitListExpression.

public void visitListExpression(ListExpression expression) {
    onLineNumber(expression, "ListExpression");
    int size = expression.getExpressions().size();
    boolean containsSpreadExpression = containsSpreadExpression(expression);
    boolean containsOnlyConstants = !containsSpreadExpression && containsOnlyConstants(expression);
    OperandStack operandStack = controller.getOperandStack();
    if (!containsSpreadExpression) {
        MethodVisitor mv = controller.getMethodVisitor();
        BytecodeHelper.pushConstant(mv, size);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
        int maxInit = 1000;
        if (size < maxInit || !containsOnlyConstants) {
            for (int i = 0; i < size; i++) {
                mv.visitInsn(DUP);
                BytecodeHelper.pushConstant(mv, i);
                expression.getExpression(i).visit(this);
                operandStack.box();
                mv.visitInsn(AASTORE);
            }
            controller.getOperandStack().remove(size);
        } else {
            List<Expression> expressions = expression.getExpressions();
            List<String> methods = new ArrayList();
            MethodVisitor oldMv = mv;
            int index = 0;
            while (index < size) {
                String methodName = "$createListEntry_" + controller.getNextHelperMethodIndex();
                methods.add(methodName);
                mv = controller.getClassVisitor().visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, methodName, "([Ljava/lang/Object;)V", null, null);
                controller.setMethodVisitor(mv);
                mv.visitCode();
                int methodBlockSize = Math.min(size - index, maxInit);
                int methodBlockEnd = index + methodBlockSize;
                for (; index < methodBlockEnd; index++) {
                    mv.visitVarInsn(ALOAD, 0);
                    mv.visitLdcInsn(index);
                    expressions.get(index).visit(this);
                    operandStack.box();
                    mv.visitInsn(AASTORE);
                }
                operandStack.remove(methodBlockSize);
                mv.visitInsn(RETURN);
                mv.visitMaxs(0, 0);
                mv.visitEnd();
            }
            mv = oldMv;
            controller.setMethodVisitor(mv);
            for (String methodName : methods) {
                mv.visitInsn(DUP);
                mv.visitMethodInsn(INVOKESTATIC, controller.getInternalClassName(), methodName, "([Ljava/lang/Object;)V", false);
            }
        }
    } else {
        despreadList(expression.getExpressions(), false);
    }
    createListMethod.call(controller.getMethodVisitor());
    operandStack.push(ClassHelper.LIST_TYPE);
}
Also used : OperandStack(org.codehaus.groovy.classgen.asm.OperandStack) ArrayList(java.util.ArrayList) MethodVisitor(org.objectweb.asm.MethodVisitor)

Example 10 with OperandStack

use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy-core by groovy.

the class AsmClassGenerator method visitAttributeExpression.

public void visitAttributeExpression(AttributeExpression expression) {
    Expression objectExpression = expression.getObjectExpression();
    MethodCallerMultiAdapter adapter;
    OperandStack operandStack = controller.getOperandStack();
    int mark = operandStack.getStackLength() - 1;
    if (controller.getCompileStack().isLHS()) {
        adapter = setField;
        if (isGroovyObject(objectExpression))
            adapter = setGroovyObjectField;
        if (usesSuper(expression))
            adapter = setFieldOnSuper;
    } else {
        adapter = getField;
        if (isGroovyObject(objectExpression))
            adapter = getGroovyObjectField;
        if (usesSuper(expression))
            adapter = getFieldOnSuper;
    }
    visitAttributeOrProperty(expression, adapter);
    if (!controller.getCompileStack().isLHS()) {
        controller.getAssertionWriter().record(expression.getProperty());
    } else {
        operandStack.remove(operandStack.getStackLength() - mark);
    }
}
Also used : MethodCallerMultiAdapter(org.codehaus.groovy.classgen.asm.MethodCallerMultiAdapter) OperandStack(org.codehaus.groovy.classgen.asm.OperandStack)

Aggregations

OperandStack (org.codehaus.groovy.classgen.asm.OperandStack)18 CompileStack (org.codehaus.groovy.classgen.asm.CompileStack)5 MethodVisitor (org.objectweb.asm.MethodVisitor)5 MethodCallerMultiAdapter (org.codehaus.groovy.classgen.asm.MethodCallerMultiAdapter)4 ArgumentListExpression (org.codehaus.groovy.ast.expr.ArgumentListExpression)3 Expression (org.codehaus.groovy.ast.expr.Expression)3 ArrayList (java.util.ArrayList)2 ClassNode (org.codehaus.groovy.ast.ClassNode)2 FieldNode (org.codehaus.groovy.ast.FieldNode)2 CastExpression (org.codehaus.groovy.ast.expr.CastExpression)2 ClassExpression (org.codehaus.groovy.ast.expr.ClassExpression)2 ConstantExpression (org.codehaus.groovy.ast.expr.ConstantExpression)2 ConstructorCallExpression (org.codehaus.groovy.ast.expr.ConstructorCallExpression)2 EmptyExpression (org.codehaus.groovy.ast.expr.EmptyExpression)2 Wrapper (org.codehaus.groovy.runtime.wrappers.Wrapper)2 Parameter (org.codehaus.groovy.ast.Parameter)1 MethodCallExpression (org.codehaus.groovy.ast.expr.MethodCallExpression)1 TypeChooser (org.codehaus.groovy.classgen.asm.TypeChooser)1