Maurizio, > On 9 Jan 2020, at 14:36, Maurizio Cimadamore <maurizio.cimadam...@oracle.com> > wrote: > > Hi, > following the JEP 370 code review and CSR, certain comments that have not > been addressed have been added to the tracker issue: > > https://bugs.openjdk.java.net/browse/JDK-8235837 > > For further evaluation. After some discussion in the Panama channel (see [1] > and [2]), the Panama team has come to the following conclusions: > > * the MemoryAddress::offset(long) method should be renamed to > MemoryAddress::addOffset(long) > * the MemorySegment::isAccessible() predicate should be dropped and replaced > with the MemorySegment::ownerThread() accessor > * a new predicate should be added to MemoryLayout, namely > MemoryLayout::hasSize() to allow clients to establish as to whether a layout > contains some unsized parts > * a new method should be added to SequenceLayout, namely > SequenceLayout::withElementCount, to create a new sequence layout with new > element count > * 2 new helper methods should be added to MemoryLayout, namely: > - MemoryLayout::map - to allow transformation of a layout into a new > layout (by replacing the sub-layout at given path with a new layout) > - MemoryLayout::select - to allow selection of a sub-layout given a layout > path > > Overall, we think this set of change strikes a good compromise between > usability, readability and minimality. > > The javadoc for the layout path-accepting methods (both old and new ones) has > been significantly refactored and improved - and the toplevel javadoc section > on layout paths has been enhanced to cover all the concepts. The > implementation for these methods has also been consolidated greatly, which > revealed subtle bugs in the old implementation which have now been rectified > (new tests have been added). > > Webrev is available here: > > http://cr.openjdk.java.net/~mcimadamore/8235837/ > > Specdiff for changes here: > > http://cr.openjdk.java.net/~mcimadamore/8235837_specdiff/overview-summary.html
This mostly looks good. Some comments on the specification: Is the example in Layout paths right? long valueOffset = seq.offset(PathElement.sequenceElement(), PathElement.groupElement("value")); Doesn’t the sequence element need to have a specified position ( rather than an unspecified element )? MemoryLayout::offset - I find the throws clause hard to parse, maybe: UnsupportedOperationException - if a layout with an unknown size is encountered during traversal MemoryAddress::addOffset ( I like the name ) allows a negative value. I get the use case, so you can do: ms.baseAddress().offset(10).offset(-5) is equivalent to ms.baseAddress().offset(5) , but what if one does ms.baseAddress().offset(-11) ? Does addOffset need to throw an IAE? If so, then maybe it should be specified, otherwise what is the purpose of allowing the offset to go negative ( or even beyond the segments size? ) [ maybe we don’t care, since the bounds are checked during access operations ] SequenceLayout::withElementCount should probably specify IAE if given a negative elementCount, right? hasSize() - Suggest: "TELLS whether or not this layout has a KNOWN size".?? The reason I suggest “known” is that the class-level docs says that “all layouts have a size”, just that the size is not known for an unbound sequence layout. I would suggest a method name of “knownSize” or "sizeKnown", but that maybe a little too far? -Chris.