7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 /*
26 * @test
27 * @enablePreview
28 * @requires jdk.foreign.linker != "UNSUPPORTED"
29 * @run testng/othervm --enable-native-access=ALL-UNNAMED TestNative
30 */
31
32 import java.lang.foreign.*;
33 import java.lang.foreign.MemoryLayout.PathElement;
34
35 import org.testng.annotations.DataProvider;
36 import org.testng.annotations.Test;
37
38 import java.lang.invoke.VarHandle;
39 import java.nio.Buffer;
40 import java.nio.ByteBuffer;
41 import java.nio.ByteOrder;
42 import java.nio.CharBuffer;
43 import java.nio.DoubleBuffer;
44 import java.nio.FloatBuffer;
45 import java.nio.IntBuffer;
46 import java.nio.LongBuffer;
47 import java.nio.ShortBuffer;
48 import java.util.function.BiConsumer;
191 assertEquals(addr.get(JAVA_INT, 0), 42);
192 freeMemory(addr);
193 }
194
195 @Test
196 public void testBadResize() {
197 try (Arena arena = Arena.ofConfined()) {
198 MemorySegment segment = arena.allocate(4, 1);
199 assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1));
200 assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1, Arena.ofAuto(), null));
201 }
202 }
203
204 static {
205 System.loadLibrary("NativeAccess");
206 }
207
208 @DataProvider(name = "nativeAccessOps")
209 public Object[][] nativeAccessOps() {
210 Consumer<MemorySegment> byteInitializer =
211 (base) -> initBytes(base, bytes, (addr, pos) -> byteHandle.set(addr, pos, (byte)(long)pos));
212 Consumer<MemorySegment> charInitializer =
213 (base) -> initBytes(base, chars, (addr, pos) -> charHandle.set(addr, pos, (char)(long)pos));
214 Consumer<MemorySegment> shortInitializer =
215 (base) -> initBytes(base, shorts, (addr, pos) -> shortHandle.set(addr, pos, (short)(long)pos));
216 Consumer<MemorySegment> intInitializer =
217 (base) -> initBytes(base, ints, (addr, pos) -> intHandle.set(addr, pos, (int)(long)pos));
218 Consumer<MemorySegment> floatInitializer =
219 (base) -> initBytes(base, floats, (addr, pos) -> floatHandle.set(addr, pos, (float)(long)pos));
220 Consumer<MemorySegment> longInitializer =
221 (base) -> initBytes(base, longs, (addr, pos) -> longHandle.set(addr, pos, (long)pos));
222 Consumer<MemorySegment> doubleInitializer =
223 (base) -> initBytes(base, doubles, (addr, pos) -> doubleHandle.set(addr, pos, (double)(long)pos));
224
225 Consumer<MemorySegment> byteChecker =
226 (base) -> checkBytes(base, bytes, byteHandle::get, bb -> bb, TestNative::getByteBuffer, TestNative::getByteRaw);
227 Consumer<MemorySegment> charChecker =
228 (base) -> checkBytes(base, chars, charHandle::get, ByteBuffer::asCharBuffer, TestNative::getCharBuffer, TestNative::getCharRaw);
229 Consumer<MemorySegment> shortChecker =
230 (base) -> checkBytes(base, shorts, shortHandle::get, ByteBuffer::asShortBuffer, TestNative::getShortBuffer, TestNative::getShortRaw);
231 Consumer<MemorySegment> intChecker =
232 (base) -> checkBytes(base, ints, intHandle::get, ByteBuffer::asIntBuffer, TestNative::getIntBuffer, TestNative::getIntRaw);
233 Consumer<MemorySegment> floatChecker =
234 (base) -> checkBytes(base, floats, floatHandle::get, ByteBuffer::asFloatBuffer, TestNative::getFloatBuffer, TestNative::getFloatRaw);
235 Consumer<MemorySegment> longChecker =
236 (base) -> checkBytes(base, longs, longHandle::get, ByteBuffer::asLongBuffer, TestNative::getLongBuffer, TestNative::getLongRaw);
237 Consumer<MemorySegment> doubleChecker =
238 (base) -> checkBytes(base, doubles, doubleHandle::get, ByteBuffer::asDoubleBuffer, TestNative::getDoubleBuffer, TestNative::getDoubleRaw);
239
240 return new Object[][]{
241 {byteChecker, byteInitializer, bytes},
242 {charChecker, charInitializer, chars},
243 {shortChecker, shortInitializer, shorts},
244 {intChecker, intInitializer, ints},
245 {floatChecker, floatInitializer, floats},
246 {longChecker, longInitializer, longs},
247 {doubleChecker, doubleInitializer, doubles}
248 };
249 }
250
251 @DataProvider(name = "buffers")
252 public Object[][] buffers() {
253 return new Object[][] {
254 { (Function<ByteBuffer, Buffer>)bb -> bb, 1 },
255 { (Function<ByteBuffer, Buffer>)ByteBuffer::asCharBuffer, 2 },
256 { (Function<ByteBuffer, Buffer>)ByteBuffer::asShortBuffer, 2 },
257 { (Function<ByteBuffer, Buffer>)ByteBuffer::asIntBuffer, 4 },
258 { (Function<ByteBuffer, Buffer>)ByteBuffer::asFloatBuffer, 4 },
|
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 /*
26 * @test
27 * @run testng/othervm --enable-native-access=ALL-UNNAMED TestNative
28 */
29
30 import java.lang.foreign.*;
31 import java.lang.foreign.MemoryLayout.PathElement;
32
33 import org.testng.annotations.DataProvider;
34 import org.testng.annotations.Test;
35
36 import java.lang.invoke.VarHandle;
37 import java.nio.Buffer;
38 import java.nio.ByteBuffer;
39 import java.nio.ByteOrder;
40 import java.nio.CharBuffer;
41 import java.nio.DoubleBuffer;
42 import java.nio.FloatBuffer;
43 import java.nio.IntBuffer;
44 import java.nio.LongBuffer;
45 import java.nio.ShortBuffer;
46 import java.util.function.BiConsumer;
189 assertEquals(addr.get(JAVA_INT, 0), 42);
190 freeMemory(addr);
191 }
192
193 @Test
194 public void testBadResize() {
195 try (Arena arena = Arena.ofConfined()) {
196 MemorySegment segment = arena.allocate(4, 1);
197 assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1));
198 assertThrows(IllegalArgumentException.class, () -> segment.reinterpret(-1, Arena.ofAuto(), null));
199 }
200 }
201
202 static {
203 System.loadLibrary("NativeAccess");
204 }
205
206 @DataProvider(name = "nativeAccessOps")
207 public Object[][] nativeAccessOps() {
208 Consumer<MemorySegment> byteInitializer =
209 (base) -> initBytes(base, bytes, (addr, pos) -> byteHandle.set(addr, 0L, pos, (byte)(long)pos));
210 Consumer<MemorySegment> charInitializer =
211 (base) -> initBytes(base, chars, (addr, pos) -> charHandle.set(addr, 0L, pos, (char)(long)pos));
212 Consumer<MemorySegment> shortInitializer =
213 (base) -> initBytes(base, shorts, (addr, pos) -> shortHandle.set(addr, 0L, pos, (short)(long)pos));
214 Consumer<MemorySegment> intInitializer =
215 (base) -> initBytes(base, ints, (addr, pos) -> intHandle.set(addr, 0L, pos, (int)(long)pos));
216 Consumer<MemorySegment> floatInitializer =
217 (base) -> initBytes(base, floats, (addr, pos) -> floatHandle.set(addr, 0L, pos, (float)(long)pos));
218 Consumer<MemorySegment> longInitializer =
219 (base) -> initBytes(base, longs, (addr, pos) -> longHandle.set(addr, 0L, pos, (long)pos));
220 Consumer<MemorySegment> doubleInitializer =
221 (base) -> initBytes(base, doubles, (addr, pos) -> doubleHandle.set(addr, 0L, pos, (double)(long)pos));
222
223 Consumer<MemorySegment> byteChecker =
224 (base) -> checkBytes(base, bytes, (addr, pos) -> byteHandle.get(addr, 0L, pos), bb -> bb, TestNative::getByteBuffer, TestNative::getByteRaw);
225 Consumer<MemorySegment> charChecker =
226 (base) -> checkBytes(base, chars, (addr, pos) -> charHandle.get(addr, 0L, pos), ByteBuffer::asCharBuffer, TestNative::getCharBuffer, TestNative::getCharRaw);
227 Consumer<MemorySegment> shortChecker =
228 (base) -> checkBytes(base, shorts, (addr, pos) -> shortHandle.get(addr, 0L, pos), ByteBuffer::asShortBuffer, TestNative::getShortBuffer, TestNative::getShortRaw);
229 Consumer<MemorySegment> intChecker =
230 (base) -> checkBytes(base, ints, (addr, pos) -> intHandle.get(addr, 0L, pos), ByteBuffer::asIntBuffer, TestNative::getIntBuffer, TestNative::getIntRaw);
231 Consumer<MemorySegment> floatChecker =
232 (base) -> checkBytes(base, floats, (addr, pos) -> floatHandle.get(addr, 0L, pos), ByteBuffer::asFloatBuffer, TestNative::getFloatBuffer, TestNative::getFloatRaw);
233 Consumer<MemorySegment> longChecker =
234 (base) -> checkBytes(base, longs, (addr, pos) -> longHandle.get(addr, 0L, pos), ByteBuffer::asLongBuffer, TestNative::getLongBuffer, TestNative::getLongRaw);
235 Consumer<MemorySegment> doubleChecker =
236 (base) -> checkBytes(base, doubles, (addr, pos) -> doubleHandle.get(addr, 0L, pos), ByteBuffer::asDoubleBuffer, TestNative::getDoubleBuffer, TestNative::getDoubleRaw);
237
238 return new Object[][]{
239 {byteChecker, byteInitializer, bytes},
240 {charChecker, charInitializer, chars},
241 {shortChecker, shortInitializer, shorts},
242 {intChecker, intInitializer, ints},
243 {floatChecker, floatInitializer, floats},
244 {longChecker, longInitializer, longs},
245 {doubleChecker, doubleInitializer, doubles}
246 };
247 }
248
249 @DataProvider(name = "buffers")
250 public Object[][] buffers() {
251 return new Object[][] {
252 { (Function<ByteBuffer, Buffer>)bb -> bb, 1 },
253 { (Function<ByteBuffer, Buffer>)ByteBuffer::asCharBuffer, 2 },
254 { (Function<ByteBuffer, Buffer>)ByteBuffer::asShortBuffer, 2 },
255 { (Function<ByteBuffer, Buffer>)ByteBuffer::asIntBuffer, 4 },
256 { (Function<ByteBuffer, Buffer>)ByteBuffer::asFloatBuffer, 4 },
|