diff --git a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/InternalForeign.java b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/InternalForeign.java index 2926cf8147d..34ebf09676a 100644 --- a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/InternalForeign.java +++ b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/InternalForeign.java @@ -61,7 +61,7 @@ public MemorySegment asMallocSegment(MemoryAddress base, long byteSize) throws I } private void checkRawNativeAddress(MemoryAddress base) { - if (base.segment() != AbstractMemorySegmentImpl.NOTHING) { + if (base.segment() != null) { throw new IllegalArgumentException("Not an unchecked memory address"); } } diff --git a/test/jdk/java/foreign/TestNative.java b/test/jdk/java/foreign/TestNative.java index d0984574ac9..61b50115000 100644 --- a/test/jdk/java/foreign/TestNative.java +++ b/test/jdk/java/foreign/TestNative.java @@ -56,7 +56,7 @@ import java.util.function.Consumer; import java.util.function.Function; -import static org.testng.Assert.assertEquals; +import static org.testng.Assert.*; public class TestNative { @@ -150,6 +150,8 @@ static <Z extends Buffer> void checkBytes(MemoryAddress base, SequenceLayout lay public static native long getCapacity(Buffer buffer); + public static native long allocate(int size); + @Test(dataProvider="nativeAccessOps") public void testNativeAccess(Consumer<MemoryAddress> checker, Consumer<MemoryAddress> initializer, SequenceLayout seq) { try (MemorySegment segment = MemorySegment.allocateNative(seq)) { @@ -171,6 +173,24 @@ public void testNativeCapacity(Function<ByteBuffer, Buffer> bufferFunction, int } } + @Test + public void testResize() { + MemoryAddress addr = MemoryAddress.ofLong(42); + assertNull(addr.segment()); + MemoryAddress sized = InternalForeign.getInstancePrivileged().withSize(addr, 12); + assertEquals(sized.segment().byteSize(), 12); + } + + @Test + public void testMallocSegment() { + MemoryAddress addr = MemoryAddress.ofLong(allocate(12)); + assertNull(addr.segment()); + MemorySegment mallocSegment = InternalForeign.getInstancePrivileged().asMallocSegment(addr, 12); + assertEquals(mallocSegment.byteSize(), 12); + mallocSegment.close(); //free here + assertTrue(!mallocSegment.isAlive()); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testBadResize() { try (MemorySegment segment = MemorySegment.allocateNative(4)) { diff --git a/test/jdk/java/foreign/libNativeAccess.c b/test/jdk/java/foreign/libNativeAccess.c index ef6d5d90f37..0f024ac90a4 100644 --- a/test/jdk/java/foreign/libNativeAccess.c +++ b/test/jdk/java/foreign/libNativeAccess.c @@ -23,6 +23,7 @@ */ #include "jni.h" +#include <stdlib.h> #include <stdio.h> #include <stdint.h> @@ -114,3 +115,8 @@ JNIEXPORT jlong JNICALL Java_TestNative_getCapacity(JNIEnv *env, jclass cls, jobject buf) { return (*env)->GetDirectBufferCapacity(env, buf); } + +JNIEXPORT jlong JNICALL +Java_TestNative_allocate(JNIEnv *env, jclass cls, jobject buf, jint size) { + return (jlong)malloc(size); +}