[foreign] RFR 8218669: Flatten Reference hierarchy

Jorn Vernee jbvernee at xs4all.nl
Fri Feb 8 18:09:51 UTC 2019


Sorry, this has gotten out of scope of the review.

I think the code looks good, will run the tests as well.

Jorn

Jorn Vernee schreef op 2019-02-08 19:04:
> Maurizio Cimadamore schreef op 2019-02-08 18:30:
>> On 08/02/2019 16:41, Jorn Vernee wrote:
>>> Hi Maurizio,
>>> 
>>> The OfDouble reference no longer checks the size of the type to 
>>> determine how to get/set the value. It looks like that case was 
>>> already handled by LayoutType.ofDouble by using 
>>> References.OfLongDouble?
>> 
>> Yeah, not sure how that one got there. LayoutType::ofDouble creates
>> always the right reference (either OfDouble or OfLongDouble).
>> 
>> Do you agree that the code as written now should be good?
> 
> Yes, what you have now looks good to me as well. (I was curious)
> 
>>> 
>>> Should AbstractReference and Reference be merged as well? (and then 
>>> use pass up 'null' in OfGrumpy, since getter()/setter() throws any 
>>> ways)
>> 
>> Not sure I understand what you mean - but this seems 1-1 with that we 
>> had?
>> 
>> I don't think we want to stash the MHs in 'instance' fields, and then
>> have getter()/setter() return them - as that would be more opaque.
> 
> Sorry, I was looking at the wrong side of the diff for a second.
> (using sdiff, so sometimes one side of the diff gets pushed off
> screen).
> 
>>> 
>>> What about profile pollution in the case of struct & array types? It 
>>> looks like at least OfStruct could benefit from some specialization 
>>> per carrier type.
>> 
>> I think the tension there is that if you specialize by carrier, then
>> the MHs become less static (e.g. they end up depending on some
>> instance field of the reference), so not-so-constant from a VM
>> perspective (but perhaps @Stable could help).
> 
> I'm mostly looking at the reflective constructor call in
> OfStruct::get, as well as the fact that it's looking up the struct
> impl class. Afaik those lookups would only have to be done once. So I
> would construct the MethodHandle something like this:
> 
>         public static MethodHandle specializedGetter(Class<?> carrier) 
> {
>             Class<?> impl = 
> LibrariesHelper.getStructImplClass(carrier);
>             MethodHandles.Lookup lookup = MethodHandles.lookup();
>             try {
>                 MethodHandle cons =
> lookup.unreflectConstructor(impl.getConstructor(Pointer.class));
>                 MethodHandle check =
> lookup.findVirtual(BoundedPointer.class, "checkAlive",
> MethodType.methodType(void.class));
>                 check = check.asType(MethodType.methodType(void.class,
> Pointer.class));
>                 cons = MethodHandles.collectArguments(cons, 0, check);
>                 cons = MethodHandles.permuteArguments(cons,
> MethodType.methodType(impl, Pointer.class), 0, 0);
>                 return cons;
>             } catch (ReflectiveOperationException ex) {
>                 throw new IllegalStateException(ex);
>             }
>         }
> 
> So there is no reference to any fields, the values are just fixed into
> the returned MethodHandle as constants (right?). And then create such
> a method handle per carrier. (and maybe mark
> LayoutTypeImpl::refecrence field @Stable as well?)
> 
>> With arrays we could specialize by size. But for both I'm not 100%
>> clear of what the payoff would be. I'd prefer to keep these
>> refactorings limited to things that have come up in JMH runs. Profile
>> pollution with primitives was defo a problem (addressed by this
>> patch); it's likely there will be others, but proactively fix issues
>> w/o perf evidence to back things up could backfire.
> 
> Yes I agree with this. It would be nice to have a standard set of
> benchmarks in the repo to use for that. jdk/jdk recently had a
> benchmark suite added [1], could we take advantage of that
> infrastructure?
> 
> Thanks,
> Jorn
> 
> [1] : https://bugs.openjdk.java.net/browse/JDK-8050952
> 
>> Maurizio
>> 
>> 
>>> 
>>> Jorn
>>> 
>>> Maurizio Cimadamore schreef op 2019-02-08 13:12:
>>>> Hi,
>>>> this is a simple change which makes the Reference hierarchy in
>>>> References.java flatter and 1-1 with respect to the carrier it 
>>>> models.
>>>> 
>>>> Some internal testing of linkToNative pointed at profile pollution
>>>> because of multiple carriers using the same reference class (e.g.
>>>> OfPrimitive).
>>>> 
>>>> This patch does 3 things:
>>>> 
>>>> 1) Remove the intermediate AbstractReference class
>>>> 2) Create one reference class per carrier, and make all 
>>>> getter/setter
>>>> MH static constants
>>>> 3) Consolidate the code my moving the Reference interface inside 
>>>> References.
>>>> 
>>>> Webrev:
>>>> 
>>>> http://cr.openjdk.java.net/~mcimadamore/panama/8218669/
>>>> 
>>>> Cheers
>>>> Maurizio


More information about the panama-dev mailing list