RI update: division of bridging responsibility between VM and compiler
Brian Goetz
brian.goetz at oracle.com
Wed May 8 13:21:52 PDT 2013
> I have a question, do we have an idea of the bridge methods that need to
> be included in java.util classes becaue we have added default methods on
> several interfaces ?
We don't, but we should be able to measure that pretty easily -- write
an ASM program to crawl the JDK and emit a diagnostic for every
ACC_BRIDGE method it finds.
> As I currently understand the problem, I don't think there will be much
> trouble for code that use the JDK.
> But for code like Guava collection that uses JDK interfaces and are used
> in application code, it will be more complex.
> That said I don't know if Guava introduces new interfaces that use
> covariant return type or bounded generics.
Constructs like:
interface FooPredicate extends Predicate<Foo> { ... }
seem likely enough in third party libraries. In this case, javac would
generate the bridge into FooPredicate at compile time.
>> Instead, we're now pursuing a path where we generate bridges into
>> interfaces (since we can do that now) using an algorithm very similar
>> to what we do with class bridges. We may need to extend the technique
>> of compiler-generated bridges with generating additional classfile
>> attributes that the VM might act on to avoid these anomalies,
>> currently being explored.
>
> I don't understand the last sentence ?
> The bridges are needed by the VM, so what's the point of having the VM
> ignore them ?
The fundamental problem that bridges address is: the notion of
inheritance implemented by the Java language and by the JVM are
different. What appears to be two methods to the JVM may or may not be
the "same" method in Java.
Bridges paper over this difference by generating bytecode that the VM
dumbly interprets. But if the VM *knew* that method A was a bridge for
method B, it could do a better job. For example, imagine a VM
implementation where the vtable contained MHs. Instead of building
bytecode for method A that just does a (potentially virtual) call to
method B, we could populate the slot for A with B.asType(A). This could
peel one layer off the call stack.
The last sentence was appealing to the notion that we could tag the
bridge method with an attribute that made its semantics scrutable to the
VM, so the VM could use this information to optimize. (Think "symlink").
We have no plans to act on this information immediately, but reifying
information about the difference between language-level inheritance and
VM-level inheritance seems better than throwing this information away
and then trying to reconstruct it.
More information about the lambda-spec-experts
mailing list