Static fields in specialized classes
Brian Goetz
brian.goetz at oracle.com
Mon Oct 13 18:19:47 UTC 2014
We stumbled across a few issues regarding static fields in specialized
classes in the prototype. There seems to be a reasonably
straightforward solution but it does touch quite a number of things.
Consider:
class Foo<any T> {
public final static int x = System.currentTimeMillis();
}
Regardless of whether our implementation is by specialization or erasure
(or both), logically there is just *one* field 'x' for any instantiation
Foo<T>.
If we take a naive approach to specialization, where we just copy
members from Foo<any T> to Foo<int> during specialization, we end up
with two 'x' fields (wrong). So the specializer should strip out static
members during specialization. (If the base class has static members,
we also need to add back a clinit member in Foo<int> to force loading of
base Foo, to ensure that all instantiations of Foo<any T> have a
consistent view of Foo's statics.) So then we're done.
Except for access through instances (yechh). Here, the compiler needs
to rewrite any references to f.x (where f is an instance of a
specialization of Foo) to Foo.x, and we're done.
Except for access control; if x is private, then we get an
IllegalAccessError on any references to x from within Foo<int> to Foo.x.
Which means that Foo<int> has to be loaded as if with a host class of
Foo. (Just as defineAnonymousClass supports a host class, classdynamic
will need to as well.) So then we're done.
Except for reflection; reflection on Foo<int>.class should still show
that it has the same static members as Foo, and in fact they *are* the
same static members. So then we're done.
Except for MH lookup. Will need to fix that up too.
Any others?
More information about the valhalla-dev
mailing list