< prev index next >

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

Print this page

        

*** 169,178 **** --- 169,182 ---- 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; + // MemberName.getReferenceKind may be different to 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) --- 186,202 ---- if (which == LF_INVSTATIC && shouldBeInitialized(m)) { // precompute the barrier-free version: preparedLambdaForm(mtype, which); which = LF_INVSTATIC_INIT; } ! // Direct calls involving interfaces require additional specialization to add ! // in a receiver typecheck. For true invokespecial we need to inspect the callerClass ! // for being an interface (which implies REFC is also an interface). For invokeinterface ! // we always need the check. If the declaring class is an interface, and the method is not ! // static, then this must be an invokeinterface. ! if (which == LF_INVSPECIAL && ((callerClass != null && callerClass.isInterface()) || ! (!m.isStatic() && m.getDeclaringClass().isInterface()))) { which = LF_INVSPECIAL_IFC; } LambdaForm lform = preparedLambdaForm(mtype, which); maybeCompile(lform, m); assert(lform.methodType().dropParameterTypes(0, 1)
< prev index next >