}
mv.label(done);
}
static void emitToNativeConversion(AsmBuilder builder, SkinnyMethodAdapter mv, ToNativeType toNativeType) {
ToNativeConverter parameterConverter = toNativeType.getToNativeConverter();
if (parameterConverter != null) {
Method toNativeMethod = getToNativeMethod(toNativeType, builder.getClassLoader());
if (toNativeType.getDeclaredType().isPrimitive()) {
boxValue(builder, mv, getBoxedClass(toNativeType.getDeclaredType()), toNativeType.getDeclaredType());
}
if (!toNativeMethod.getParameterTypes()[0].isAssignableFrom(getBoxedClass(toNativeType.getDeclaredType()))) {
mv.checkcast(toNativeMethod.getParameterTypes()[0]);
}
mv.aload(0);
AsmBuilder.ObjectField toNativeConverterField = builder.getToNativeConverterField(parameterConverter);
mv.getfield(builder.getClassNamePath(), toNativeConverterField.name, ci(toNativeConverterField.klass));
if (!toNativeMethod.getDeclaringClass().equals(toNativeConverterField.klass)) {
mv.checkcast(toNativeMethod.getDeclaringClass());
}
// Re-order so the value to be converted is on the top of the stack
mv.swap();
// load context parameter (if there is one)
if (toNativeType.getToNativeContext() != null) {
getfield(mv, builder, builder.getToNativeContextField(toNativeType.getToNativeContext()));
} else {
mv.aconst_null();
}
if (toNativeMethod.getDeclaringClass().isInterface()) {
mv.invokeinterface(toNativeMethod.getDeclaringClass(), toNativeMethod.getName(),
toNativeMethod.getReturnType(), toNativeMethod.getParameterTypes());
} else {
mv.invokevirtual(toNativeMethod.getDeclaringClass(), toNativeMethod.getName(),
toNativeMethod.getReturnType(), toNativeMethod.getParameterTypes());
}
if (!parameterConverter.nativeType().isAssignableFrom(toNativeMethod.getReturnType())) {
mv.checkcast(p(parameterConverter.nativeType()));
}
}
}