1 /* 2 * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 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 TestVarHandleCombinators 28 */ 29 30 import java.lang.foreign.Arena; 31 import java.lang.foreign.ValueLayout; 32 33 import org.testng.annotations.Test; 34 35 import java.lang.foreign.MemorySegment; 36 import java.lang.invoke.MethodHandles; 37 import java.lang.invoke.VarHandle; 38 import java.nio.ByteOrder; 39 40 import static org.testng.Assert.assertEquals; 41 42 public class TestVarHandleCombinators { 43 44 @Test 45 public void testElementAccess() { 46 VarHandle vh = ValueLayout.JAVA_BYTE.varHandle(); 47 48 byte[] arr = { 0, 0, -1, 0 }; 49 MemorySegment segment = MemorySegment.ofArray(arr); 50 assertEquals((byte) vh.get(segment, 2), (byte) -1); 51 } 52 53 @Test(expectedExceptions = IllegalArgumentException.class) 54 public void testUnalignedElement() { 55 VarHandle vh = ValueLayout.JAVA_BYTE.withByteAlignment(4).varHandle(); 56 MemorySegment segment = MemorySegment.ofArray(new byte[4]); 57 vh.get(segment, 2L); //should throw 58 //FIXME: the VH only checks the alignment of the segment, which is fine if the VH is derived from layouts, 59 //FIXME: but not if the VH is just created from scratch - we need a VH variable to govern this property, 60 //FIXME: at least until the VM is fixed 61 } 62 63 @Test 64 public void testAlign() { 65 VarHandle vh = ValueLayout.JAVA_BYTE.withByteAlignment(2).varHandle(); 66 67 Arena scope = Arena.ofAuto(); 68 MemorySegment segment = scope.allocate(1L, 2); 69 vh.set(segment, 0L, (byte) 10); // fine, memory region is aligned 70 assertEquals((byte) vh.get(segment, 0L), (byte) 10); 71 } 72 73 @Test 74 public void testByteOrderLE() { 75 VarHandle vh = ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN).varHandle(); 76 byte[] arr = new byte[2]; 77 MemorySegment segment = MemorySegment.ofArray(arr); 78 vh.set(segment, 0L, (short) 0xFF); 79 assertEquals(arr[0], (byte) 0xFF); 80 assertEquals(arr[1], (byte) 0); 81 } 82 83 @Test 84 public void testByteOrderBE() { 85 VarHandle vh = ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.BIG_ENDIAN).varHandle(); 86 byte[] arr = new byte[2]; 87 MemorySegment segment = MemorySegment.ofArray(arr); 88 vh.set(segment, 0L, (short) 0xFF); 89 assertEquals(arr[0], (byte) 0); 90 assertEquals(arr[1], (byte) 0xFF); 91 } 92 93 @Test 94 public void testNestedSequenceAccess() { 95 int outer_size = 10; 96 int inner_size = 5; 97 98 //[10 : [5 : [x32 i32]]] 99 100 VarHandle vh = ValueLayout.JAVA_INT.varHandle(); 101 int count = 0; 102 try (Arena arena = Arena.ofConfined()) { 103 MemorySegment segment = arena.allocate(inner_size * outer_size * 8, 4); 104 for (long i = 0; i < outer_size; i++) { 105 for (long j = 0; j < inner_size; j++) { 106 vh.set(segment, i * 40 + j * 8, count); 107 assertEquals( 108 (int)vh.get(segment.asSlice(i * inner_size * 8), j * 8), 109 count); 110 count++; 111 } 112 } 113 } 114 } 115 }