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