diff --git a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java index 8a2b3b4df30..7cacfd39f62 100644 --- a/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java +++ b/src/java.base/share/classes/java/lang/foreign/MemoryLayout.java @@ -864,7 +864,8 @@ public sealed interface MemoryLayout static PathElement groupElement(String name) { Objects.requireNonNull(name); return new LayoutPath.PathElementImpl(PathKind.GROUP_ELEMENT, - path -> path.groupElement(name)); + path -> path.groupElement(name), + "groupElement(\"" + name + "\")"); } /** @@ -879,7 +880,8 @@ public sealed interface MemoryLayout throw new IllegalArgumentException("Index < 0"); } return new LayoutPath.PathElementImpl(PathKind.GROUP_ELEMENT, - path -> path.groupElement(index)); + path -> path.groupElement(index), + "groupElement(" + index + ")"); } /** @@ -894,7 +896,8 @@ public sealed interface MemoryLayout throw new IllegalArgumentException("Index must be positive: " + index); } return new LayoutPath.PathElementImpl(PathKind.SEQUENCE_ELEMENT_INDEX, - path -> path.sequenceElement(index)); + path -> path.sequenceElement(index), + "sequenceElement(" + index + ")"); } /** @@ -927,7 +930,8 @@ public sealed interface MemoryLayout throw new IllegalArgumentException("Step must be != 0: " + step); } return new LayoutPath.PathElementImpl(PathKind.SEQUENCE_RANGE, - path -> path.sequenceElement(start, step)); + path -> path.sequenceElement(start, step), + "sequenceElement(" + start + ", " + step + ")"); } /** @@ -940,7 +944,8 @@ public sealed interface MemoryLayout */ static PathElement sequenceElement() { return new LayoutPath.PathElementImpl(PathKind.SEQUENCE_ELEMENT, - LayoutPath::sequenceElement); + LayoutPath::sequenceElement, + "sequenceElement()"); } /** @@ -949,7 +954,8 @@ public sealed interface MemoryLayout */ static PathElement dereferenceElement() { return new LayoutPath.PathElementImpl(PathKind.DEREF_ELEMENT, - LayoutPath::derefElement); + LayoutPath::derefElement, + "dereferenceElement()"); } } diff --git a/src/java.base/share/classes/jdk/internal/foreign/LayoutPath.java b/src/java.base/share/classes/jdk/internal/foreign/LayoutPath.java index 53d306e4bc6..d389519a514 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/LayoutPath.java +++ b/src/java.base/share/classes/jdk/internal/foreign/LayoutPath.java @@ -389,10 +389,14 @@ public class LayoutPath { final PathKind kind; final UnaryOperator pathOp; + final String stringRepresentation; - public PathElementImpl(PathKind kind, UnaryOperator pathOp) { + public PathElementImpl(PathKind kind, + UnaryOperator pathOp, + String stringRepresentation) { this.kind = kind; this.pathOp = pathOp; + this.stringRepresentation = stringRepresentation; } @Override @@ -403,5 +407,10 @@ public class LayoutPath { public PathKind kind() { return kind; } + + @Override + public String toString() { + return stringRepresentation; + } } } diff --git a/test/jdk/java/foreign/TestLayoutPaths.java b/test/jdk/java/foreign/TestLayoutPaths.java index f04814f5849..c5eee36cd9c 100644 --- a/test/jdk/java/foreign/TestLayoutPaths.java +++ b/test/jdk/java/foreign/TestLayoutPaths.java @@ -311,6 +311,42 @@ public class TestLayoutPaths { assertEquals(actualByteOffset, expectedByteOffset); } + @Test + public void testGroupElementIndexToString() { + PathElement e = PathElement.groupElement(2); + assertEquals(e.toString(), "groupElement(2)"); + } + + @Test + public void testGroupElementNameToString() { + PathElement e = PathElement.groupElement("x"); + assertEquals(e.toString(), "groupElement(\"x\")"); + } + + @Test + public void testSequenceElementToString() { + PathElement e = PathElement.sequenceElement(); + assertEquals(e.toString(), "sequenceElement()"); + } + + @Test + public void testSequenceElementIndexToString() { + PathElement e = PathElement.sequenceElement(2); + assertEquals(e.toString(), "sequenceElement(2)"); + } + + @Test + public void testSequenceElementRangeToString() { + PathElement e = PathElement.sequenceElement(2, 4); + assertEquals(e.toString(), "sequenceElement(2, 4)"); + } + + @Test + public void testDerefereceElementToString() { + PathElement e = PathElement.dereferenceElement(); + assertEquals(e.toString(), "dereferenceElement()"); + } + @DataProvider public static Object[][] testLayouts() { List testCases = new ArrayList<>();