src/share/classes/java/lang/invoke/DirectMethodHandle.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/classes/java/lang/invoke/DirectMethodHandle.java	Tue Jul 15 17:49:27 2014
--- new/src/share/classes/java/lang/invoke/DirectMethodHandle.java	Tue Jul 15 17:49:27 2014

*** 140,188 **** --- 140,151 ---- @ForceInline MemberName internalMemberName() { return member; } @Override MethodHandle bindArgument(int pos, BasicType basicType, Object value) { // If the member needs dispatching, do so. if (pos == 0 && basicType == L_TYPE) { DirectMethodHandle concrete = maybeRebind(value); if (concrete != null) return concrete.bindReceiver(value); } return super.bindArgument(pos, basicType, value); } @Override MethodHandle bindReceiver(Object receiver) { // If the member needs dispatching, do so. DirectMethodHandle concrete = maybeRebind(receiver); if (concrete != null) return concrete.bindReceiver(receiver); return super.bindReceiver(receiver); } private static final MemberName.Factory IMPL_NAMES = MemberName.getFactory(); private DirectMethodHandle maybeRebind(Object receiver) { if (receiver != null) { switch (member.getReferenceKind()) { case REF_invokeInterface: case REF_invokeVirtual: // Pre-dispatch the member. Class<?> concreteClass = receiver.getClass(); MemberName concrete = new MemberName(concreteClass, member.getName(), member.getMethodType(), REF_invokeSpecial); concrete = IMPL_NAMES.resolveOrNull(REF_invokeSpecial, concrete, concreteClass); if (concrete != null) return new DirectMethodHandle(type(), preparedLambdaForm(concrete), concrete); break; } } return null; } /** * Create a LF which can invoke the given method. * Cache and share this structure among all methods with * the same basicType and refKind. */

src/share/classes/java/lang/invoke/DirectMethodHandle.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File