[foreign] RFR 8218669: Flatten Reference hierarchy

Jorn Vernee jbvernee at xs4all.nl
Fri Feb 8 19:58:29 UTC 2019


Tests pass on my machine as well.

Cheers,
Jorn

Jorn Vernee schreef op 2019-02-08 19:09:
> 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