Jochen -- that comes tantalizingly close to making sense to me :-).  I
don't quite follow all of the terminology yet, but the basic idea that you
describe of chaining bootstrap calls is sort of like what I had vaguely
designed in my head.  Once I am doing learning how all this works I should
be able to make my language work just the way I hoped it would.

On Wed, Jun 24, 2015 at 10:16 AM, Jochen Theodorou <blackd...@gmx.org>
wrote:

> Hi Mike,
>
> First of all, the bootstrap method does not have to be in the same class.
> In Groovy we have for example one bootstrap method for all classes only. It
> is part of the runtime then you could say.
>
>
> We do it like this. We have two bootstrap methods in the Groovy runtime
> (you don't need to have them in the class). The first one is normally
> called and will produce a handle to call the second one. I tend to call the
> first one the static bootstrapper and the second one the dynamic
> bootstrapper. The dynamic bootstrapper will be called like a method (takes
> an Object[]), thus I will have all the arguments of the call as well as the
> receiver. This I can use to identify runtime classes and produce a new
> handle that fits my needs and replaces the first one. This method also is a
> fallback. The installed handle usually has to be guarded (like first call
> with B, second with C), and we use the dynamic bootstrapper as fallback. Of
> course you can easily check more cases and implement a polymorphic inline
> cache.
>
> Of course that implies, that if the dynamic bootstrapper is called it will
> also have to do the first execution of the target (like getting the value
> of the field foo). We use (part of) the produced method handle for this.
> And of course the callsite will have to be mutable then
>
> Does this help you out? It works quite good for Groovy.
>
> bye blackdrag
>
>
> Am 24.06.2015 14:19, schrieb Mike Jarmy:
>
>> 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
>>
>>
>
> --
> Jochen "blackdrag" Theodorou
> blog: http://blackdragsview.blogspot.com/
>
>
> _______________________________________________
> 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

Reply via email to