diff --git a/src/java.base/share/classes/jdk/internal/foreign/StringSupport.java b/src/java.base/share/classes/jdk/internal/foreign/StringSupport.java index 8527d374fb2..b74d09be0dd 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/StringSupport.java +++ b/src/java.base/share/classes/jdk/internal/foreign/StringSupport.java @@ -82,7 +82,7 @@ public final class StringSupport { private static void writeShort(MemorySegment segment, long offset, Charset charset, String string) { int bytes = copyBytes(string, segment, charset, offset); - segment.set(JAVA_SHORT, offset + bytes, (short)0); + segment.set(JAVA_SHORT_UNALIGNED, offset + bytes, (short)0); } private static String readInt(MemorySegment segment, long offset, Charset charset) { @@ -94,7 +94,7 @@ public final class StringSupport { private static void writeInt(MemorySegment segment, long offset, Charset charset, String string) { int bytes = copyBytes(string, segment, charset, offset); - segment.set(JAVA_INT, offset + bytes, 0); + segment.set(JAVA_INT_UNALIGNED, offset + bytes, 0); } /** @@ -222,7 +222,7 @@ public final class StringSupport { int offset = 0; for (; offset < headCount; offset += Short.BYTES) { - short curr = segment.get(JAVA_SHORT, start + offset); + short curr = segment.get(JAVA_SHORT_UNALIGNED, start + offset); if (curr == 0) { return offset; } diff --git a/test/jdk/java/foreign/TestStringEncoding.java b/test/jdk/java/foreign/TestStringEncoding.java index c4eeae8ea3e..4caef6fbd09 100644 --- a/test/jdk/java/foreign/TestStringEncoding.java +++ b/test/jdk/java/foreign/TestStringEncoding.java @@ -22,8 +22,6 @@ * */ -import java.io.IOException; -import java.io.RandomAccessFile; import java.lang.foreign.Arena; import java.lang.foreign.FunctionDescriptor; import java.lang.foreign.Linker; @@ -33,16 +31,12 @@ import java.lang.foreign.SegmentAllocator; import java.lang.foreign.ValueLayout; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; -import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; -import java.util.function.Consumer; import java.util.function.UnaryOperator; import jdk.internal.foreign.StringSupport; @@ -333,6 +327,27 @@ public class TestStringEncoding { } } + @Test(dataProvider = "charsetsAndSegments") + public void testStringGetWithCharset(Charset charset, MemorySegment segment) { + for (int offset = 0 ; offset < Long.BYTES ; offset++) { + segment.getString(offset, charset); + } + } + + @Test(dataProvider = "charsetsAndSegments") + public void testStringSetWithCharset(Charset charset, MemorySegment segment) { + for (int offset = 0 ; offset < Long.BYTES ; offset++) { + segment.setString(offset, "H", charset); + } + } + + @Test(dataProvider = "charsetsAndSegments") + public void testStringAllocateFromWithCharset(Charset charset, MemorySegment segment) { + for (int offset = 0 ; offset < Long.BYTES ; offset++) { + SegmentAllocator.prefixAllocator(segment.asSlice(offset)).allocateFrom("H", charset); + } + } + @DataProvider public static Object[][] strings() { return new Object[][]{ @@ -361,7 +376,7 @@ public class TestStringEncoding { .allMatch(c -> Character.isLetterOrDigit((char) c)); } - boolean isStandard(Charset charset) { + static boolean isStandard(Charset charset) { for (Field standardCharset : StandardCharsets.class.getDeclaredFields()) { try { if (standardCharset.get(null) == charset) { @@ -374,9 +389,9 @@ public class TestStringEncoding { return false; } - List standardCharsets() { + static List standardCharsets() { return Charset.availableCharsets().values().stream() - .filter(this::isStandard) + .filter(TestStringEncoding::isStandard) .toList(); } @@ -456,4 +471,26 @@ public class TestStringEncoding { } } + static MemorySegment[] heapSegments() { + return new MemorySegment[]{ + MemorySegment.ofArray(new byte[80]), + MemorySegment.ofArray(new char[40]), + MemorySegment.ofArray(new short[40]), + MemorySegment.ofArray(new int[20]), + MemorySegment.ofArray(new float[20]), + MemorySegment.ofArray(new long[10]), + MemorySegment.ofArray(new double[10]) + }; + } + + @DataProvider + public static Object[][] charsetsAndSegments() { + List values = new ArrayList<>(); + for (Charset charset : standardCharsets()) { + for (MemorySegment heapSegment : heapSegments()) { + values.add(new Object[] { charset, heapSegment }); + } + } + return values.toArray(Object[][]::new); + } }