< prev index next >

src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java

Print this page

        

*** 82,104 **** } if (!member.isField()) { switch (refKind) { case REF_invokeSpecial: { member = member.asSpecial(); ! LambdaForm lform = preparedLambdaForm(member, callerClass); ! Class<?> checkClass = refc; // Class to use for receiver type check ! if (callerClass != null) { ! checkClass = callerClass; // potentially strengthen to caller class } ! return new Special(mtype, lform, member, checkClass); } case REF_invokeInterface: { ! LambdaForm lform = preparedLambdaForm(member, callerClass); return new Interface(mtype, lform, member, refc); } default: { ! LambdaForm lform = preparedLambdaForm(member, callerClass); return new DirectMethodHandle(mtype, lform, member); } } } else { LambdaForm lform = preparedFieldLambdaForm(member); --- 82,106 ---- } if (!member.isField()) { switch (refKind) { case REF_invokeSpecial: { member = member.asSpecial(); ! // if caller is an interface we need to adapt to get the ! // receiver check inserted ! if (callerClass == null) { ! throw new InternalError("callerClass must not be null for REF_invokeSpecial"); } ! LambdaForm lform = preparedLambdaForm(member, callerClass.isInterface()); ! return new Special(mtype, lform, member, callerClass); } case REF_invokeInterface: { ! // we always adapt 'special' when dealing with interfaces ! LambdaForm lform = preparedLambdaForm(member, true); return new Interface(mtype, lform, member, refc); } default: { ! LambdaForm lform = preparedLambdaForm(member); return new DirectMethodHandle(mtype, lform, member); } } } else { LambdaForm lform = preparedFieldLambdaForm(member);
*** 164,178 **** /** * Create a LF which can invoke the given method. * Cache and share this structure among all methods with * the same basicType and refKind. */ ! private static LambdaForm preparedLambdaForm(MemberName m, Class<?> callerClass) { assert(m.isInvocable()) : m; // call preparedFieldLambdaForm instead MethodType mtype = m.getInvocationType().basicType(); assert(!m.isMethodHandleInvoke()) : m; int which; switch (m.getReferenceKind()) { case REF_invokeVirtual: which = LF_INVVIRTUAL; break; case REF_invokeStatic: which = LF_INVSTATIC; break; case REF_invokeSpecial: which = LF_INVSPECIAL; break; case REF_invokeInterface: which = LF_INVINTERFACE; break; --- 166,184 ---- /** * Create a LF which can invoke the given method. * Cache and share this structure among all methods with * the same basicType and refKind. */ ! private static LambdaForm preparedLambdaForm(MemberName m, boolean adaptToSpecialIfc) { assert(m.isInvocable()) : m; // call preparedFieldLambdaForm instead MethodType mtype = m.getInvocationType().basicType(); assert(!m.isMethodHandleInvoke()) : m; int which; + // MemberName.getReferenceKind may be different from the 'kind' passed to + // DMH.make. Specifically private/final methods that use a direct call + // have been adapted to REF_invokeSpecial, even though the actual + // invocation mode may be invokevirtual or invokeinterface. switch (m.getReferenceKind()) { case REF_invokeVirtual: which = LF_INVVIRTUAL; break; case REF_invokeStatic: which = LF_INVSTATIC; break; case REF_invokeSpecial: which = LF_INVSPECIAL; break; case REF_invokeInterface: which = LF_INVINTERFACE; break;
*** 182,192 **** if (which == LF_INVSTATIC && shouldBeInitialized(m)) { // precompute the barrier-free version: preparedLambdaForm(mtype, which); which = LF_INVSTATIC_INIT; } ! if (which == LF_INVSPECIAL && callerClass != null && callerClass.isInterface()) { which = LF_INVSPECIAL_IFC; } LambdaForm lform = preparedLambdaForm(mtype, which); maybeCompile(lform, m); assert(lform.methodType().dropParameterTypes(0, 1) --- 188,198 ---- if (which == LF_INVSTATIC && shouldBeInitialized(m)) { // precompute the barrier-free version: preparedLambdaForm(mtype, which); which = LF_INVSTATIC_INIT; } ! if (which == LF_INVSPECIAL && adaptToSpecialIfc) { which = LF_INVSPECIAL_IFC; } LambdaForm lform = preparedLambdaForm(mtype, which); maybeCompile(lform, m); assert(lform.methodType().dropParameterTypes(0, 1)
*** 194,204 **** : Arrays.asList(m, m.getInvocationType().basicType(), lform, lform.methodType()); return lform; } private static LambdaForm preparedLambdaForm(MemberName m) { ! return preparedLambdaForm(m, null); } private static LambdaForm preparedLambdaForm(MethodType mtype, int which) { LambdaForm lform = mtype.form().cachedLambdaForm(which); if (lform != null) return lform; --- 200,210 ---- : Arrays.asList(m, m.getInvocationType().basicType(), lform, lform.methodType()); return lform; } private static LambdaForm preparedLambdaForm(MemberName m) { ! return preparedLambdaForm(m, false); } private static LambdaForm preparedLambdaForm(MethodType mtype, int which) { LambdaForm lform = mtype.form().cachedLambdaForm(which); if (lform != null) return lform;
< prev index next >