Classes, specializations, and statics
Remi Forax
forax at univ-mlv.fr
Tue Feb 23 19:56:55 UTC 2016
I wonder if it's not better to have a class like ThreadLocal or ClassValue that represents a constant that can be different depending on the specialization.
Rémi
----- Mail original -----
> De: "Brian Goetz" <brian.goetz at oracle.com>
> À: "Bjorn B Vardal" <bjornvar at ca.ibm.com>
> Cc: valhalla-spec-experts at openjdk.java.net
> Envoyé: Mardi 23 Février 2016 01:23:16
> Objet: Re: Classes, specializations, and statics
>
> It's possible that there could be multiple "ssinit" methods, each
> restricted to specific parameterizations (just like any other restricted
> method), but in general, the "ssinit" method can be specialized just
> like any other method. So what I envision (in the absence of
> initialization of conditional members) is possibly two such methods; one
> that is specializable (corresponding to _SS members) and one that is
> not, restricted to the erased parameterization (corresponding to
> traditional statics.)
>
>
>
> On 2/22/2016 4:11 PM, Bjorn B Vardal wrote:
> > I think we're on the same page regarding specialized <clinit>.
> > - The JVM will be handed multiple <clinit> partial methods, and the
> > specializer will take care of selecting the appropriate <clinit> for
> > each specialization.
> > - The erased <clinit> will contain the non-specialized static
> > initialization code, which ensures that it only runs once.
> > - The erased <clinit> will always run before the first specialization
> > <clinit>.
> > - The Java syntax is still up for discussion.
> > > I think this is mostly a matter of coming up with the right syntax,
> > which makes it clear that statics can be per-class or
> > per-specialization. There are a whole pile of related
> > specialization-related syntax issues, I'll try to get them all in one
> > place.
> > I don't think the problem will be to make it clear that statics can be
> > per-class or per-specialization, but rather why some parameterizations
> > (which to the user are synonymous with specializations) don't appear
> > to have specialized statics. Do we want to put erasure in the face of
> > users like this? It seems better to let the users deal purely with
> > parameterizations, and we let specialization and erasure be
> > implementation details.
> > --
> > Bjørn Vårdal
> >
> > ----- Original message -----
> > From: Brian Goetz <brian.goetz at oracle.com>
> > To: Bjorn B Vardal/Ottawa/IBM at IBMCA,
> > valhalla-spec-experts at openjdk.java.net
> > Cc:
> > Subject: Re: Classes, specializations, and statics
> > Date: Thu, Feb 18, 2016 7:55 PM
> >
> >
> >> Based on the example above, I think we need to be more explicit
> >> about how the <clinit> method is handled.
> >> There are really two different sets of statics that need to be
> >> handled by the class initialization:
> >> A) common statics (shared across all instantiations)
> >> B) specialized statics
> >> In addition to the statics, there is also common (and maybe
> >> specialized?) code that is run as part of <clinit>.
> >
> > There is a reasonable model to collapse these back into one
> > concept; treat "common statics" as specialized statics on the
> > all-erased parameterization, with a <where> clause that restricts
> > them to that parameterization. Not clear whether we actually want
> > to represent it that way or not, but its a useful mental model
> > that doesn't require the creation of a third thing. (Since
> > Class[Foo] and ParamType[Foo,erased*] describe the same class,
> > this is also fully binary compatible with existing classes.)
> >
> > Which means we can do a similar thing with <clinit>, if we want.
> > I'll wave my hands because we've not yet talked much about
> > conditional members, but it basically looks like this:
> >
> > <where T*=erased*>
> > <init>() { /* common static init code */
> > /* specializable init code */ }
> >
> > <init>() { /* specializable init code */ }
> >
> > Or not.
> >> Where will the initialization code for both kinds of statics be?
> >> The existing <clinit> method?
> >
> > We have two choices:
> > - have a new <sclinit> block that gets run once per
> > specialization, and keep <clinit>
> > - merge the two as above, exploiting planned support for
> > conditional members
> >
> > Either way, as you say, we have to ensure that the common init
> > runs exactly once.
> >> When using *static, are we only discussing {get,put}? Or is this
> >> also proposing invokestatic changes to allow specialized static
> >> methods?
> >
> > Methods too.
> >> All of the technical details aside, is this something we really
> >> want to expose to the users? They're going to have a hard time
> >> understanding why Foo<int> (or Foo<ValueType) gets specialized
> >> statics while Foo<String> & Foo<Bar> share the erased version.
> >
> > I think this is mostly a matter of coming up with the right
> > syntax, which makes it clear that statics can be per-class or
> > per-specialization. There are a whole pile of related
> > specialization-related syntax issues, I'll try to get them all in
> > one place.
> >
> >
>
>
More information about the valhalla-spec-observers
mailing list