public void visitFieldExpression(FieldExpression expression) { if (!expression.getField().isSynthetic()) { assertValidIdentifier(expression.getFieldName(), "field name", expression); } super.visitFieldExpression(expression); }
@Override public void visitFieldExpression(FieldExpression expr) { super.visitFieldExpression(expr); checkFieldAccess(expr, expr.getField()); }
/** * @param fldExp */ public void loadStaticField(FieldExpression fldExp) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = fldExp.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); if (holder) { mv.visitFieldInsn(GETSTATIC, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "get", "()Ljava/lang/Object;", false); controller.getOperandStack().push(ClassHelper.OBJECT_TYPE); } else { mv.visitFieldInsn(GETSTATIC, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); controller.getOperandStack().push(field.getType()); } }
protected ClassNode getOriginalDeclarationType(Expression lhs) { if (lhs instanceof VariableExpression) { Variable var = findTargetVariable((VariableExpression) lhs); if (var instanceof PropertyNode) { // Do NOT trust the type of the property node! return getType(lhs); } if (var instanceof DynamicVariable) return getType(lhs); return var.getOriginType(); } if (lhs instanceof FieldExpression) { return ((FieldExpression) lhs).getField().getOriginType(); } return getType(lhs); }
private void storeStaticField(FieldExpression expression) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = expression.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); controller.getOperandStack().doGroovyCast(field); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); if (holder) { controller.getOperandStack().box(); mv.visitFieldInsn(GETSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V", false); } else { mv.visitFieldInsn(PUTSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); } controller.getOperandStack().remove(1); }
private Expression transformFieldExpression(final FieldExpression exp) { FieldNode field = exp.getField(); MethodCallExpression mce = new MethodCallExpression( createFieldHelperReceiver(), Traits.helperGetterName(field), ArgumentListExpression.EMPTY_ARGUMENTS ); mce.setSourcePosition(exp); mce.setImplicitThis(false); markDynamicCall(mce, field, field.isStatic()); return mce; }
/** * RHS instance field. should move most of the code in the BytecodeHelper * * @param fldExp */ public void loadInstanceField(FieldExpression fldExp) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = fldExp.getField(); boolean holder = field.isHolder() && !controller.isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerName, fldExp.getFieldName(), BytecodeHelper.getTypeDescription(type)); if (holder) { mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "get", "()Ljava/lang/Object;", false); controller.getOperandStack().push(ClassHelper.OBJECT_TYPE); } else { controller.getOperandStack().push(field.getType()); } }
public void visitFieldExpression(FieldExpression expression) { FieldNode field = expression.getField(); if (field.isStatic()) { if (controller.getCompileStack().isLHS()) { storeStaticField(expression); } else { loadStaticField(expression); } } else { if (controller.getCompileStack().isLHS()) { storeThisInstanceField(expression); } else { loadInstanceField(expression); } } if (controller.getCompileStack().isLHS()) controller.getAssertionWriter().record(expression); }
private void storeThisInstanceField(FieldExpression expression) { MethodVisitor mv = controller.getMethodVisitor(); FieldNode field = expression.getField(); boolean setReferenceFromReference = field.isHolder() && expression.isUseReferenceDirectly(); String ownerName = (field.getOwner().equals(controller.getClassNode())) ? controller.getInternalClassName() : BytecodeHelper.getClassInternalName(field.getOwner()); OperandStack operandStack = controller.getOperandStack(); if (setReferenceFromReference) { // rhs is ready to use reference, just put it in the field mv.visitVarInsn(ALOAD, 0); operandStack.push(controller.getClassNode()); operandStack.swap(); mv.visitFieldInsn(PUTFIELD, ownerName, field.getName(), BytecodeHelper.getTypeDescription(field.getType())); } else if (field.isHolder()){ // rhs is normal value, set the value in the Reference operandStack.doGroovyCast(field.getOriginType()); operandStack.box(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(field.getType())); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V", false); } else { // rhs is normal value, set normal value operandStack.doGroovyCast(field.getOriginType()); mv.visitVarInsn(ALOAD, 0); operandStack.push(controller.getClassNode()); operandStack.swap(); mv.visitFieldInsn(PUTFIELD, ownerName, field.getName(), BytecodeHelper.getTypeDescription(field.getType())); } }
public void visitFieldExpression(FieldExpression expression) { FieldNode field = expression.getField(); if (field.isStatic()) { if (leftHandExpression) { storeStaticField(expression); } else { loadStaticField(expression); } } else { if (leftHandExpression) { storeThisInstanceField(expression); } else { loadInstanceField(expression); } } }
public void visitFieldExpression(FieldExpression expression) { if (!expression.getField().isSynthetic()) { assertValidIdentifier(expression.getFieldName(), "field name", expression); } super.visitFieldExpression(expression); }
public void visitFieldExpression(FieldExpression expression) { FieldNode field = expression.getField(); if (field.isStatic()) { if (leftHandExpression) { storeStaticField(expression); } else { loadStaticField(expression); } } else { if (leftHandExpression) { storeThisInstanceField(expression); } else { loadInstanceField(expression); } } }
public void visitFieldExpression(FieldExpression expression) { if (!expression.getField().isSynthetic()) { assertValidIdentifier(expression.getFieldName(), "field name", expression); } super.visitFieldExpression(expression); }
public void visitFieldExpression(FieldExpression expression) { FieldNode field = expression.getField(); if (field.isStatic()) { if (leftHandExpression) { storeStaticField(expression); } else { loadStaticField(expression); } } else { if (leftHandExpression) { storeThisInstanceField(expression); } else { loadInstanceField(expression); } } }
public void visitFieldExpression(FieldExpression expression) { if (!expression.getField().isSynthetic()) { assertValidIdentifier(expression.getFieldName(), "field name", expression); } super.visitFieldExpression(expression); }
public void visitFieldExpression(FieldExpression expression) { FieldNode field = expression.getField(); if (field.isStatic()) { if (controller.getCompileStack().isLHS()) { storeStaticField(expression); } else { loadStaticField(expression); } } else { if (controller.getCompileStack().isLHS()) { storeThisInstanceField(expression); } else { loadInstanceField(expression); } } if (controller.getCompileStack().isLHS()) controller.getAssertionWriter().record(expression); }
public void visitFieldExpression(FieldExpression expression) { if (!expression.getField().isSynthetic()) { assertValidIdentifier(expression.getFieldName(), "field name", expression); } super.visitFieldExpression(expression); }
public void storeStaticField(FieldExpression expression) { FieldNode field = expression.getField(); boolean holder = field.isHolder() && !isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(classNode)) ? internalClassName : helper.getClassInternalName(field.getOwner()); if (holder) { mv.visitFieldInsn(GETSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V"); } else { helper.doCast(type); mv.visitFieldInsn(PUTSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); } }
public void storeStaticField(FieldExpression expression) { FieldNode field = expression.getField(); boolean holder = field.isHolder() && !isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(classNode)) ? internalClassName : helper.getClassInternalName(field.getOwner()); if (holder) { mv.visitFieldInsn(GETSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V"); } else { helper.doCast(type); mv.visitFieldInsn(PUTSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); } }
public void storeStaticField(FieldExpression expression) { FieldNode field = expression.getField(); boolean holder = field.isHolder() && !isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(classNode)) ? internalClassName : helper.getClassInternalName(field.getOwner()); if (holder) { mv.visitFieldInsn(GETSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V"); } else { helper.doCast(type); mv.visitFieldInsn(PUTSTATIC, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); } }