use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy-core by groovy.
the class AsmClassGenerator method visitPropertyExpression.
public void visitPropertyExpression(PropertyExpression expression) {
Expression objectExpression = expression.getObjectExpression();
OperandStack operandStack = controller.getOperandStack();
int mark = operandStack.getStackLength() - 1;
MethodCallerMultiAdapter adapter;
if (controller.getCompileStack().isLHS()) {
//operandStack.box();
adapter = setProperty;
if (isGroovyObject(objectExpression))
adapter = setGroovyObjectProperty;
if (isThisOrSuperInStaticContext(objectExpression))
adapter = setProperty;
} else {
adapter = getProperty;
if (isGroovyObject(objectExpression))
adapter = getGroovyObjectProperty;
if (isThisOrSuperInStaticContext(objectExpression))
adapter = getProperty;
}
visitAttributeOrProperty(expression, adapter);
if (controller.getCompileStack().isLHS()) {
// remove surplus values
operandStack.remove(operandStack.getStackLength() - mark);
} else {
controller.getAssertionWriter().record(expression.getProperty());
}
}
use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy by apache.
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);
}
}
use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy by apache.
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 by apache.
the class AsmClassGenerator method visitPropertyExpression.
public void visitPropertyExpression(PropertyExpression expression) {
Expression objectExpression = expression.getObjectExpression();
OperandStack operandStack = controller.getOperandStack();
int mark = operandStack.getStackLength() - 1;
MethodCallerMultiAdapter adapter;
if (controller.getCompileStack().isLHS()) {
//operandStack.box();
adapter = setProperty;
if (isGroovyObject(objectExpression))
adapter = setGroovyObjectProperty;
if (isThisOrSuperInStaticContext(objectExpression))
adapter = setProperty;
} else {
adapter = getProperty;
if (isGroovyObject(objectExpression))
adapter = getGroovyObjectProperty;
if (isThisOrSuperInStaticContext(objectExpression))
adapter = getProperty;
}
visitAttributeOrProperty(expression, adapter);
if (controller.getCompileStack().isLHS()) {
// remove surplus values
operandStack.remove(operandStack.getStackLength() - mark);
} else {
controller.getAssertionWriter().record(expression.getProperty());
}
}
use of org.codehaus.groovy.classgen.asm.OperandStack in project groovy by apache.
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());
}
Aggregations