8289188: SegmentAllocator:allocateArray(*) default behavior mismatch to spec
Reviewed-by: alanb
This commit is contained in:
parent
699ad45b43
commit
2c8ada689f
@ -282,12 +282,13 @@ public interface SegmentAllocator {
|
|||||||
|
|
||||||
private <Z> MemorySegment copyArrayWithSwapIfNeeded(Z array, ValueLayout elementLayout,
|
private <Z> MemorySegment copyArrayWithSwapIfNeeded(Z array, ValueLayout elementLayout,
|
||||||
Function<Z, MemorySegment> heapSegmentFactory) {
|
Function<Z, MemorySegment> heapSegmentFactory) {
|
||||||
Objects.requireNonNull(array);
|
|
||||||
Objects.requireNonNull(elementLayout);
|
Objects.requireNonNull(elementLayout);
|
||||||
int size = Array.getLength(array);
|
int size = array == null ? 0 : Array.getLength(array);
|
||||||
MemorySegment addr = allocate(MemoryLayout.sequenceLayout(size, elementLayout));
|
MemorySegment addr = allocateArray(elementLayout, size);
|
||||||
MemorySegment.copy(heapSegmentFactory.apply(array), elementLayout, 0,
|
if (size > 0) {
|
||||||
addr, elementLayout.withOrder(ByteOrder.nativeOrder()), 0, size);
|
MemorySegment.copy(heapSegmentFactory.apply(array), elementLayout, 0,
|
||||||
|
addr, elementLayout.withOrder(ByteOrder.nativeOrder()), 0, size);
|
||||||
|
}
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +121,21 @@ public class TestNulls {
|
|||||||
"java.lang.foreign.ValueLayout$OfLong/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
"java.lang.foreign.ValueLayout$OfLong/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
||||||
"java.lang.foreign.ValueLayout$OfDouble/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
"java.lang.foreign.ValueLayout$OfDouble/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
||||||
"java.lang.foreign.GroupLayout/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
"java.lang.foreign.GroupLayout/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
||||||
"java.lang.foreign.FunctionDescriptor/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0"
|
"java.lang.foreign.FunctionDescriptor/withAttribute(java.lang.String,java.lang.constant.Constable)/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfByte,byte[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfShort,short[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfChar,char[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfInt,int[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfFloat,float[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfLong,long[])/1/0",
|
||||||
|
"java.lang.foreign.SegmentAllocator/allocateArray(java.lang.foreign.ValueLayout$OfDouble,double[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfByte,byte[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfShort,short[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfChar,char[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfInt,int[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfFloat,float[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfLong,long[])/1/0",
|
||||||
|
"java.lang.foreign.MemorySession/allocateArray(java.lang.foreign.ValueLayout$OfDouble,double[])/1/0"
|
||||||
);
|
);
|
||||||
|
|
||||||
static final Set<String> OBJECT_METHODS = Stream.of(Object.class.getMethods())
|
static final Set<String> OBJECT_METHODS = Stream.of(Object.class.getMethods())
|
||||||
|
@ -43,6 +43,7 @@ import java.nio.LongBuffer;
|
|||||||
import java.nio.ShortBuffer;
|
import java.nio.ShortBuffer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
@ -159,6 +160,32 @@ public class TestSegmentAllocators {
|
|||||||
allocator.allocate(1, 3);
|
allocator.allocate(1, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testArrayAllocateDelegation() {
|
||||||
|
AtomicInteger calls = new AtomicInteger();
|
||||||
|
SegmentAllocator allocator = new SegmentAllocator() {
|
||||||
|
@Override
|
||||||
|
public MemorySegment allocate(long bytesSize, long bytesAlignment) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MemorySegment allocateArray(MemoryLayout elementLayout, long count) {
|
||||||
|
calls.incrementAndGet();
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_BYTE);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_SHORT);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_CHAR);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_INT);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_FLOAT);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_LONG);
|
||||||
|
allocator.allocateArray(ValueLayout.JAVA_DOUBLE);
|
||||||
|
assertEquals(calls.get(), 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test(dataProvider = "arrayAllocations")
|
@Test(dataProvider = "arrayAllocations")
|
||||||
public <Z> void testArray(AllocationFactory allocationFactory, ValueLayout layout, AllocationFunction<Object, ValueLayout> allocationFunction, ToArrayHelper<Z> arrayHelper) {
|
public <Z> void testArray(AllocationFactory allocationFactory, ValueLayout layout, AllocationFunction<Object, ValueLayout> allocationFunction, ToArrayHelper<Z> arrayHelper) {
|
||||||
Z arr = arrayHelper.array();
|
Z arr = arrayHelper.array();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user