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);
}
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());
}
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);
}
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);
}
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);
}
}
Aggregations