From 8dc2d9280e9d100374a6e33b5d32905bc909a52d Mon Sep 17 00:00:00 2001 From: Per Minborg Date: Fri, 15 Sep 2023 05:43:57 +0000 Subject: [PATCH] 8316190: Improve MemorySegment::toString Reviewed-by: rriggs --- .../foreign/AbstractMemorySegmentImpl.java | 6 +++++- .../classes/jdk/internal/foreign/Utils.java | 5 +++++ test/jdk/java/foreign/TestSegments.java | 17 ++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java index fc56785ce07..c2c3ef3da18 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java +++ b/src/java.base/share/classes/jdk/internal/foreign/AbstractMemorySegmentImpl.java @@ -505,7 +505,11 @@ public abstract sealed class AbstractMemorySegmentImpl @Override public String toString() { - return "MemorySegment{ heapBase: " + heapBase() + " address: 0x" + Long.toHexString(address()) + " byteSize: " + length + " }"; + return "MemorySegment{ " + + heapBase().map(hb -> "heapBase: " + hb + ", ").orElse("") + + "address: " + Utils.toHexString(address()) + + ", byteSize: " + length + + " }"; } @Override diff --git a/src/java.base/share/classes/jdk/internal/foreign/Utils.java b/src/java.base/share/classes/jdk/internal/foreign/Utils.java index ca1a6941530..3e8f012891e 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/Utils.java +++ b/src/java.base/share/classes/jdk/internal/foreign/Utils.java @@ -273,4 +273,9 @@ public final class Utils { public static boolean containsNullChars(String s) { return s.indexOf('\u0000') >= 0; } + + public static String toHexString(long value) { + return "0x" + Long.toHexString(value); + } + } diff --git a/test/jdk/java/foreign/TestSegments.java b/test/jdk/java/foreign/TestSegments.java index b2cd0d5557a..f8f5a2b0896 100644 --- a/test/jdk/java/foreign/TestSegments.java +++ b/test/jdk/java/foreign/TestSegments.java @@ -225,6 +225,21 @@ public class TestSegments { assertTrue(segment.isAccessibleBy(new Thread()) != isConfined); } + @Test(dataProvider = "segmentFactories") + public void testToString(Supplier segmentSupplier) { + var segment = segmentSupplier.get(); + String s = segment.toString(); + assertTrue(s.startsWith("MemorySegment{")); + assertTrue(s.contains("address: 0x")); + assertTrue(s.contains("byteSize: ")); + if (segment.heapBase().isPresent()) { + assertTrue(s.contains("heapBase: [")); + } else { + assertFalse(s.contains("heapBase: ")); + } + assertFalse(s.contains("Optional")); + } + @DataProvider(name = "segmentFactories") public Object[][] segmentFactories() { List> l = List.of( @@ -233,7 +248,7 @@ public class TestSegments { () -> MemorySegment.ofArray(new double[] { 1d, 2d, 3d, 4d} ), () -> MemorySegment.ofArray(new float[] { 1.0f, 2.0f, 3.0f, 4.0f }), () -> MemorySegment.ofArray(new int[] { 1, 2, 3, 4 }), - () -> MemorySegment.ofArray(new long[] { 1l, 2l, 3l, 4l } ), + () -> MemorySegment.ofArray(new long[] { 1L, 2L, 3L, 4L } ), () -> MemorySegment.ofArray(new short[] { 1, 2, 3, 4 } ), () -> Arena.ofAuto().allocate(4L, 1), () -> Arena.ofAuto().allocate(4L, 8),