I've gotten this working with a simplified version of the inlining cache in Remi's cookbook. Thanks guys.
Performance is about twice as slow as invokevirtual, which I am really pleased with. On Wed, Jun 24, 2015 at 9:53 AM, Rémi Forax <fo...@univ-mlv.fr> wrote: > Hi Mike, > i've compiled a small list of patterns, > https://code.google.com/p/jsr292-cookbook/ > > take a look to the first inlining cache example. > > cheers, > Rémi > > Le 24 juin 2015 14:19:32 CEST, Mike Jarmy <mja...@gmail.com> a écrit : > >I've been experimenting with invokedynamic in a compiler for a dynamic > >language > >that I'm working on, and I've run into a problem that I'm having > >difficulty > >solving. > > > >Let's say I have a class called A (Java syntax used for clarity): > > > > public class A { > > } > > > >And another called B, that is a subclass of A: > > > > public class B extends A { > > public Value foo; > > public Value bar; > > } > > > >There will be lots of other subclasses of A as well (let's call them C, > >D, > >E, > >etc), some of which will have a field called foo, and some of which > >won't. > >The > >class A will never have any fields -- its sole purpose is to be the > >base > >class > >of everything else. > > > >I have been able to successfully use a static bootstrap method in B, so > >that I > >can compile a call to invokedynamic on the imaginary method get_foo() > >of an > >instance of B, and then reroute the call inside B's bootstrap method > >via > >MethodHandles.Lookup.findGetter(), and finally return the current value > >of > >foo. > >So far, so good. > > > >However, at the place where I am compiling the invokedynamic > >instruction, I > >have no idea if the target is a B, C, D, or what. All I know is that > >it > >must > >be an A. > > > >So what I really want to be able to do (I think) is to use a static > >bootstrap > >method in A. I want get_foo() to succeed for every invokedynamic call > >to an > >instance of A who's *subclass* really does have a field called foo. > > > >Unfortunately there doesn't seem to be a way to make A do what I want. > >I > >understand why that is -- foo doesn't exist in A, so there is no way to > >create > >a findGetter() call. But I'm hoping there might be some clever way to > >do it > >anyway. I've tried all kinds of different approaches (making yet > >another > >invokedynamic call from inside A, etc, etc) but I can't come up with > >anything > >that works. > > > >Any ideas? > > > >By the way, I've figured out how to do this the "old" way, by > >generating > >interfaces for each class that has e.g. a foo field, and casting to > >that > >interface every time I compile a get_foo() invocation. This works, and > >its > >reasonably performant, but using invokedynamic seems like it would be a > >more > >elegant and flexible solution. > > > > > >------------------------------------------------------------------------ > > > >_______________________________________________ > >mlvm-dev mailing list > >mlvm-dev@openjdk.java.net > >http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev > >
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev