[Nestmates] Lambda proxy class should use invokeVirtual/invokeInterface when invoking a private nestmate instance method
Mandy Chung
mandy.chung at oracle.com
Fri Nov 16 21:09:16 UTC 2018
Hi Remi,
This patch should resolve the CNFE issue you run into. The nestmates
branch changes lambda metafactory to use Lookup::defineClass to define
the lambda proxy classes as a dynamic nestmate. The lambda proxy
class forwards to the call to the MethodHandle specified in the BSM for
the lambda expression. For a class that is compiled with javac prior to
the dynamic nestmate change and the lambda is an instance method, the
MethodHandle argument of the BSM entry is invokeSpecial a private
instance method [1]. The nestmates branch javac is updated to generate
invokeVirtual/invokeInterface MH to invoke a private nestmate instance
method.
Previously when defined as VM anonymous class, VM workarounds the
verifier invokespecial subtyping requirement. With Lookup::defineClass,
it follows the normal verification rules as it should and hence it fails
verification of the proxy class. So we need it to work with existing
compiled classes using lambdas.
The proposed fix is to generate invokeVirtual/invokeInterface if the
impl method is a private nestmate instance method.
http://cr.openjdk.java.net/~mchung/valhalla/webrevs/8171335/webrev-lambda-invokespecial
Mandy
[1] BSM with invokeSpecial a private instance method
0: #106 REF_invokeStatic
java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#107 ()Ljava/lang/Object;
#108 REF_invokeSpecial
org/junit/platform/launcher/core/ServiceLoaderTestEngineRegistry.lambda$loadTestEngines$0:(Ljava/lang/Iterable;)Ljava/lang/String;
#109 ()Ljava/lang/String;
More information about the valhalla-dev
mailing list