[foreign-memaccess] RFR 8226421: Remove LayoutPath API

Jorn Vernee jbvernee at xs4all.nl
Wed Jun 26 10:03:01 UTC 2019


On 2019-06-25 19:18, Maurizio Cimadamore wrote:
>>> The only advantage I see is that it's not possible to write an
>>> ill-formed path (e.g. `foo[bar]`) with the API-based approach because
>>> the API is itself the grammar. Of course you trade this advantage off
>>> with compactness.
>> 
>> Yes, I was thinking of ill-formed paths.
> Btw, an API approach is not 100% free from this issue either - in the
> sense that you can still do something like
> 
> groupElement("foo").sequenceElement()
> 
> And then detect that the layout associated with 'foo' is not that of a
> sequence layout.
> 
> So, I believe the only real advantage in the API approach is that it
> avoids error due to mis-spelling of a path expression (e.g. syntax
> errors) - but the semantics errors that can arise are the same I
> think.

Yes, sorry, I'm talking about syntax errors. It's a minor problem.

>> 
>>>> 
>> Sounds good! But how about doing CompoundLayout.Path? Since paths only 
>> really seem to be useful for CompoundLayouts (and CompoundLayout is 
>> pretty small any ways).
> 
> That's what I meant - I also put together a webrev here:
> 
> http://cr.openjdk.java.net/~mcimadamore/panama/8226421_v2/
> 
> Overall, I like it. It seems a tidy approach, and ones that scale
> well. I think there's also a way to share paths, but you need to think
> in terms of higher-order functions - e.g.
> 
> UnaryOperator<Path> pathToStruct = ...
> UnaryOperator<Path> pathToStructDotA = path ->
> pathToStruct.apply(path).groupElement("a");
> UnaryOperator<Path> pathToStructDotB = path ->
> pathToStruct.apply(path).groupElement("b");
> 
> And, this doesn't preclude the string-y path, if we really felt that
> usability was a concern - e.g. we could have a parser that turns a
> path expression string into an UnaryOperator<Path> and then take it
> from there.

I like this approach. I think the move to CompoundLayout.Path nicely 
shows where paths are useful. Compared to the string-y approach, I think 
it's a bit more robust.

About the patch:

In LayoutPathImpl.java
   - copyright was removed. I don't think that was intentional?
   - the 'enclosing' field is unused, so I guess that can be removed.
   - in sequenceElement(long), I think the check should be `index >= 
seq.elementsSize().getAsLong()`, i.e. using greater than.

Rest looks good.

Jorn

> Maurizio
> 
> 
>> 
>> Jorn
>> 
>>> Thoughts?
>>> 
>>> Maurizio
>>> 
>>> 
>>>> 
>>>> Jorn
>>>> 
>>>> On 2019-06-20 00:34, Maurizio Cimadamore wrote:
>>>>> Hi,
>>>>> now that we have combinators to create memory access handles, it 
>>>>> seems
>>>>> like there is less need to have a very rich API to describe layout
>>>>> paths. But, we still want some higher level way to create var 
>>>>> handles
>>>>> (or compute offsets) from a complex layout expression...
>>>>> 
>>>>> Chatting with Brian and John, an idea emerged - to use a simple
>>>>> grammar to describe a layout path.
>>>>> 
>>>>> For instance, if you have the usual array of struct we used in 
>>>>> other examples:
>>>>> 
>>>>> [ 5 : [ x32 i32(value) ] ]
>>>>> 
>>>>> A path from the outermost sequence to the 'value' layout element 
>>>>> can
>>>>> be described with the following string:
>>>>> 
>>>>> "[].value"
>>>>> 
>>>>> So, if we had a language to describe layout paths, we can replace 
>>>>> the
>>>>> LayoutPath API with some methods which take a path expression as
>>>>> argument.
>>>>> 
>>>>> This is the patch:
>>>>> 
>>>>> http://cr.openjdk.java.net/~mcimadamore/panama/8226421/
>>>>> 
>>>>> I think the results are quite pleasing, and more compact than 
>>>>> before.
>>>>> I also placed the VarHandle accessors where they belong - that is, 
>>>>> an
>>>>> accessor taking a path expression in CompoundLayout. And then one 
>>>>> that
>>>>> just takes a carrier in ValueLayout (as no selection is possible 
>>>>> from
>>>>> a leaf).
>>>>> 
>>>>> I think this takes care of the last 'shaky' abstraction in the 
>>>>> memory
>>>>> access API.
>>>>> 
>>>>> Impl-wise, the expression parser builds on some of the work we've 
>>>>> done
>>>>> in the foreign branch - I've added a test which checks several 
>>>>> 'bad'
>>>>> things that can happen during parsing.
>>>>> 
>>>>> I've also added a javadoc section on 'path expressions' - which 
>>>>> shows
>>>>> the full grammar production for the path expression language.
>>>>> 
>>>>> One thing that I removed in the process was the ability to refer to
>>>>> struct components by index - in part because it felt a bit 
>>>>> unjustified
>>>>> (for now, at least), in part because it also felt a bit shaky 
>>>>> (w.r.t.
>>>>> unions).
>>>>> 
>>>>> Cheers
>>>>> Maurizio


More information about the panama-dev mailing list