/** * Loads either this object or if we're inside a closure then load the top level owner */ protected void loadThisOrOwner() { if (isInnerClass()) { visitFieldExpression(new FieldExpression(controller.getClassNode().getDeclaredField("owner"))); } else { loadThis(null); } }
public static void loadReference(String name, WriterController controller) { CompileStack compileStack = controller.getCompileStack(); MethodVisitor mv = controller.getMethodVisitor(); ClassNode classNode = controller.getClassNode(); AsmClassGenerator acg = controller.getAcg(); // compileStack.containsVariable(name) means to ask if the variable is already declared // compileStack.getScope().isReferencedClassVariable(name) means to ask if the variable is a field // If it is no field and is not yet declared, then it is either a closure shared variable or // an already declared variable. if (!compileStack.containsVariable(name) && compileStack.getScope().isReferencedClassVariable(name)) { acg.visitFieldExpression(new FieldExpression(classNode.getDeclaredField(name))); } else { BytecodeVariable v = compileStack.getVariable(name, !classNodeUsesReferences(controller.getClassNode())); if (v == null) { // variable is not on stack because we are // inside a nested Closure and this variable // was not used before // then load it from the Closure field FieldNode field = classNode.getDeclaredField(name); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, controller.getInternalClassName(), name, BytecodeHelper.getTypeDescription(field.getType())); } else { mv.visitVarInsn(ALOAD, v.getIndex()); } controller.getOperandStack().push(ClassHelper.REFERENCE_TYPE); } }
FieldExpression exp = new FieldExpression(field); exp.setSourcePosition(expression); visitFieldExpression(exp); return;
visitFieldExpression(new FieldExpression(field)); return; visitFieldExpression(new FieldExpression(field)); return;
protected void processFieldAccess(String name, FieldNode field, int steps) { FieldExpression expression = new FieldExpression(field); if (steps == 0) { visitFieldExpression(expression); } else { visitOuterFieldExpression(expression, classNode.getOuterClass(), steps, true); } }
protected void processFieldAccess(String name, FieldNode field, int steps) { FieldExpression expression = new FieldExpression(field); if (steps == 0) { visitFieldExpression(expression); } else { visitOuterFieldExpression(expression, classNode.getOuterClass(), steps, true); } }
protected void processFieldAccess(String name, FieldNode field, int steps) { FieldExpression expression = new FieldExpression(field); if (steps == 0) { visitFieldExpression(expression); } else { visitOuterFieldExpression(expression, classNode.getOuterClass(), steps, true); } }
/** * Loads either this object or if we're inside a closure then load the top level owner */ protected void loadThisOrOwner() { if (isInnerClass()) { visitFieldExpression(new FieldExpression(classNode.getDeclaredField("owner"))); } else { loadThis(); } }
/** * Loads either this object or if we're inside a closure then load the top level owner */ protected void loadThisOrOwner() { if (isInnerClass()) { visitFieldExpression(new FieldExpression(classNode.getDeclaredField("owner"))); } else { loadThis(); } }
/** * Loads either this object or if we're inside a closure then load the top level owner */ protected void loadThisOrOwner() { if (isInnerClass()) { visitFieldExpression(new FieldExpression(classNode.getDeclaredField("owner"))); } else { loadThis(); } }
/** * Loads either this object or if we're inside a closure then load the top level owner */ protected void loadThisOrOwner() { if (isInnerClass()) { visitFieldExpression(new FieldExpression(controller.getClassNode().getDeclaredField("owner"))); } else { loadThis(); } }
visitFieldExpression(new FieldExpression(classNode.getDeclaredField(name))); } else { Variable v = compileStack.getVariable(name, classNode.getSuperClass() != ClassHelper.CLOSURE_TYPE);
visitFieldExpression(new FieldExpression(classNode.getDeclaredField(name))); } else { Variable v = compileStack.getVariable(name, classNode.getSuperClass() != ClassHelper.CLOSURE_TYPE);
visitFieldExpression(new FieldExpression(classNode.getDeclaredField(name))); } else { Variable v = compileStack.getVariable(name, classNode.getSuperClass() != ClassHelper.CLOSURE_TYPE);
public static void loadReference(String name, WriterController controller) { CompileStack compileStack = controller.getCompileStack(); MethodVisitor mv = controller.getMethodVisitor(); ClassNode classNode = controller.getClassNode(); AsmClassGenerator acg = controller.getAcg(); // compileStack.containsVariable(name) means to ask if the variable is already declared // compileStack.getScope().isReferencedClassVariable(name) means to ask if the variable is a field // If it is no field and is not yet declared, then it is either a closure shared variable or // an already declared variable. if (!compileStack.containsVariable(name) && compileStack.getScope().isReferencedClassVariable(name)) { acg.visitFieldExpression(new FieldExpression(classNode.getDeclaredField(name))); } else { BytecodeVariable v = compileStack.getVariable(name, !classNodeUsesReferences(controller.getClassNode())); if (v == null) { // variable is not on stack because we are // inside a nested Closure and this variable // was not used before // then load it from the Closure field FieldNode field = classNode.getDeclaredField(name); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, controller.getInternalClassName(), name, BytecodeHelper.getTypeDescription(field.getType())); } else { mv.visitVarInsn(ALOAD, v.getIndex()); } controller.getOperandStack().push(ClassHelper.REFERENCE_TYPE); } }
visitFieldExpression(new FieldExpression(field)); return;
visitFieldExpression(new FieldExpression(field)); return;
visitFieldExpression(new FieldExpression(field)); return;
visitFieldExpression(new FieldExpression(field)); return;