Multiple this$1 fields when mixing subclassing and inner classes
Stefan Reich
stefan.reich.maker.of.eye at googlemail.com
Mon Sep 9 23:30:06 UTC 2019
Oh, I didn't know about those JDK 11 changes. That may in fact break the
idea of merging the references. I'm sure it can still be done, but might
require a spec change. And who's gonna pay for that?
:-D
Thanks
On Tue, 10 Sep 2019 at 01:17, David Holmes <david.holmes at oracle.com> wrote:
> On 10/09/2019 9:09 am, Stefan Reich wrote:
> > But you're not talking about bytecode here you're talking about
> inside
> > the VM. If there is an invokespecial on this$1 of type A then the
> > constant pool lookup of its type will be A and we will resolve the
> call
> > based on A's methods. If it were of type B then the resolution
> process
> > would be different. There's nowhere to "insert a cast" here.
> >
> >
> > Can invokespecials on this$0/this$1 happen? I'm struggling to imagine a
> > case for this.
> >
> > invokespecial invokes private instance methods, superclass methods or
> > constructors. Superclass methods don't apply, neither do constructors.
> > And calls to private methods happen through bridges (just verified this
> > for myself again :):
> >
> > 13: aload_0
> > 14: getfield #1 // Field this$0:Lbla;
> > 17: invokestatic #4 // Method
> > bla.access$000:(Lbla;)V
> >
> > So what remains?
>
> This changed in JDK 11 with the addition of nestmates. Now inner classes
> have direct private access, no bridges needed, and we use invokespecial
> or invokevirtual as appropriate. For private methods invokevirtual is
> mainly used now, but of course we don't do virtual dispatch - there are
> special rules for private method resolution and selection.
>
> class A {
> void m() {}
> class InnerA {
> void callM() { m(); }
> }
> }
>
> void callM();
> descriptor: ()V
> flags: (0x0000)
> Code:
> stack=1, locals=1, args_size=1
> 0: aload_0
> 1: getfield #1 // Field this$0:LA;
> 4: invokevirtual #13 // Method A.m:()V
> 7: return
> LineNumberTable:
> line 4: 0
>
> > BTW what introspection tool did you use to show this?
> >
> > My own tools ("JavaX")... here's the example program:
> > http://code.botcompany.de/1025166
>
> Thanks for the pointer.
>
> Cheers,
> David
>
> > Many greetings :)
>
--
Stefan Reich
BotCompany.de // Java-based operating systems
More information about the hotspot-dev
mailing list