New candidate JEP: 371: Hidden Classes
Remi Forax
forax at univ-mlv.fr
Mon Jan 27 14:31:38 UTC 2020
----- Mail original -----
> De: "David Lloyd" <david.lloyd at redhat.com>
> À: "David Holmes" <david.holmes at oracle.com>
> Cc: "hotspot-dev" <hotspot-dev at openjdk.java.net>, "core-libs-dev" <core-libs-dev at openjdk.java.net>
> Envoyé: Lundi 27 Janvier 2020 14:56:57
> Objet: Re: New candidate JEP: 371: Hidden Classes
> On Fri, Jan 24, 2020 at 4:56 PM David Holmes <david.holmes at oracle.com> wrote:
>>
>> FYI.
>
> I'm a bit curious about this:
>
>> To invoke private nestmate instance methods from code in the hidden class, use
>> invokevirtual or invokeinterface instead of invokespecial. Generated bytecode
>> that uses invokespecial to invoke a private nestmate instance method will fail
>> verification. invokespecial should only be used to invoke private nestmate
>> constructors.
>
> This seems pretty unusual. Don't we normally use invokespecial for
> private method invocations? What is the reasoning for this?
It's the new usual since 11 and the introduction of nestmates,
before javac was generating an accessor method (the access$000 methods).
class Foo {
private void privateMethod() {
}
public static class Bar {
public void m() {
new Foo().privateMethod();
}
}
public static void main(String[] args) {
new Bar().m();
}
}
The bytecode of 'm()' is
public void m();
Code:
0: new #7 // class Foo
3: dup
4: invokespecial #9 // Method Foo."<init>":()V
7: invokevirtual #10 // Method Foo.privateMethod:()V
10: return
When calling a method (this is different for constructor), invokespecial semantics has no been extended to be able to call private method of classes of the same nest, only invokevirtual/invokeinterface and invokestatic have that capability.
The reason is that invokespecial semantics is already a patchwork of several semantics, you can call a constructor, a private method of the same class and a method of the super class and each semantics has it's own verification rule.
Given that invokevirtual already had to be extended, adding a new mode for invokespecial was not necessary.
As a trivia, if you take a look to the dex file used by Android, the opcode invokespecial doesn't exist, instead you have several other opcodes, one for each semantics.
>
> --
> - DML
Rémi
More information about the hotspot-dev
mailing list