예제 #1
0
 private boolean returnConversionNeeded(MethodType callerType, MethodHandle target) {
   Class<?> needType = callerType.returnType();
   if (needType == erasedCallerType.returnType())
     return false; // no conversions possible, since must be primitive or Object
   Class<?> haveType = target.type().returnType();
   if (VerifyType.isNullConversion(haveType, needType) && !needType.isInterface()) return false;
   return true;
 }
예제 #2
0
 private MethodHandle addReturnConversion(MethodHandle finisher, Class<?> type) {
   // FIXME: This is slow because it creates a closure node on every call that requires a return
   // cast.
   MethodType finisherType = finisher.type();
   MethodHandle caster = ValueConversions.identity(type);
   caster = caster.asType(caster.type().changeParameterType(0, finisherType.returnType()));
   finisher = MethodHandles.filterReturnValue(finisher, caster);
   return finisher.asType(finisherType);
 }
예제 #3
0
 private boolean returnConversionPossible() {
   Class<?> needType = erasedCallerType.returnType();
   return !needType.isPrimitive();
 }
예제 #4
0
 private MethodHandle dispatchWithConversion(MethodType callerType, MethodHandle target) {
   MethodHandle finisher = dispatch(callerType, target);
   if (returnConversionNeeded(callerType, target))
     finisher = addReturnConversion(finisher, callerType.returnType()); // FIXME: slow
   return finisher;
 }