< prev index next > src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/windows/WinVaList.java
Print this page
*
*/
package jdk.internal.foreign.abi.x64.windows;
import jdk.incubator.foreign.CSupport;
+ import jdk.incubator.foreign.CSupport.VaList;
import jdk.incubator.foreign.MemoryAddress;
import jdk.incubator.foreign.MemoryHandles;
import jdk.incubator.foreign.MemoryLayout;
import jdk.incubator.foreign.MemorySegment;
import jdk.internal.foreign.abi.SharedUtils;
// #define __crt_va_arg(ap, t) \
// ((sizeof(t) > sizeof(__int64) || (sizeof(t) & (sizeof(t) - 1)) != 0) \
// ? **(t**)((ap += sizeof(__int64)) - sizeof(__int64)) \
// : *(t* )((ap += sizeof(__int64)) - sizeof(__int64)))
//
- class WinVaList implements CSupport.VaList {
+ class WinVaList implements VaList {
public static final Class<?> CARRIER = MemoryAddress.class;
private static final long VA_SLOT_SIZE_BYTES = 8;
private static final VarHandle VH_address = MemoryHandles.asAddressVarHandle(C_POINTER.varHandle(long.class));
+ private static final VaList EMPTY = new SharedUtils.EmptyVaList(MemoryAddress.NULL);
+
private final MemorySegment segment;
private MemoryAddress ptr;
private final List<MemorySegment> copies;
WinVaList(MemorySegment segment) {
this.segment = segment;
this.ptr = segment.baseAddress();
this.copies = copies;
}
+ public static final VaList empty() {
+ return EMPTY;
+ }
+
@Override
public int vargAsInt(MemoryLayout layout) {
return (int) read(int.class, layout);
}
static Builder builder() {
return new Builder();
}
- MemorySegment getSegment() {
- return segment;
- }
-
@Override
public void close() {
segment.close();
copies.forEach(MemorySegment::close);
}
@Override
- public CSupport.VaList copy() {
+ public VaList copy() {
return WinVaList.ofAddress(ptr);
}
@Override
public MemoryAddress address() {
@Override
public boolean isAlive() {
return segment.isAlive();
}
- static class Builder implements CSupport.VaList.Builder {
+ static class Builder implements VaList.Builder {
private final List<SimpleVaArg> args = new ArrayList<>();
private Builder arg(Class<?> carrier, MemoryLayout layout, Object value) {
SharedUtils.checkCompatibleType(carrier, layout, Windowsx64Linker.ADDRESS_SIZE);
@Override
public Builder vargFromSegment(MemoryLayout layout, MemorySegment value) {
return arg(MemorySegment.class, layout, value);
}
- public WinVaList build() {
+ public VaList build() {
+ if (args.isEmpty()) {
+ return EMPTY;
+ }
MemorySegment ms = MemorySegment.allocateNative(VA_SLOT_SIZE_BYTES * args.size());
List<MemorySegment> copies = new ArrayList<>();
MemoryAddress addr = ms.baseAddress();
for (SimpleVaArg arg : args) {
< prev index next >