public void doCast(BytecodeHelper helper) { helper.doCast(getTheClass()); }
public static void genLoadParametersDirect(int argumentIndex, MethodVisitor mv, BytecodeHelper helper, Method method) { Class<?>[] parameters = method.getParameterTypes(); int size = parameters.length; for (int i = 0; i < size; i++) { mv.visitVarInsn(Opcodes.ALOAD, argumentIndex+i); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i]; if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(type); } } }
public void doCast(BytecodeHelper helper) { helper.doCast(getTheClass()); }
public void doCast(BytecodeHelper helper) { helper.doCast(getTheClass()); }
public static void genLoadParametersDirect(int argumentIndex, MethodVisitor mv, BytecodeHelper helper, Method method) { Class<?>[] parameters = method.getParameterTypes(); int size = parameters.length; for (int i = 0; i < size; i++) { mv.visitVarInsn(Opcodes.ALOAD, argumentIndex+i); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i]; if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(type); } } }
public static void genLoadParameters(int argumentIndex, MethodVisitor mv, BytecodeHelper helper, Method method) { Class<?>[] parameters = method.getParameterTypes(); int size = parameters.length; for (int i = 0; i < size; i++) { // unpack argument from Object[] mv.visitVarInsn(Opcodes.ALOAD, argumentIndex); helper.pushConstant(i); mv.visitInsn(Opcodes.AALOAD); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i]; if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(type); } } }
public static void genLoadParameters(int argumentIndex, MethodVisitor mv, BytecodeHelper helper, Method method) { Class<?>[] parameters = method.getParameterTypes(); int size = parameters.length; for (int i = 0; i < size; i++) { // unpack argument from Object[] mv.visitVarInsn(Opcodes.ALOAD, argumentIndex); helper.pushConstant(i); mv.visitInsn(Opcodes.AALOAD); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i]; if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(type); } } }
protected static void loadParameters(CachedMethod method, int argumentIndex, MethodVisitor mv) { CachedClass[] parameters = method.getParameterTypes(); int size = parameters.length-1; for (int i = 0; i < size; i++) { // unpack argument from Object[] mv.visitVarInsn(ALOAD, argumentIndex); helper.pushConstant(i); mv.visitInsn(AALOAD); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i+1].getTheClass(); if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(type); } } } }
protected static void loadParameters(CachedMethod method, int argumentIndex, MethodVisitor mv) { CachedClass[] parameters = method.getParameterTypes(); int size = parameters.length-1; for (int i = 0; i < size; i++) { // unpack argument from Object[] mv.visitVarInsn(ALOAD, argumentIndex); helper.pushConstant(i); mv.visitInsn(AALOAD); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i+1].getTheClass(); if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(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)); } }
protected void loadParameters(CachedMethod method, int argumentIndex, MethodVisitor mv) { CachedClass[] parameters = method.getParameterTypes(); int size = parameters.length; for (int i = 0; i < size; i++) { // unpack argument from Object[] mv.visitVarInsn(ALOAD, argumentIndex); helper.pushConstant(i); mv.visitInsn(AALOAD); // cast argument to parameter class, inclusive unboxing // for methods with primitive types Class type = parameters[i].getTheClass(); if (type.isPrimitive()) { helper.unbox(type); } else { helper.doCast(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 storeThisInstanceField(FieldExpression expression) { FieldNode field = expression.getField(); boolean holder = field.isHolder() && !isInClosureConstructor(); ClassNode type = field.getType(); String ownerName = (field.getOwner().equals(classNode)) ? internalClassName : BytecodeHelper.getClassInternalName(field.getOwner()); if (holder) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, ownerName, expression.getFieldName(), BytecodeHelper.getTypeDescription(type)); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "groovy/lang/Reference", "set", "(Ljava/lang/Object;)V"); } else { if (isInClosureConstructor()) { helper.doCast(type); } else if (!ClassHelper.isPrimitiveType(type)) { doConvertAndCast(type); } mv.visitVarInsn(ALOAD, 0); //helper.swapObjectWith(type); mv.visitInsn(SWAP); helper.unbox(type); helper.putField(field, ownerName); } }
protected void doConvertAndCast(ClassNode type, boolean coerce) { if (type == ClassHelper.OBJECT_TYPE) return; if (rightHandType == null || !rightHandType.isDerivedFrom(type) || !rightHandType.implementsInterface(type)) { if (isValidTypeForCast(type)) { visitClassExpression(new ClassExpression(type)); if (coerce) { asTypeMethod.call(mv); } else { castToTypeMethod.call(mv); } } } helper.doCast(type); }
protected void doConvertAndCast(ClassNode type, boolean coerce) { if (type == ClassHelper.OBJECT_TYPE) return; if (rightHandType == null || !rightHandType.isDerivedFrom(type) || !rightHandType.implementsInterface(type)) { if (isValidTypeForCast(type)) { visitClassExpression(new ClassExpression(type)); if (coerce) { asTypeMethod.call(mv); } else { castToTypeMethod.call(mv); } } } helper.doCast(type); }
protected void doConvertAndCast(ClassNode type, boolean coerce) { if (type == ClassHelper.OBJECT_TYPE) return; if (rightHandType == null || !rightHandType.isDerivedFrom(type) || !rightHandType.implementsInterface(type)) { if (isValidTypeForCast(type)) { visitClassExpression(new ClassExpression(type)); if (coerce) { asTypeMethod.call(mv); } else { castToTypeMethod.call(mv); } } } helper.doCast(type); }
public void visit(MethodVisitor mv) { BytecodeHelper helper = new BytecodeHelper(mv); mv.visitVarInsn(ALOAD,0); Parameter[] para = oldMethod.getParameters(); Parameter[] goal = overridingMethod.getParameters(); for (int i = 0; i < para.length; i++) { helper.load(para[i].getType(), i+1); if (!para[i].getType().equals(goal[i].getType())) { helper.doCast(goal[i].getType()); } } mv.visitMethodInsn( INVOKEVIRTUAL, BytecodeHelper.getClassInternalName(classNode), overridingMethod.getName(), BytecodeHelper.getMethodDescriptor(overridingMethod.getReturnType(), overridingMethod.getParameters())); helper.doReturn(oldMethod.getReturnType()); } }
public void visit(MethodVisitor mv) { BytecodeHelper helper = new BytecodeHelper(mv); mv.visitVarInsn(ALOAD,0); Parameter[] para = oldMethod.getParameters(); Parameter[] goal = overridingMethod.getParameters(); for (int i = 0; i < para.length; i++) { helper.load(para[i].getType(), i+1); if (!para[i].getType().equals(goal[i].getType())) { helper.doCast(goal[i].getType()); } } mv.visitMethodInsn( INVOKEVIRTUAL, BytecodeHelper.getClassInternalName(classNode), overridingMethod.getName(), BytecodeHelper.getMethodDescriptor(overridingMethod.getReturnType(), overridingMethod.getParameters())); helper.doReturn(oldMethod.getReturnType()); } }
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 visit(MethodVisitor mv) { BytecodeHelper helper = new BytecodeHelper(mv); mv.visitVarInsn(ALOAD,0); Parameter[] para = oldMethod.getParameters(); Parameter[] goal = overridingMethod.getParameters(); for (int i = 0; i < para.length; i++) { helper.load(para[i].getType(), i+1); if (!para[i].getType().equals(goal[i].getType())) { helper.doCast(goal[i].getType()); } } mv.visitMethodInsn( INVOKEVIRTUAL, BytecodeHelper.getClassInternalName(classNode), overridingMethod.getName(), BytecodeHelper.getMethodDescriptor(overridingMethod.getReturnType(), overridingMethod.getParameters())); helper.doReturn(oldMethod.getReturnType()); } }