[foreign] RFR 8218153: Read/Write of Value layout should honor declared endianness

Henry Jen henry.jen at oracle.com
Wed Feb 27 03:03:50 UTC 2019


On Feb 26, 2019, at 4:07 PM, Maurizio Cimadamore <maurizio.cimadamore at oracle.com> wrote:
> 
> 
> On 26/02/2019 23:49, John Rose wrote:
>> On Feb 26, 2019, at 3:19 PM, Henry Jen <henry.jen at oracle.com> wrote:
>>> Also added a test  and localizeLayout() for group layouts, and a Util method when we need to convert no-endian to explicit endianness.
>> If localizeLayout is useful as a public API point it should be on the interface.
>> 
>> If not, it should be package-private or static in Util.
> 
> Actually - I was thinking about this: we have a 'withEndianness' in Value - I wonder if withEndianness should be in Layout (the root), and have @Overrides which do the right thing.
> 
> At which point, localize(Layout) can be simply expressed as Layout::withEndianness(Endianness.hostEndian())
> 

With an critical condition that endianness.isEmpty(), thus I think better to be explicit API rather than wirhEndianness(), which will override endianness.


> I'd suggest that withEndianness should alter endianness of existing layouts which do *not* have endianness, but should throw when changing endianness of something that already has an endianness of a different polarity.
> 

OK. But then we don’t have way to switch endianness, but that’s probably not much a valid use case?

> That is, this is a tool/API to add endianness info 'after the fact', which is useful especially when writing Layouts programmatically:
> 
> Sequence seq = Sequence.of(
>             Group.ofStruct(
>                    Value.ofSignedInt(32),
>                    Padding.of(8)
>                    Value.ofFloatingPoint(32),
>             ), 20); // [ 20 [ i32 x8 f32 ] ]
> 
> 
> Now, one way to add endianness would be to add explicit endianness to every Value factory call, but you can see how in composite layouts there's a risk this might not scale well - what, as the user, I'd like to be able to do, is just:
> 
> Sequence seq = .... some complex layout creation ...
>                              .withEndianness(Endianness.LE);
> 
> 
> And that will give me what I want - which preserves the readability of the original code, and the correctness of having explicit endianness everywhere, at the expense of creating a bunch of extra garbage for the GC which should hopefully be able to handle w/o too many headaches :-)
> 
> Maurizio
> 
>> 
>> In the present form, it seems like implementation is poking irregularly out of the API.
>> 
>> — John



More information about the panama-dev mailing list