koffi 1.0.3 → 1.1.0-beta.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 (271) hide show
  1. package/README.md +48 -22
  2. package/build/qemu/1.1.0-beta.0/koffi_darwin_x64.tar.gz +0 -0
  3. package/build/qemu/1.1.0-beta.0/koffi_freebsd_arm64.tar.gz +0 -0
  4. package/build/qemu/1.1.0-beta.0/koffi_freebsd_ia32.tar.gz +0 -0
  5. package/build/qemu/1.1.0-beta.0/koffi_freebsd_x64.tar.gz +0 -0
  6. package/build/qemu/1.1.0-beta.0/koffi_linux_arm.tar.gz +0 -0
  7. package/build/qemu/1.1.0-beta.0/koffi_linux_arm64.tar.gz +0 -0
  8. package/build/qemu/1.1.0-beta.0/koffi_linux_ia32.tar.gz +0 -0
  9. package/build/qemu/1.1.0-beta.0/koffi_linux_x64.tar.gz +0 -0
  10. package/build/qemu/1.1.0-beta.0/koffi_win32_ia32.tar.gz +0 -0
  11. package/build/qemu/1.1.0-beta.0/koffi_win32_x64.tar.gz +0 -0
  12. package/package.json +1 -1
  13. package/qemu/qemu.js +11 -5
  14. package/qemu/registry/machines.json +20 -10
  15. package/src/abi_arm32.cc +130 -215
  16. package/src/abi_arm64.cc +103 -117
  17. package/src/abi_x64_sysv.cc +117 -135
  18. package/src/abi_x64_win.cc +89 -98
  19. package/src/abi_x86.cc +91 -99
  20. package/src/call.cc +164 -40
  21. package/src/call.hh +53 -31
  22. package/src/ffi.cc +163 -19
  23. package/src/ffi.hh +30 -22
  24. package/src/util.cc +0 -127
  25. package/src/util.hh +0 -16
  26. package/test/misc.c +68 -2
  27. package/vendor/libcc/libcc.hh +1 -1
  28. package/build/qemu/1.0.3/koffi_darwin_x64.tar.gz +0 -0
  29. package/build/qemu/1.0.3/koffi_freebsd_arm64.tar.gz +0 -0
  30. package/build/qemu/1.0.3/koffi_freebsd_ia32.tar.gz +0 -0
  31. package/build/qemu/1.0.3/koffi_freebsd_x64.tar.gz +0 -0
  32. package/build/qemu/1.0.3/koffi_linux_arm.tar.gz +0 -0
  33. package/build/qemu/1.0.3/koffi_linux_arm64.tar.gz +0 -0
  34. package/build/qemu/1.0.3/koffi_linux_ia32.tar.gz +0 -0
  35. package/build/qemu/1.0.3/koffi_linux_x64.tar.gz +0 -0
  36. package/build/qemu/1.0.3/koffi_win32_ia32.tar.gz +0 -0
  37. package/build/qemu/1.0.3/koffi_win32_x64.tar.gz +0 -0
  38. package/test/misc.js +0 -180
  39. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
  40. package/vendor/node-addon-api/CONTRIBUTING.md +0 -93
  41. package/vendor/node-addon-api/appveyor.yml +0 -37
  42. package/vendor/node-addon-api/benchmark/README.md +0 -47
  43. package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
  44. package/vendor/node-addon-api/benchmark/function_args.cc +0 -217
  45. package/vendor/node-addon-api/benchmark/function_args.js +0 -60
  46. package/vendor/node-addon-api/benchmark/index.js +0 -34
  47. package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -91
  48. package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -37
  49. package/vendor/node-addon-api/doc/addon.md +0 -163
  50. package/vendor/node-addon-api/doc/array.md +0 -81
  51. package/vendor/node-addon-api/doc/array_buffer.md +0 -155
  52. package/vendor/node-addon-api/doc/async_context.md +0 -86
  53. package/vendor/node-addon-api/doc/async_operations.md +0 -31
  54. package/vendor/node-addon-api/doc/async_worker.md +0 -427
  55. package/vendor/node-addon-api/doc/async_worker_variants.md +0 -557
  56. package/vendor/node-addon-api/doc/bigint.md +0 -97
  57. package/vendor/node-addon-api/doc/boolean.md +0 -68
  58. package/vendor/node-addon-api/doc/buffer.md +0 -150
  59. package/vendor/node-addon-api/doc/callback_scope.md +0 -54
  60. package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
  61. package/vendor/node-addon-api/doc/checker-tool.md +0 -32
  62. package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
  63. package/vendor/node-addon-api/doc/cmake-js.md +0 -68
  64. package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
  65. package/vendor/node-addon-api/doc/creating_a_release.md +0 -62
  66. package/vendor/node-addon-api/doc/dataview.md +0 -248
  67. package/vendor/node-addon-api/doc/date.md +0 -68
  68. package/vendor/node-addon-api/doc/env.md +0 -196
  69. package/vendor/node-addon-api/doc/error.md +0 -120
  70. package/vendor/node-addon-api/doc/error_handling.md +0 -254
  71. package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
  72. package/vendor/node-addon-api/doc/external.md +0 -63
  73. package/vendor/node-addon-api/doc/function.md +0 -402
  74. package/vendor/node-addon-api/doc/function_reference.md +0 -238
  75. package/vendor/node-addon-api/doc/generator.md +0 -13
  76. package/vendor/node-addon-api/doc/handle_scope.md +0 -63
  77. package/vendor/node-addon-api/doc/hierarchy.md +0 -91
  78. package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
  79. package/vendor/node-addon-api/doc/maybe.md +0 -76
  80. package/vendor/node-addon-api/doc/memory_management.md +0 -27
  81. package/vendor/node-addon-api/doc/name.md +0 -29
  82. package/vendor/node-addon-api/doc/node-gyp.md +0 -82
  83. package/vendor/node-addon-api/doc/number.md +0 -163
  84. package/vendor/node-addon-api/doc/object.md +0 -411
  85. package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
  86. package/vendor/node-addon-api/doc/object_reference.md +0 -117
  87. package/vendor/node-addon-api/doc/object_wrap.md +0 -588
  88. package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
  89. package/vendor/node-addon-api/doc/promises.md +0 -79
  90. package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
  91. package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
  92. package/vendor/node-addon-api/doc/range_error.md +0 -59
  93. package/vendor/node-addon-api/doc/reference.md +0 -113
  94. package/vendor/node-addon-api/doc/setup.md +0 -110
  95. package/vendor/node-addon-api/doc/string.md +0 -93
  96. package/vendor/node-addon-api/doc/symbol.md +0 -61
  97. package/vendor/node-addon-api/doc/threadsafe.md +0 -121
  98. package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
  99. package/vendor/node-addon-api/doc/type_error.md +0 -59
  100. package/vendor/node-addon-api/doc/typed_array.md +0 -78
  101. package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
  102. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
  103. package/vendor/node-addon-api/doc/value.md +0 -340
  104. package/vendor/node-addon-api/doc/version_management.md +0 -43
  105. package/vendor/node-addon-api/package.json +0 -415
  106. package/vendor/node-addon-api/test/README.md +0 -91
  107. package/vendor/node-addon-api/test/addon.cc +0 -36
  108. package/vendor/node-addon-api/test/addon.js +0 -11
  109. package/vendor/node-addon-api/test/addon_build/index.js +0 -49
  110. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -17
  111. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -62
  112. package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
  113. package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
  114. package/vendor/node-addon-api/test/addon_data.cc +0 -99
  115. package/vendor/node-addon-api/test/addon_data.js +0 -46
  116. package/vendor/node-addon-api/test/array_buffer.cc +0 -243
  117. package/vendor/node-addon-api/test/array_buffer.js +0 -69
  118. package/vendor/node-addon-api/test/async_context.cc +0 -36
  119. package/vendor/node-addon-api/test/async_context.js +0 -122
  120. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -83
  121. package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -46
  122. package/vendor/node-addon-api/test/async_progress_worker.cc +0 -134
  123. package/vendor/node-addon-api/test/async_progress_worker.js +0 -61
  124. package/vendor/node-addon-api/test/async_worker.cc +0 -106
  125. package/vendor/node-addon-api/test/async_worker.js +0 -179
  126. package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -13
  127. package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
  128. package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
  129. package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
  130. package/vendor/node-addon-api/test/basic_types/array.js +0 -35
  131. package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -38
  132. package/vendor/node-addon-api/test/basic_types/boolean.js +0 -35
  133. package/vendor/node-addon-api/test/basic_types/number.cc +0 -99
  134. package/vendor/node-addon-api/test/basic_types/number.js +0 -114
  135. package/vendor/node-addon-api/test/basic_types/value.cc +0 -120
  136. package/vendor/node-addon-api/test/basic_types/value.js +0 -133
  137. package/vendor/node-addon-api/test/bigint.cc +0 -91
  138. package/vendor/node-addon-api/test/bigint.js +0 -53
  139. package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
  140. package/vendor/node-addon-api/test/binding.cc +0 -173
  141. package/vendor/node-addon-api/test/binding.gyp +0 -124
  142. package/vendor/node-addon-api/test/buffer.cc +0 -183
  143. package/vendor/node-addon-api/test/buffer.js +0 -69
  144. package/vendor/node-addon-api/test/callbackscope.cc +0 -22
  145. package/vendor/node-addon-api/test/callbackscope.js +0 -49
  146. package/vendor/node-addon-api/test/common/index.js +0 -114
  147. package/vendor/node-addon-api/test/common/test_helper.h +0 -71
  148. package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
  149. package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
  150. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
  151. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -90
  152. package/vendor/node-addon-api/test/date.cc +0 -44
  153. package/vendor/node-addon-api/test/date.js +0 -18
  154. package/vendor/node-addon-api/test/env_cleanup.cc +0 -88
  155. package/vendor/node-addon-api/test/env_cleanup.js +0 -56
  156. package/vendor/node-addon-api/test/error.cc +0 -287
  157. package/vendor/node-addon-api/test/error.js +0 -81
  158. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
  159. package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
  160. package/vendor/node-addon-api/test/error_terminating_environment.js +0 -95
  161. package/vendor/node-addon-api/test/external.cc +0 -81
  162. package/vendor/node-addon-api/test/external.js +0 -88
  163. package/vendor/node-addon-api/test/function.cc +0 -324
  164. package/vendor/node-addon-api/test/function.js +0 -133
  165. package/vendor/node-addon-api/test/function_reference.cc +0 -202
  166. package/vendor/node-addon-api/test/function_reference.js +0 -157
  167. package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
  168. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
  169. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -61
  170. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
  171. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -57
  172. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
  173. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -48
  174. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
  175. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -58
  176. package/vendor/node-addon-api/test/handlescope.cc +0 -60
  177. package/vendor/node-addon-api/test/handlescope.js +0 -14
  178. package/vendor/node-addon-api/test/index.js +0 -159
  179. package/vendor/node-addon-api/test/maybe/check.cc +0 -23
  180. package/vendor/node-addon-api/test/maybe/index.js +0 -38
  181. package/vendor/node-addon-api/test/memory_management.cc +0 -17
  182. package/vendor/node-addon-api/test/memory_management.js +0 -9
  183. package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
  184. package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
  185. package/vendor/node-addon-api/test/name.cc +0 -108
  186. package/vendor/node-addon-api/test/name.js +0 -59
  187. package/vendor/node-addon-api/test/napi_child.js +0 -14
  188. package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
  189. package/vendor/node-addon-api/test/object/delete_property.js +0 -41
  190. package/vendor/node-addon-api/test/object/finalizer.cc +0 -29
  191. package/vendor/node-addon-api/test/object/finalizer.js +0 -28
  192. package/vendor/node-addon-api/test/object/get_property.cc +0 -34
  193. package/vendor/node-addon-api/test/object/get_property.js +0 -40
  194. package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
  195. package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
  196. package/vendor/node-addon-api/test/object/has_property.cc +0 -38
  197. package/vendor/node-addon-api/test/object/has_property.js +0 -37
  198. package/vendor/node-addon-api/test/object/object.cc +0 -350
  199. package/vendor/node-addon-api/test/object/object.js +0 -217
  200. package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -66
  201. package/vendor/node-addon-api/test/object/object_deprecated.js +0 -47
  202. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
  203. package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
  204. package/vendor/node-addon-api/test/object/set_property.cc +0 -45
  205. package/vendor/node-addon-api/test/object/set_property.js +0 -30
  206. package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
  207. package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
  208. package/vendor/node-addon-api/test/object_reference.cc +0 -219
  209. package/vendor/node-addon-api/test/object_reference.js +0 -259
  210. package/vendor/node-addon-api/test/objectwrap.cc +0 -268
  211. package/vendor/node-addon-api/test/objectwrap.js +0 -284
  212. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
  213. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
  214. package/vendor/node-addon-api/test/objectwrap_function.cc +0 -45
  215. package/vendor/node-addon-api/test/objectwrap_function.js +0 -22
  216. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
  217. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
  218. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
  219. package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -40
  220. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -19
  221. package/vendor/node-addon-api/test/promise.cc +0 -29
  222. package/vendor/node-addon-api/test/promise.js +0 -18
  223. package/vendor/node-addon-api/test/reference.cc +0 -24
  224. package/vendor/node-addon-api/test/reference.js +0 -14
  225. package/vendor/node-addon-api/test/run_script.cc +0 -56
  226. package/vendor/node-addon-api/test/run_script.js +0 -45
  227. package/vendor/node-addon-api/test/symbol.cc +0 -79
  228. package/vendor/node-addon-api/test/symbol.js +0 -73
  229. package/vendor/node-addon-api/test/testUtil.js +0 -54
  230. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -195
  231. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -188
  232. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -63
  233. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -12
  234. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -115
  235. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
  236. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -26
  237. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
  238. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -225
  239. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
  240. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -42
  241. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -53
  242. package/vendor/node-addon-api/test/thunking_manual.cc +0 -140
  243. package/vendor/node-addon-api/test/thunking_manual.js +0 -17
  244. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
  245. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
  246. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -68
  247. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -12
  248. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
  249. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
  250. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -28
  251. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -7
  252. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
  253. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
  254. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -53
  255. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -53
  256. package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
  257. package/vendor/node-addon-api/test/typedarray.cc +0 -216
  258. package/vendor/node-addon-api/test/typedarray.js +0 -69
  259. package/vendor/node-addon-api/test/version_management.cc +0 -27
  260. package/vendor/node-addon-api/test/version_management.js +0 -31
  261. package/vendor/node-addon-api/unit-test/README.md +0 -28
  262. package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
  263. package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
  264. package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
  265. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
  266. package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
  267. package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
  268. package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
  269. package/vendor/node-addon-api/unit-test/setup.js +0 -13
  270. package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
  271. package/vendor/node-addon-api/unit-test/test.js +0 -30
@@ -51,28 +51,19 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
51
51
  return true;
52
52
  }
53
53
 
54
- Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
54
+ bool CallData::Prepare(const Napi::CallbackInfo &info)
55
55
  {
56
- // Sanity checks
57
- if (info.Length() < (uint32_t)func->parameters.len) {
58
- ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
59
- return env.Null();
60
- }
61
-
62
- uint8_t *return_ptr = nullptr;
63
56
  uint64_t *args_ptr = nullptr;
64
57
 
65
58
  // Pass return value in register or through memory
66
59
  if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
67
- return env.Null();
60
+ return false;
68
61
  if (!func->ret.regular) {
69
62
  if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
70
- return env.Null();
63
+ return false;
71
64
  *(uint8_t **)(args_ptr++) = return_ptr;
72
65
  }
73
66
 
74
- LocalArray<OutObject, MaxOutParameters> out_objects;
75
-
76
67
  // Push arguments
77
68
  for (Size i = 0; i < func->parameters.len; i++) {
78
69
  const ParameterInfo &param = func->parameters[i];
@@ -86,7 +77,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
86
77
  case PrimitiveKind::Bool: {
87
78
  if (RG_UNLIKELY(!value.IsBoolean())) {
88
79
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
89
- return env.Null();
80
+ return false;
90
81
  }
91
82
 
92
83
  bool b = value.As<Napi::Boolean>();
@@ -103,41 +94,23 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
103
94
  case PrimitiveKind::UInt64: {
104
95
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
105
96
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
106
- return env.Null();
97
+ return false;
107
98
  }
108
99
 
109
100
  int64_t v = CopyNumber<int64_t>(value);
110
101
  *(args_ptr++) = (uint64_t)v;
111
102
  } break;
112
- case PrimitiveKind::Float32: {
113
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
114
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
115
- return env.Null();
116
- }
117
-
118
- float f = CopyNumber<float>(value);
119
- *(float *)(args_ptr++) = f;
120
- } break;
121
- case PrimitiveKind::Float64: {
122
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
123
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
124
- return env.Null();
125
- }
126
-
127
- double d = CopyNumber<double>(value);
128
- *(double *)(args_ptr++) = d;
129
- } break;
130
103
  case PrimitiveKind::String: {
131
104
  const char *str;
132
105
  if (RG_LIKELY(value.IsString())) {
133
106
  str = PushString(value);
134
107
  if (RG_UNLIKELY(!str))
135
- return env.Null();
108
+ return false;
136
109
  } else if (IsNullOrUndefined(value)) {
137
110
  str = nullptr;
138
111
  } else {
139
112
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
140
- return env.Null();
113
+ return false;
141
114
  }
142
115
 
143
116
  *(const char **)(args_ptr++) = str;
@@ -147,12 +120,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
147
120
  if (RG_LIKELY(value.IsString())) {
148
121
  str16 = PushString16(value);
149
122
  if (RG_UNLIKELY(!str16))
150
- return env.Null();
123
+ return false;
151
124
  } else if (IsNullOrUndefined(value)) {
152
125
  str16 = nullptr;
153
126
  } else {
154
127
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
155
- return env.Null();
128
+ return false;
156
129
  }
157
130
 
158
131
  *(const char16_t **)(args_ptr++) = str16;
@@ -166,32 +139,34 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
166
139
  Napi::Object obj = value.As<Napi::Object>();
167
140
 
168
141
  if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
169
- return env.Null();
142
+ return false;
170
143
 
171
144
  if (param.directions & 1) {
172
145
  if (!PushObject(obj, param.type->ref, ptr))
173
- return env.Null();
146
+ return false;
174
147
  } else {
175
148
  memset(ptr, 0, param.type->size);
176
149
  }
177
150
  if (param.directions & 2) {
178
- OutObject out = {obj, ptr, param.type->ref};
179
- out_objects.Append(out);
151
+ OutObject *out = out_objects.AppendDefault();
152
+
153
+ out->ref.Reset(obj, 1);
154
+ out->ptr = ptr;
155
+ out->type = param.type->ref;
180
156
  }
181
157
  } else if (IsNullOrUndefined(value)) {
182
158
  ptr = nullptr;
183
159
  } else {
184
160
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
185
- return env.Null();
161
+ return false;
186
162
  }
187
163
 
188
164
  *(uint8_t **)(args_ptr++) = ptr;
189
165
  } break;
190
-
191
166
  case PrimitiveKind::Record: {
192
167
  if (RG_UNLIKELY(!IsObject(value))) {
193
168
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
194
- return env.Null();
169
+ return false;
195
170
  }
196
171
 
197
172
  uint8_t *ptr;
@@ -199,93 +174,109 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
199
174
  ptr = (uint8_t *)(args_ptr++);
200
175
  } else {
201
176
  if (RG_UNLIKELY(!AllocHeap(param.type->size, 16, &ptr)))
202
- return env.Null();
177
+ return false;
203
178
  *(uint8_t **)(args_ptr++) = ptr;
204
179
  }
205
180
 
206
181
  Napi::Object obj = value.As<Napi::Object>();
207
182
  if (!PushObject(obj, param.type, ptr))
208
- return env.Null();
183
+ return false;
184
+ } break;
185
+ case PrimitiveKind::Float32: {
186
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
187
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
188
+ return false;
189
+ }
190
+
191
+ float f = CopyNumber<float>(value);
192
+ *(float *)(args_ptr++) = f;
193
+ } break;
194
+ case PrimitiveKind::Float64: {
195
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
196
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
197
+ return false;
198
+ }
199
+
200
+ double d = CopyNumber<double>(value);
201
+ *(double *)(args_ptr++) = d;
209
202
  } break;
210
203
  }
211
204
  }
212
205
 
213
- if (instance->debug) {
214
- DumpDebug();
215
- }
206
+ stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
207
+ heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
216
208
 
209
+ return true;
210
+ }
211
+
212
+ void CallData::Execute()
213
+ {
217
214
  #define PERFORM_CALL(Suffix) \
218
215
  ([&]() { \
219
- auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, GetSP()) \
220
- : ForwardCall ## Suffix(func->func, GetSP())); \
221
- PopOutArguments(out_objects); \
216
+ auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
217
+ : ForwardCall ## Suffix(func->func, stack.ptr)); \
222
218
  return ret; \
223
219
  })()
224
220
 
225
- // Execute and convert return value
226
221
  switch (func->ret.type->primitive) {
227
- case PrimitiveKind::Void: {
228
- PERFORM_CALL(G);
229
- return env.Null();
230
- } break;
231
- case PrimitiveKind::Bool: {
232
- uint64_t rax = PERFORM_CALL(G);
233
- return Napi::Boolean::New(env, rax);
234
- } break;
222
+ case PrimitiveKind::Void:
223
+ case PrimitiveKind::Bool:
235
224
  case PrimitiveKind::Int8:
236
225
  case PrimitiveKind::UInt8:
237
226
  case PrimitiveKind::Int16:
238
227
  case PrimitiveKind::UInt16:
239
228
  case PrimitiveKind::Int32:
240
- case PrimitiveKind::UInt32: {
241
- uint64_t rax = PERFORM_CALL(G);
242
- return Napi::Number::New(env, (double)rax);
243
- } break;
244
- case PrimitiveKind::Int64: {
245
- uint64_t rax = PERFORM_CALL(G);
246
- return Napi::BigInt::New(env, (int64_t)rax);
247
- } break;
248
- case PrimitiveKind::UInt64: {
249
- uint64_t rax = PERFORM_CALL(G);
250
- return Napi::BigInt::New(env, rax);
251
- } break;
252
- case PrimitiveKind::Float32: {
253
- float f = PERFORM_CALL(F);
254
- return Napi::Number::New(env, (double)f);
255
- } break;
256
- case PrimitiveKind::Float64: {
257
- double d = PERFORM_CALL(D);
258
- return Napi::Number::New(env, d);
259
- } break;
260
- case PrimitiveKind::String: {
261
- uint64_t rax = PERFORM_CALL(G);
262
- return Napi::String::New(env, (const char *)rax);
263
- } break;
264
- case PrimitiveKind::String16: {
265
- uint64_t rax = PERFORM_CALL(G);
266
- return Napi::String::New(env, (const char16_t *)rax);
267
- } break;
268
- case PrimitiveKind::Pointer: {
269
- uint64_t rax = PERFORM_CALL(G);
270
- void *ptr = (void *)rax;
229
+ case PrimitiveKind::UInt32:
230
+ case PrimitiveKind::Int64:
231
+ case PrimitiveKind::UInt64:
232
+ case PrimitiveKind::String:
233
+ case PrimitiveKind::String16:
234
+ case PrimitiveKind::Pointer:
235
+ case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
236
+ case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
237
+ case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
238
+ }
271
239
 
272
- Napi::External<void> external = Napi::External<void>::New(env, ptr);
240
+ #undef PERFORM_CALL
241
+ }
242
+
243
+ Napi::Value CallData::Complete()
244
+ {
245
+ for (const OutObject &out: out_objects) {
246
+ Napi::Object obj = out.ref.Value().As<Napi::Object>();
247
+ PopObject(obj, out.ptr, out.type);
248
+ }
249
+
250
+ switch (func->ret.type->primitive) {
251
+ case PrimitiveKind::Void: return env.Null();
252
+ case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
253
+ case PrimitiveKind::Int8:
254
+ case PrimitiveKind::UInt8:
255
+ case PrimitiveKind::Int16:
256
+ case PrimitiveKind::UInt16:
257
+ case PrimitiveKind::Int32:
258
+ case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
259
+ case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
260
+ case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
261
+ case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
262
+ case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
263
+ case PrimitiveKind::Pointer: {
264
+ Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
273
265
  SetValueTag(instance, external, func->ret.type);
274
266
 
275
267
  return external;
276
268
  } break;
277
-
278
269
  case PrimitiveKind::Record: {
279
- uint64_t rax = PERFORM_CALL(G);
280
- const uint8_t *ptr = return_ptr ? return_ptr : (const uint8_t *)&rax;
270
+ const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
271
+ : (const uint8_t *)&result.buf;
281
272
 
282
- Napi::Object obj = PopObject(env, ptr, func->ret.type);
273
+ Napi::Object obj = PopObject(ptr, func->ret.type);
283
274
  return obj;
284
275
  } break;
276
+ case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
277
+ case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
285
278
  }
286
279
 
287
- #undef PERFORM_CALL
288
-
289
280
  RG_UNREACHABLE();
290
281
  }
291
282
 
package/src/abi_x86.cc CHANGED
@@ -82,33 +82,24 @@ bool AnalyseFunction(InstanceData *instance, FunctionInfo *func)
82
82
  return true;
83
83
  }
84
84
 
85
- Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
85
+ bool CallData::Prepare(const Napi::CallbackInfo &info)
86
86
  {
87
- // Sanity checks
88
- if (info.Length() < (uint32_t)func->parameters.len) {
89
- ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
90
- return env.Null();
91
- }
92
-
93
- uint8_t *return_ptr = nullptr;
94
87
  uint32_t *args_ptr = nullptr;
95
88
  uint32_t *fast_ptr = nullptr;
96
89
 
97
90
  // Pass return value in register or through memory
98
91
  if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
99
- return env.Null();
92
+ return false;
100
93
  if (func->convention == CallConvention::Fastcall) {
101
94
  fast_ptr = args_ptr;
102
95
  args_ptr += 4;
103
96
  }
104
97
  if (!func->ret.trivial) {
105
98
  if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
106
- return env.Null();
99
+ return false;
107
100
  *((func->ret.fast ? fast_ptr : args_ptr)++) = (uint32_t)return_ptr;
108
101
  }
109
102
 
110
- LocalArray<OutObject, MaxOutParameters> out_objects;
111
-
112
103
  // Push arguments
113
104
  for (Size i = 0; i < func->parameters.len; i++) {
114
105
  const ParameterInfo &param = func->parameters[i];
@@ -122,7 +113,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
122
113
  case PrimitiveKind::Bool: {
123
114
  if (RG_UNLIKELY(!value.IsBoolean())) {
124
115
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
125
- return env.Null();
116
+ return false;
126
117
  }
127
118
 
128
119
  bool b = value.As<Napi::Boolean>();
@@ -136,7 +127,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
136
127
  case PrimitiveKind::UInt32: {
137
128
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
138
129
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
139
- return env.Null();
130
+ return false;
140
131
  }
141
132
 
142
133
  int32_t v = CopyNumber<int32_t>(value);
@@ -146,43 +137,24 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
146
137
  case PrimitiveKind::UInt64: {
147
138
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
148
139
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
149
- return env.Null();
140
+ return false;
150
141
  }
151
142
 
152
143
  int64_t v = CopyNumber<int64_t>(value);
153
144
  *(uint64_t *)args_ptr = (uint64_t)v;
154
145
  args_ptr += 2;
155
146
  } break;
156
- case PrimitiveKind::Float32: {
157
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
158
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
159
- return env.Null();
160
- }
161
-
162
- float f = CopyNumber<float>(value);
163
- *(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
164
- } break;
165
- case PrimitiveKind::Float64: {
166
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
167
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
168
- return env.Null();
169
- }
170
-
171
- double d = CopyNumber<double>(value);
172
- *(double *)args_ptr = d;
173
- args_ptr += 2;
174
- } break;
175
147
  case PrimitiveKind::String: {
176
148
  const char *str;
177
149
  if (RG_LIKELY(value.IsString())) {
178
150
  str = PushString(value);
179
151
  if (RG_UNLIKELY(!str))
180
- return env.Null();
152
+ return false;
181
153
  } else if (IsNullOrUndefined(value)) {
182
154
  str = nullptr;
183
155
  } else {
184
156
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
185
- return env.Null();
157
+ return false;
186
158
  }
187
159
 
188
160
  *(const char **)((param.fast ? fast_ptr : args_ptr)++) = str;
@@ -192,12 +164,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
192
164
  if (RG_LIKELY(value.IsString())) {
193
165
  str16 = PushString16(value);
194
166
  if (RG_UNLIKELY(!str16))
195
- return env.Null();
167
+ return false;
196
168
  } else if (IsNullOrUndefined(value)) {
197
169
  str16 = nullptr;
198
170
  } else {
199
171
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
200
- return env.Null();
172
+ return false;
201
173
  }
202
174
 
203
175
  *(const char16_t **)((param.fast ? fast_ptr : args_ptr)++) = str16;
@@ -211,32 +183,34 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
211
183
  Napi::Object obj = value.As<Napi::Object>();
212
184
 
213
185
  if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
214
- return env.Null();
186
+ return false;
215
187
 
216
188
  if (param.directions & 1) {
217
189
  if (!PushObject(obj, param.type->ref, ptr))
218
- return env.Null();
190
+ return false;
219
191
  } else {
220
192
  memset(ptr, 0, param.type->size);
221
193
  }
222
194
  if (param.directions & 2) {
223
- OutObject out = {obj, ptr, param.type->ref};
224
- out_objects.Append(out);
195
+ OutObject *out = out_objects.AppendDefault();
196
+
197
+ out->ref.Reset(obj, 1);
198
+ out->ptr = ptr;
199
+ out->type = param.type->ref;
225
200
  }
226
201
  } else if (IsNullOrUndefined(value)) {
227
202
  ptr = nullptr;
228
203
  } else {
229
204
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
230
- return env.Null();
205
+ return false;
231
206
  }
232
207
 
233
208
  *(uint8_t **)((param.fast ? fast_ptr : args_ptr)++) = ptr;
234
209
  } break;
235
-
236
210
  case PrimitiveKind::Record: {
237
211
  if (RG_UNLIKELY(!IsObject(value))) {
238
212
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
239
- return env.Null();
213
+ return false;
240
214
  }
241
215
 
242
216
  Napi::Object obj = value.As<Napi::Object>();
@@ -244,93 +218,111 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
244
218
  if (param.fast) {
245
219
  uint8_t *ptr = (uint8_t *)(fast_ptr++);
246
220
  if (!PushObject(obj, param.type, ptr))
247
- return env.Null();
221
+ return false;
248
222
  } else {
249
223
  uint8_t *ptr = (uint8_t *)AlignUp(args_ptr, param.type->align);
250
224
  if (!PushObject(obj, param.type, ptr))
251
- return env.Null();
225
+ return false;
252
226
  args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
253
227
  }
254
228
  } break;
229
+ case PrimitiveKind::Float32: {
230
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
231
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
232
+ return false;
233
+ }
234
+
235
+ float f = CopyNumber<float>(value);
236
+ *(float *)((param.fast ? fast_ptr : args_ptr)++) = f;
237
+ } break;
238
+ case PrimitiveKind::Float64: {
239
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
240
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
241
+ return false;
242
+ }
243
+
244
+ double d = CopyNumber<double>(value);
245
+ *(double *)args_ptr = d;
246
+ args_ptr += 2;
247
+ } break;
255
248
  }
256
249
  }
257
250
 
258
- if (instance->debug) {
259
- DumpDebug();
260
- }
251
+ stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
252
+ heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
261
253
 
254
+ return true;
255
+ }
256
+
257
+ void CallData::Execute()
258
+ {
262
259
  #define PERFORM_CALL(Suffix) \
263
260
  ([&]() { \
264
- auto ret = (func->convention == CallConvention::Fastcall ? ForwardCallR ## Suffix(func->func, GetSP()) \
265
- : ForwardCall ## Suffix(func->func, GetSP())); \
266
- PopOutArguments(out_objects); \
261
+ auto ret = (func->convention == CallConvention::Fastcall ? ForwardCallR ## Suffix(func->func, stack.ptr) \
262
+ : ForwardCall ## Suffix(func->func, stack.ptr)); \
267
263
  return ret; \
268
264
  })()
269
265
 
270
266
  // Execute and convert return value
271
267
  switch (func->ret.type->primitive) {
272
- case PrimitiveKind::Void: {
273
- PERFORM_CALL(G);
274
- return env.Null();
275
- } break;
276
- case PrimitiveKind::Bool: {
277
- uint32_t rax = (uint32_t)PERFORM_CALL(G);
278
- return Napi::Boolean::New(env, rax);
279
- } break;
268
+ case PrimitiveKind::Void:
269
+ case PrimitiveKind::Bool:
280
270
  case PrimitiveKind::Int8:
281
271
  case PrimitiveKind::UInt8:
282
272
  case PrimitiveKind::Int16:
283
273
  case PrimitiveKind::UInt16:
284
274
  case PrimitiveKind::Int32:
285
- case PrimitiveKind::UInt32: {
286
- uint32_t rax = (uint32_t)PERFORM_CALL(G);
287
- return Napi::Number::New(env, (double)rax);
288
- } break;
289
- case PrimitiveKind::Int64: {
290
- uint64_t ret = PERFORM_CALL(G);
291
- return Napi::BigInt::New(env, (int64_t)ret);
292
- } break;
293
- case PrimitiveKind::UInt64: {
294
- uint64_t ret = PERFORM_CALL(G);
295
- return Napi::BigInt::New(env, ret);
296
- } break;
297
- case PrimitiveKind::Float32: {
298
- float f = PERFORM_CALL(F);
299
- return Napi::Number::New(env, (double)f);
300
- } break;
301
- case PrimitiveKind::Float64: {
302
- double d = PERFORM_CALL(D);
303
- return Napi::Number::New(env, d);
304
- } break;
305
- case PrimitiveKind::String: {
306
- uint32_t rax = (uint32_t)PERFORM_CALL(G);
307
- return Napi::String::New(env, (const char *)rax);
308
- } break;
309
- case PrimitiveKind::String16: {
310
- uint32_t rax = (uint32_t)PERFORM_CALL(G);
311
- return Napi::String::New(env, (const char16_t *)rax);
312
- } break;
313
- case PrimitiveKind::Pointer: {
314
- uint32_t rax = (uint32_t)PERFORM_CALL(G);
315
- void *ptr = (void *)rax;
275
+ case PrimitiveKind::UInt32:
276
+ case PrimitiveKind::Int64:
277
+ case PrimitiveKind::UInt64:
278
+ case PrimitiveKind::String:
279
+ case PrimitiveKind::String16:
280
+ case PrimitiveKind::Pointer:
281
+ case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
282
+ case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
283
+ case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
284
+ }
316
285
 
317
- Napi::External<void> external = Napi::External<void>::New(env, ptr);
286
+ #undef PERFORM_CALL
287
+ }
288
+
289
+ Napi::Value CallData::Complete()
290
+ {
291
+ for (const OutObject &out: out_objects) {
292
+ Napi::Object obj = out.ref.Value().As<Napi::Object>();
293
+ PopObject(obj, out.ptr, out.type);
294
+ }
295
+
296
+ switch (func->ret.type->primitive) {
297
+ case PrimitiveKind::Void: return env.Null();
298
+ case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
299
+ case PrimitiveKind::Int8:
300
+ case PrimitiveKind::UInt8:
301
+ case PrimitiveKind::Int16:
302
+ case PrimitiveKind::UInt16:
303
+ case PrimitiveKind::Int32:
304
+ case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
305
+ case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
306
+ case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
307
+ case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
308
+ case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
309
+ case PrimitiveKind::Pointer: {
310
+ Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
318
311
  SetValueTag(instance, external, func->ret.type);
319
312
 
320
313
  return external;
321
314
  } break;
322
-
323
315
  case PrimitiveKind::Record: {
324
- uint64_t ret = PERFORM_CALL(G);
325
- const uint8_t *ptr = return_ptr ? return_ptr : (const uint8_t *)&ret;
316
+ const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
317
+ : (const uint8_t *)&result.buf;
326
318
 
327
- Napi::Object obj = PopObject(env, ptr, func->ret.type);
319
+ Napi::Object obj = PopObject(ptr, func->ret.type);
328
320
  return obj;
329
321
  } break;
322
+ case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
323
+ case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
330
324
  }
331
325
 
332
- #undef PERFORM_CALL
333
-
334
326
  RG_UNREACHABLE();
335
327
  }
336
328