public void coerce(ClassNode from, ClassNode target) { if (from.isDerivedFrom(target)) return; MethodVisitor mv = controller.getMethodVisitor(); OperandStack os = controller.getOperandStack(); os.box(); (new ClassExpression(target)).visit(controller.getAcg()); os.remove(1); asTypeMethod.call(mv); BytecodeHelper.doCast(mv,target); os.replace(target); } }
/** * This converts sourceType to a non primitive by using Groovy casting. * sourceType might be a primitive * This might be done using SBA#castToType */ public void castToNonPrimitiveIfNecessary(final ClassNode sourceType, final ClassNode targetType) { OperandStack os = controller.getOperandStack(); ClassNode boxedType = os.box(); if (WideningCategories.implementsInterfaceOrSubclassOf(boxedType, targetType)) return; MethodVisitor mv = controller.getMethodVisitor(); if (ClassHelper.CLASS_Type.equals(targetType)) { castToClassMethod.call(mv); } else if (ClassHelper.STRING_TYPE.equals(targetType)) { castToStringMethod.call(mv); } else if (targetType.isDerivedFrom(ClassHelper.Enum_Type)) { (new ClassExpression(targetType)).visit(controller.getAcg()); os.remove(1); castToEnumMethod.call(mv); BytecodeHelper.doCast(mv, targetType); } else { (new ClassExpression(targetType)).visit(controller.getAcg()); os.remove(1); castToTypeMethod.call(mv); } }
ConstantExpression.NULL.visit(acg); } else { sender.visit(acg);
private void castToTypeIfNecessary(final ClassNode sourceType, final ClassNode targetType) { if (!sourceType.isDerivedFrom(targetType) && !sourceType.implementsInterface(targetType)) { MethodVisitor mv = controller.getMethodVisitor(); (new ClassExpression(targetType)).visit(controller.getAcg()); remove(1); castToTypeMethod.call(mv); } }
if (top.isDerivedFrom(targetType)) return; box(); (new ClassExpression(targetType)).visit(controller.getAcg()); remove(1); asTypeMethod.call(mv);
sender.visit(this);
sender.visit(this);
sender.visit(this);
ConstantExpression.NULL.visit(acg); } else { sender.visit(acg);