< prev index next >

src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/ProgrammableUpcallHandler.java

Print this page
*** 87,14 ***
  
              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));
--- 87,17 ---
  
              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));

*** 106,12 ***
                  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);
--- 109,15 ---
                  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 >