< prev index next > src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/ProgrammableUpcallHandler.java
Print this page
MemoryAddress bufferBase = MemoryAddressImpl.ofLongUnchecked(buffer.toRawLongValue(), layout.size);
MemoryAddress stackArgsBase = MemoryAddressImpl.ofLongUnchecked((long)VH_LONG.get(buffer.rebase(bufferBase.segment()).addOffset(layout.stack_args)));
Object[] args = new Object[type.parameterCount()];
for (int i = 0 ; i < type.parameterCount() ; i++) {
! args[i] = jdk.internal.foreign.abi.BindingInterpreter.box(callingSequence.argumentBindings(i),
! s -> abi.arch.isStackType(s.type())
! ? stackArgsBase.addOffset(s.index() * abi.arch.typeSize(abi.arch.stackType()))
! : bufferBase.addOffset(layout.argOffset(s)));
}
if (DEBUG) {
System.err.println("Java arguments:");
System.err.println(Arrays.toString(args).indent(2));
MemoryAddress bufferBase = MemoryAddressImpl.ofLongUnchecked(buffer.toRawLongValue(), layout.size);
MemoryAddress stackArgsBase = MemoryAddressImpl.ofLongUnchecked((long)VH_LONG.get(buffer.rebase(bufferBase.segment()).addOffset(layout.stack_args)));
Object[] args = new Object[type.parameterCount()];
for (int i = 0 ; i < type.parameterCount() ; i++) {
! args[i] = BindingInterpreter.box(callingSequence.argumentBindings(i),
! (storage, type) -> {
! MemoryAddress ptr = abi.arch.isStackType(storage.type())
! ? stackArgsBase.addOffset(storage.index() * abi.arch.typeSize(abi.arch.stackType()))
+ : bufferBase.addOffset(layout.argOffset(storage));
+ return SharedUtils.read(ptr, type);
+ });
}
if (DEBUG) {
System.err.println("Java arguments:");
System.err.println(Arrays.toString(args).indent(2));
System.err.println("Java return:");
System.err.println(Objects.toString(o).indent(2));
}
if (mh.type().returnType() != void.class) {
! jdk.internal.foreign.abi.BindingInterpreter.unbox(o,
! callingSequence.returnBindings(), s -> bufferBase.addOffset(layout.retOffset(s)), new ArrayList<>());
}
if (DEBUG) {
System.err.println("Buffer state after:");
layout.dump(abi.arch, buffer, System.err);
System.err.println("Java return:");
System.err.println(Objects.toString(o).indent(2));
}
if (mh.type().returnType() != void.class) {
! BindingInterpreter.unbox(o, callingSequence.returnBindings(),
! (storage, type, value) -> {
+ MemoryAddress ptr = bufferBase.addOffset(layout.retOffset(storage));
+ SharedUtils.writeOverSized(ptr, type, value);
+ }, null);
}
if (DEBUG) {
System.err.println("Buffer state after:");
layout.dump(abi.arch, buffer, System.err);
< prev index next >