On 12/08/2010 11:18 PM, Toby Reyelts wrote:
Hi Toby,
First let me say that I'm a big fan of Retroweaver.
I'm interested in understanding where Java language support is going
for InvokeDynamic. The context is that I'd like to replace a system
that forward-generates API with a system based on InvokeDynamic. Silly
hypothetical example follows:
// colors.prop
color1: Red
color2: Green
preprocessor < colors.prop > Colors.java
// generated API
class Colors {
Color color1() { return Color.red; }
Color color2() { return Color.green; }
}
You get the benefits of static analysis (type-errors, code-completion,
etc), but you have messy pre-processing / multi-staged compilation to
deal with.
One possible example of what I'd like to be able to do:
Dynamic colors = ColorFactory.create("colors.prop");
Color red = colors.color1();
Color green = colors.color2();
With the right tooling support, I think I could provide the same kinds
of static analysis benefits without the messiness of the preprocessor.
I don't know a ton about C#, but I believe that this looks fairly
achievable with the "dynamic" type.
I don't get it. You want to do a static analysis and for that you want
to use the 'dynamic' type.
Hugh ?
Your code above is mostly valid in C# but the dynamic invocation is done
by the compiler. So if you take a to the corresponding bytecode,
it's something like this:
Object colors;
SiteContainer0.site1.bind(null, new Object[]{"colors.prop"}, ...,
&colors); // call create
Object tmp1;
SiteContainer0.site2.bind(colors, new Object[]{}, ..., &tmp1); // get
attribute color1
Object red;
SiteContainer0.site2.bind(tmp1, new Object[]{}, ..., &red); // convert
to color
...
As you see, the generated code is not usable to do a static analysis.
I've already read through the coin proposal
<http://wikis.sun.com/display/mlvm/InterfaceDynamic> and
InterfaceDynamic
<http://wikis.sun.com/display/mlvm/InterfaceDynamic>. My understanding
is that there is no language support at all for JDK 7 (correct?), but
I've been playing around with the jdk7 compiler which does support the
InvokeDynamic static call syntax. Unlike C#'s dynamic, it seems like
there are a lot of barriers to making the above syntax work with (the
proposed) Java language support.
That's correct there is no equivalent of dynamic in Java.
Not because it's useless but because it's hard to do it right.
Examples I ran into with a couple of hours of playing:
1) You have to apply @BootstrapMethod to every class.
2) InvokeDynamic invocations are static.
3) InvokeDynamic calls all throw Throwable.
latest spec doesn't use @BootstrapMethod anymore.
2) and 3) are still valid.
These are all deal breakers when it comes to users using InvokeDynamic
directly. Essentially, the current picture I'm seeing is that the
planned language support isn't useful at all in API, as compared to
implementation for alternate language runtimes. I realize that's the
primary usecase, but it feels like we're missing out on a lot that
invokedynamic could do for us. Are there any plans to provide anything
in that direction?
Not now.
As I said, dynamic is useless for what you want to do.
Rémi
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev