koffi 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/{src/koffi/ChangeLog.md → ChangeLog.md} +21 -1
  2. package/{src/koffi/LICENSE.txt → LICENSE.txt} +0 -0
  3. package/{src/koffi/README.md → README.md} +0 -0
  4. package/{src/koffi/doc → doc}/Makefile +1 -1
  5. package/{src/koffi/doc → doc}/benchmarks.md +0 -0
  6. package/{src/koffi/doc → doc}/benchmarks.xlsx +0 -0
  7. package/doc/callbacks.md +175 -0
  8. package/{src/koffi/doc → doc}/changes.md +2 -3
  9. package/{src/koffi/doc → doc}/conf.py +29 -6
  10. package/{src/koffi/doc → doc}/contribute.md +0 -0
  11. package/{src/koffi/doc → doc}/functions.md +39 -124
  12. package/{src/koffi/doc → doc}/index.rst +1 -0
  13. package/{src/koffi/doc → doc}/make.bat +1 -1
  14. package/{src/koffi/doc → doc}/memory.md +0 -0
  15. package/{src/koffi/doc → doc}/platforms.md +0 -0
  16. package/{src/koffi/doc → doc}/poetry.lock +0 -0
  17. package/{src/koffi/doc → doc}/pyproject.toml +0 -0
  18. package/{src/koffi/doc → doc}/start.md +0 -0
  19. package/{src/koffi/doc → doc}/static/bench_linux.png +0 -0
  20. package/{src/koffi/doc → doc}/static/bench_windows.png +0 -0
  21. package/{src/koffi/doc → doc}/static/custom.css +0 -0
  22. package/{src/koffi/doc → doc}/static/perf_linux_20220623.png +0 -0
  23. package/{src/koffi/doc → doc}/static/perf_linux_20220623_2.png +0 -0
  24. package/{src/koffi/doc → doc}/static/perf_linux_20220627.png +0 -0
  25. package/{src/koffi/doc → doc}/static/perf_linux_20220628.png +0 -0
  26. package/{src/koffi/doc → doc}/static/perf_linux_20220812.png +0 -0
  27. package/{src/koffi/doc → doc}/static/perf_windows_20220623.png +0 -0
  28. package/{src/koffi/doc → doc}/static/perf_windows_20220623_2.png +0 -0
  29. package/{src/koffi/doc → doc}/static/perf_windows_20220627.png +0 -0
  30. package/{src/koffi/doc → doc}/static/perf_windows_20220628.png +0 -0
  31. package/{src/koffi/doc → doc}/static/perf_windows_20220812.png +0 -0
  32. package/{src/koffi/doc → doc}/templates/badges.html +0 -0
  33. package/{src/koffi/doc → doc}/types.md +36 -9
  34. package/package.json +2 -2
  35. package/src/core/libcc/libcc.cc +89 -27
  36. package/src/core/libcc/libcc.hh +74 -39
  37. package/src/koffi/build/2.2.0/koffi_darwin_arm64.tar.gz +0 -0
  38. package/src/koffi/build/2.2.0/koffi_darwin_x64.tar.gz +0 -0
  39. package/src/koffi/build/2.2.0/koffi_freebsd_arm64.tar.gz +0 -0
  40. package/src/koffi/build/2.2.0/koffi_freebsd_ia32.tar.gz +0 -0
  41. package/src/koffi/build/2.2.0/koffi_freebsd_x64.tar.gz +0 -0
  42. package/src/koffi/build/2.2.0/koffi_linux_arm32hf.tar.gz +0 -0
  43. package/src/koffi/build/2.2.0/koffi_linux_arm64.tar.gz +0 -0
  44. package/src/koffi/build/2.2.0/koffi_linux_ia32.tar.gz +0 -0
  45. package/src/koffi/build/2.2.0/koffi_linux_riscv64hf64.tar.gz +0 -0
  46. package/src/koffi/build/2.2.0/koffi_linux_x64.tar.gz +0 -0
  47. package/src/koffi/build/2.2.0/koffi_openbsd_ia32.tar.gz +0 -0
  48. package/src/koffi/build/2.2.0/koffi_openbsd_x64.tar.gz +0 -0
  49. package/src/koffi/build/2.2.0/koffi_win32_arm64.tar.gz +0 -0
  50. package/src/koffi/build/2.2.0/koffi_win32_ia32.tar.gz +0 -0
  51. package/src/koffi/build/2.2.0/koffi_win32_x64.tar.gz +0 -0
  52. package/src/koffi/qemu/qemu.js +17 -7
  53. package/src/koffi/src/abi_arm32.cc +25 -23
  54. package/src/koffi/src/abi_arm64.cc +24 -22
  55. package/src/koffi/src/abi_riscv64.cc +20 -18
  56. package/src/koffi/src/abi_x64_sysv.cc +19 -17
  57. package/src/koffi/src/abi_x64_win.cc +18 -16
  58. package/src/koffi/src/abi_x86.cc +22 -20
  59. package/src/koffi/src/call.cc +220 -607
  60. package/src/koffi/src/call.hh +7 -11
  61. package/src/koffi/src/ffi.cc +229 -29
  62. package/src/koffi/src/ffi.hh +6 -2
  63. package/src/koffi/src/parser.cc +3 -9
  64. package/src/koffi/src/util.cc +546 -8
  65. package/src/koffi/src/util.hh +8 -2
  66. package/src/koffi/test/CMakeLists.txt +3 -3
  67. package/src/koffi/test/callbacks.js +70 -0
  68. package/src/koffi/test/misc.c +67 -0
  69. package/src/koffi/test/raylib.js +2 -2
  70. package/src/koffi/test/sqlite.js +1 -1
  71. package/src/koffi/test/sync.js +28 -6
  72. package/vendor/brotli/c/common/platform.h +2 -0
  73. package/vendor/sqlite3mc/sqlite3.c +243532 -0
  74. package/vendor/sqlite3mc/sqlite3.h +12887 -0
  75. package/src/koffi/build/2.1.4/koffi_darwin_arm64.tar.gz +0 -0
  76. package/src/koffi/build/2.1.4/koffi_darwin_x64.tar.gz +0 -0
  77. package/src/koffi/build/2.1.4/koffi_freebsd_arm64.tar.gz +0 -0
  78. package/src/koffi/build/2.1.4/koffi_freebsd_ia32.tar.gz +0 -0
  79. package/src/koffi/build/2.1.4/koffi_freebsd_x64.tar.gz +0 -0
  80. package/src/koffi/build/2.1.4/koffi_linux_arm32hf.tar.gz +0 -0
  81. package/src/koffi/build/2.1.4/koffi_linux_arm64.tar.gz +0 -0
  82. package/src/koffi/build/2.1.4/koffi_linux_ia32.tar.gz +0 -0
  83. package/src/koffi/build/2.1.4/koffi_linux_riscv64hf64.tar.gz +0 -0
  84. package/src/koffi/build/2.1.4/koffi_linux_x64.tar.gz +0 -0
  85. package/src/koffi/build/2.1.4/koffi_openbsd_ia32.tar.gz +0 -0
  86. package/src/koffi/build/2.1.4/koffi_openbsd_x64.tar.gz +0 -0
  87. package/src/koffi/build/2.1.4/koffi_win32_arm64.tar.gz +0 -0
  88. package/src/koffi/build/2.1.4/koffi_win32_ia32.tar.gz +0 -0
  89. package/src/koffi/build/2.1.4/koffi_win32_x64.tar.gz +0 -0
@@ -311,7 +311,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
311
311
  return false; \
312
312
  } \
313
313
  \
314
- CType v = CopyNumber<CType>(value); \
314
+ CType v = GetNumber<CType>(value); \
315
315
  *((param.gpr_count ? gpr_ptr : args_ptr)++) = (uint64_t)v; \
316
316
  } while (false)
317
317
  #define PUSH_INTEGER_SWAP(CType) \
@@ -321,7 +321,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
321
321
  return false; \
322
322
  } \
323
323
  \
324
- CType v = CopyNumber<CType>(value); \
324
+ CType v = GetNumber<CType>(value); \
325
325
  *((param.gpr_count ? gpr_ptr : args_ptr)++) = (uint64_t)ReverseBytes(v); \
326
326
  } while (false)
327
327
 
@@ -360,14 +360,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
360
360
  case PrimitiveKind::UInt64S: { PUSH_INTEGER_SWAP(uint64_t); } break;
361
361
  case PrimitiveKind::String: {
362
362
  const char *str;
363
- if (RG_UNLIKELY(!PushString(value, &str)))
363
+ if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
364
364
  return false;
365
365
 
366
366
  *(const char **)((param.gpr_count ? gpr_ptr : args_ptr)++) = str;
367
367
  } break;
368
368
  case PrimitiveKind::String16: {
369
369
  const char16_t *str16;
370
- if (RG_UNLIKELY(!PushString16(value, &str16)))
370
+ if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
371
371
  return false;
372
372
 
373
373
  *(const char16_t **)((param.gpr_count ? gpr_ptr : args_ptr)++) = str16;
@@ -424,7 +424,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
424
424
  return false;
425
425
  }
426
426
 
427
- float f = CopyNumber<float>(value);
427
+ float f = GetNumber<float>(value);
428
428
  uint64_t *ptr = (param.xmm_count ? xmm_ptr : args_ptr)++;
429
429
 
430
430
  memset((uint8_t *)ptr + 4, 0, 4);
@@ -436,7 +436,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
436
436
  return false;
437
437
  }
438
438
 
439
- double d = CopyNumber<double>(value);
439
+ double d = GetNumber<double>(value);
440
440
  *(double *)((param.xmm_count ? xmm_ptr : args_ptr)++) = d;
441
441
  } break;
442
442
  case PrimitiveKind::Callback: {
@@ -574,7 +574,7 @@ Napi::Value CallData::Complete()
574
574
  const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
575
575
  : (const uint8_t *)&result.buf;
576
576
 
577
- Napi::Object obj = PopObject(ptr, func->ret.type);
577
+ Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
578
578
  return obj;
579
579
  } break;
580
580
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
@@ -611,7 +611,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
611
611
  return;
612
612
  }
613
613
 
614
- LocalArray<napi_value, MaxParameters> arguments;
614
+ LocalArray<napi_value, MaxParameters + 1> arguments;
615
+
616
+ arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
615
617
 
616
618
  // Convert to JS arguments
617
619
  for (Size i = 0; i < proto->parameters.len; i++) {
@@ -775,12 +777,12 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
775
777
  }
776
778
  }
777
779
 
778
- Napi::Object obj = PopObject((const uint8_t *)buf, param.type);
780
+ Napi::Object obj = DecodeObject(env, (const uint8_t *)buf, param.type);
779
781
  arguments.Append(obj);
780
782
  } else if (param.use_memory) {
781
783
  args_ptr = AlignUp(args_ptr, param.type->align);
782
784
 
783
- Napi::Object obj = PopObject((const uint8_t *)args_ptr, param.type);
785
+ Napi::Object obj = DecodeObject(env, (const uint8_t *)args_ptr, param.type);
784
786
  arguments.Append(obj);
785
787
 
786
788
  args_ptr += (param.type->size + 7) / 8;
@@ -808,7 +810,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
808
810
 
809
811
  // Make the call
810
812
  napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
811
- [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
813
+ [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
812
814
  Napi::Value value(env, ret);
813
815
 
814
816
  if (RG_UNLIKELY(env.IsExceptionPending()))
@@ -821,7 +823,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
821
823
  return; \
822
824
  } \
823
825
  \
824
- CType v = CopyNumber<CType>(value); \
826
+ CType v = GetNumber<CType>(value); \
825
827
  out_reg->rax = (uint64_t)v; \
826
828
  } while (false)
827
829
  #define RETURN_INTEGER_SWAP(CType) \
@@ -831,7 +833,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
831
833
  return; \
832
834
  } \
833
835
  \
834
- CType v = CopyNumber<CType>(value); \
836
+ CType v = GetNumber<CType>(value); \
835
837
  out_reg->rax = (uint64_t)ReverseBytes(v); \
836
838
  } while (false)
837
839
 
@@ -863,14 +865,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
863
865
  case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
864
866
  case PrimitiveKind::String: {
865
867
  const char *str;
866
- if (RG_UNLIKELY(!PushString(value, &str)))
868
+ if (RG_UNLIKELY(!PushString(value, 1, &str)))
867
869
  return;
868
870
 
869
871
  out_reg->rax = (uint64_t)str;
870
872
  } break;
871
873
  case PrimitiveKind::String16: {
872
874
  const char16_t *str16;
873
- if (RG_UNLIKELY(!PushString16(value, &str16)))
875
+ if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
874
876
  return;
875
877
 
876
878
  out_reg->rax = (uint64_t)str16;
@@ -937,7 +939,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
937
939
  return;
938
940
  }
939
941
 
940
- float f = CopyNumber<float>(value);
942
+ float f = GetNumber<float>(value);
941
943
 
942
944
  memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
943
945
  memcpy(&out_reg->xmm0, &f, 4);
@@ -948,7 +950,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
948
950
  return;
949
951
  }
950
952
 
951
- double d = CopyNumber<double>(value);
953
+ double d = GetNumber<double>(value);
952
954
  out_reg->xmm0 = d;
953
955
  } break;
954
956
  case PrimitiveKind::Callback: {
@@ -142,7 +142,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
142
142
  return false; \
143
143
  } \
144
144
  \
145
- CType v = CopyNumber<CType>(value); \
145
+ CType v = GetNumber<CType>(value); \
146
146
  *(args_ptr++) = (uint64_t)v; \
147
147
  } while (false)
148
148
  #define PUSH_INTEGER_SWAP(CType) \
@@ -152,7 +152,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
152
152
  return false; \
153
153
  } \
154
154
  \
155
- CType v = CopyNumber<CType>(value); \
155
+ CType v = GetNumber<CType>(value); \
156
156
  *(args_ptr++) = (uint64_t)ReverseBytes(v); \
157
157
  } while (false)
158
158
 
@@ -192,14 +192,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
192
192
  case PrimitiveKind::UInt64S: { PUSH_INTEGER_SWAP(uint64_t); } break;
193
193
  case PrimitiveKind::String: {
194
194
  const char *str;
195
- if (RG_UNLIKELY(!PushString(value, &str)))
195
+ if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
196
196
  return false;
197
197
 
198
198
  *(const char **)(args_ptr++) = str;
199
199
  } break;
200
200
  case PrimitiveKind::String16: {
201
201
  const char16_t *str16;
202
- if (RG_UNLIKELY(!PushString16(value, &str16)))
202
+ if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
203
203
  return false;
204
204
 
205
205
  *(const char16_t **)(args_ptr++) = str16;
@@ -236,7 +236,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
236
236
  return false;
237
237
  }
238
238
 
239
- float f = CopyNumber<float>(value);
239
+ float f = GetNumber<float>(value);
240
240
 
241
241
  memset((uint8_t *)args_ptr + 4, 0, 4);
242
242
  *(float *)(args_ptr++) = f;
@@ -247,7 +247,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
247
247
  return false;
248
248
  }
249
249
 
250
- double d = CopyNumber<double>(value);
250
+ double d = GetNumber<double>(value);
251
251
  *(double *)(args_ptr++) = d;
252
252
  } break;
253
253
  case PrimitiveKind::Callback: {
@@ -370,7 +370,7 @@ Napi::Value CallData::Complete()
370
370
  const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
371
371
  : (const uint8_t *)&result.buf;
372
372
 
373
- Napi::Object obj = PopObject(ptr, func->ret.type);
373
+ Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
374
374
  return obj;
375
375
  } break;
376
376
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
@@ -406,7 +406,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
406
406
  return;
407
407
  }
408
408
 
409
- LocalArray<napi_value, MaxParameters> arguments;
409
+ LocalArray<napi_value, MaxParameters + 1> arguments;
410
+
411
+ arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
410
412
 
411
413
  // Convert to JS arguments
412
414
  for (Size i = 0, j = !!return_ptr; i < proto->parameters.len; i++, j++) {
@@ -574,7 +576,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
574
576
  }
575
577
  args_ptr += (j >= 4);
576
578
 
577
- Napi::Object obj2 = PopObject(ptr, param.type);
579
+ Napi::Object obj2 = DecodeObject(env, ptr, param.type);
578
580
  arguments.Append(obj2);
579
581
  } break;
580
582
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
@@ -601,7 +603,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
601
603
 
602
604
  // Make the call
603
605
  napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
604
- [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
606
+ [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
605
607
  Napi::Value value(env, ret);
606
608
 
607
609
  if (RG_UNLIKELY(env.IsExceptionPending()))
@@ -614,7 +616,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
614
616
  return; \
615
617
  } \
616
618
  \
617
- CType v = CopyNumber<CType>(value); \
619
+ CType v = GetNumber<CType>(value); \
618
620
  out_reg->rax = (uint64_t)v; \
619
621
  } while (false)
620
622
  #define RETURN_INTEGER_SWAP(CType) \
@@ -624,7 +626,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
624
626
  return; \
625
627
  } \
626
628
  \
627
- CType v = CopyNumber<CType>(value); \
629
+ CType v = GetNumber<CType>(value); \
628
630
  out_reg->rax = (uint64_t)ReverseBytes(v); \
629
631
  } while (false)
630
632
 
@@ -655,14 +657,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
655
657
  case PrimitiveKind::UInt64S: { RETURN_INTEGER_SWAP(uint64_t); } break;
656
658
  case PrimitiveKind::String: {
657
659
  const char *str;
658
- if (RG_UNLIKELY(!PushString(value, &str)))
660
+ if (RG_UNLIKELY(!PushString(value, 1, &str)))
659
661
  return;
660
662
 
661
663
  out_reg->rax = (uint64_t)str;
662
664
  } break;
663
665
  case PrimitiveKind::String16: {
664
666
  const char16_t *str16;
665
- if (RG_UNLIKELY(!PushString16(value, &str16)))
667
+ if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
666
668
  return;
667
669
 
668
670
  out_reg->rax = (uint64_t)str16;
@@ -711,7 +713,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
711
713
  return;
712
714
  }
713
715
 
714
- float f = CopyNumber<float>(value);
716
+ float f = GetNumber<float>(value);
715
717
 
716
718
  memset((uint8_t *)&out_reg->xmm0 + 4, 0, 4);
717
719
  memcpy(&out_reg->xmm0, &f, 4);
@@ -722,7 +724,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
722
724
  return;
723
725
  }
724
726
 
725
- double d = CopyNumber<double>(value);
727
+ double d = GetNumber<double>(value);
726
728
  out_reg->xmm0 = d;
727
729
  } break;
728
730
  case PrimitiveKind::Callback: {
@@ -198,7 +198,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
198
198
  return false; \
199
199
  } \
200
200
  \
201
- CType v = CopyNumber<CType>(value); \
201
+ CType v = GetNumber<CType>(value); \
202
202
  *((param.fast ? fast_ptr : args_ptr)++) = (uint32_t)v; \
203
203
  } while (false)
204
204
  #define PUSH_INTEGER_32_SWAP(CType) \
@@ -208,7 +208,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
208
208
  return false; \
209
209
  } \
210
210
  \
211
- CType v = CopyNumber<CType>(value); \
211
+ CType v = GetNumber<CType>(value); \
212
212
  *((param.fast ? fast_ptr : args_ptr)++) = (uint32_t)ReverseBytes(v); \
213
213
  } while (false)
214
214
  #define PUSH_INTEGER_64(CType) \
@@ -218,7 +218,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
218
218
  return false; \
219
219
  } \
220
220
  \
221
- CType v = CopyNumber<CType>(value); \
221
+ CType v = GetNumber<CType>(value); \
222
222
  \
223
223
  *(uint64_t *)args_ptr = (uint64_t)v; \
224
224
  args_ptr += 2; \
@@ -230,7 +230,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
230
230
  return false; \
231
231
  } \
232
232
  \
233
- CType v = CopyNumber<CType>(value); \
233
+ CType v = GetNumber<CType>(value); \
234
234
  \
235
235
  *(uint64_t *)args_ptr = (uint64_t)ReverseBytes(v); \
236
236
  args_ptr += 2; \
@@ -271,14 +271,14 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
271
271
  case PrimitiveKind::UInt64S: { PUSH_INTEGER_64_SWAP(uint64_t); } break;
272
272
  case PrimitiveKind::String: {
273
273
  const char *str;
274
- if (RG_UNLIKELY(!PushString(value, &str)))
274
+ if (RG_UNLIKELY(!PushString(value, param.directions, &str)))
275
275
  return false;
276
276
 
277
277
  *(const char **)((param.fast ? fast_ptr : args_ptr)++) = str;
278
278
  } break;
279
279
  case PrimitiveKind::String16: {
280
280
  const char16_t *str16;
281
- if (RG_UNLIKELY(!PushString16(value, &str16)))
281
+ if (RG_UNLIKELY(!PushString16(value, param.directions, &str16)))
282
282
  return false;
283
283
 
284
284
  *(const char16_t **)((param.fast ? fast_ptr : args_ptr)++) = str16;
@@ -316,7 +316,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
316
316
  return false;
317
317
  }
318
318
 
319
- float f = CopyNumber<float>(value);
319
+ float f = GetNumber<float>(value);
320
320
  *(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
321
321
  } break;
322
322
  case PrimitiveKind::Float64: {
@@ -325,7 +325,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
325
325
  return false;
326
326
  }
327
327
 
328
- double d = CopyNumber<double>(value);
328
+ double d = GetNumber<double>(value);
329
329
  *(double *)args_ptr = d;
330
330
  args_ptr += 2;
331
331
  } break;
@@ -452,7 +452,7 @@ Napi::Value CallData::Complete()
452
452
  const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
453
453
  : (const uint8_t *)&result.buf;
454
454
 
455
- Napi::Object obj = PopObject(ptr, func->ret.type);
455
+ Napi::Object obj = DecodeObject(env, ptr, func->ret.type);
456
456
  return obj;
457
457
  } break;
458
458
  case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
@@ -502,7 +502,9 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
502
502
  return;
503
503
  }
504
504
 
505
- LocalArray<napi_value, MaxParameters> arguments;
505
+ LocalArray<napi_value, MaxParameters + 1> arguments;
506
+
507
+ arguments.Append(!trampoline.recv.IsEmpty() ? trampoline.recv.Value() : env.Undefined());
506
508
 
507
509
  // Convert to JS arguments
508
510
  for (Size i = 0; i < proto->parameters.len; i++) {
@@ -652,7 +654,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
652
654
 
653
655
  uint8_t *ptr = (uint8_t *)args_ptr;
654
656
 
655
- Napi::Object obj2 = PopObject(ptr, param.type);
657
+ Napi::Object obj2 = DecodeObject(env, ptr, param.type);
656
658
  arguments.Append(obj2);
657
659
 
658
660
  args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
@@ -680,7 +682,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
680
682
 
681
683
  // Make the call
682
684
  napi_value ret = CallSwitchStack(&func, (size_t)arguments.len, arguments.data, old_sp, &mem->stack,
683
- [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argc, argv); });
685
+ [](Napi::Function *func, size_t argc, napi_value *argv) { return (napi_value)func->Call(argv[0], argc - 1, argv + 1); });
684
686
  Napi::Value value(env, ret);
685
687
 
686
688
  if (RG_UNLIKELY(env.IsExceptionPending()))
@@ -693,7 +695,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
693
695
  return; \
694
696
  } \
695
697
  \
696
- CType v = CopyNumber<CType>(value); \
698
+ CType v = GetNumber<CType>(value); \
697
699
  out_reg->eax = (uint32_t)v; \
698
700
  } while (false)
699
701
  #define RETURN_INTEGER_32_SWAP(CType) \
@@ -703,7 +705,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
703
705
  return; \
704
706
  } \
705
707
  \
706
- CType v = CopyNumber<CType>(value); \
708
+ CType v = GetNumber<CType>(value); \
707
709
  out_reg->eax = (uint32_t)ReverseBytes(v); \
708
710
  } while (false)
709
711
  #define RETURN_INTEGER_64(CType) \
@@ -713,7 +715,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
713
715
  return; \
714
716
  } \
715
717
  \
716
- CType v = CopyNumber<CType>(value); \
718
+ CType v = GetNumber<CType>(value); \
717
719
  \
718
720
  out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
719
721
  out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
@@ -725,7 +727,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
725
727
  return; \
726
728
  } \
727
729
  \
728
- CType v = ReverseBytes(CopyNumber<CType>(value)); \
730
+ CType v = ReverseBytes(GetNumber<CType>(value)); \
729
731
  \
730
732
  out_reg->eax = (uint32_t)((uint64_t)v >> 32); \
731
733
  out_reg->edx = (uint32_t)((uint64_t)v & 0xFFFFFFFFu); \
@@ -758,14 +760,14 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
758
760
  case PrimitiveKind::UInt64S: { RETURN_INTEGER_64_SWAP(uint64_t); } break;
759
761
  case PrimitiveKind::String: {
760
762
  const char *str;
761
- if (RG_UNLIKELY(!PushString(value, &str)))
763
+ if (RG_UNLIKELY(!PushString(value, 1, &str)))
762
764
  return;
763
765
 
764
766
  out_reg->eax = (uint32_t)str;
765
767
  } break;
766
768
  case PrimitiveKind::String16: {
767
769
  const char16_t *str16;
768
- if (RG_UNLIKELY(!PushString16(value, &str16)))
770
+ if (RG_UNLIKELY(!PushString16(value, 1, &str16)))
769
771
  return;
770
772
 
771
773
  out_reg->eax = (uint32_t)str16;
@@ -814,7 +816,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
814
816
  return;
815
817
  }
816
818
 
817
- out_reg->x87.f = CopyNumber<float>(value);
819
+ out_reg->x87.f = GetNumber<float>(value);
818
820
  out_reg->x87_double = false;
819
821
  } break;
820
822
  case PrimitiveKind::Float64: {
@@ -823,7 +825,7 @@ void CallData::Relay(Size idx, uint8_t *own_sp, uint8_t *caller_sp, BackRegister
823
825
  return;
824
826
  }
825
827
 
826
- out_reg->x87.d = CopyNumber<double>(value);
828
+ out_reg->x87.d = GetNumber<double>(value);
827
829
  out_reg->x87_double = true;
828
830
  } break;
829
831
  case PrimitiveKind::Callback: {