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
@@ -181,34 +181,25 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
181
181
  return true;
182
182
  }
183
183
 
184
- Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
184
+ bool CallData::Prepare(const Napi::CallbackInfo &info)
185
185
  {
186
- // Sanity checks
187
- if (info.Length() < (uint32_t)func->parameters.len) {
188
- ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
189
- return env.Null();
190
- }
191
-
192
- uint8_t *return_ptr = nullptr;
193
186
  uint8_t *args_ptr = nullptr;
194
187
  uint64_t *gpr_ptr = nullptr;
195
188
  uint64_t *xmm_ptr = nullptr;
196
189
 
197
190
  // Return through registers unless it's too big
198
191
  if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
199
- return env.Null();
192
+ return false;
200
193
  if (RG_UNLIKELY(!AllocStack(8 * 8, 8, &xmm_ptr)))
201
- return env.Null();
194
+ return false;
202
195
  if (RG_UNLIKELY(!AllocStack(6 * 8, 8, &gpr_ptr)))
203
- return env.Null();
196
+ return false;
204
197
  if (func->ret.use_memory) {
205
198
  if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
206
- return env.Null();
199
+ return false;
207
200
  *(uint8_t **)(gpr_ptr++) = return_ptr;
208
201
  }
209
202
 
210
- LocalArray<OutObject, MaxOutParameters> out_objects;
211
-
212
203
  // Push arguments
213
204
  for (Size i = 0; i < func->parameters.len; i++) {
214
205
  const ParameterInfo &param = func->parameters[i];
@@ -222,7 +213,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
222
213
  case PrimitiveKind::Bool: {
223
214
  if (RG_UNLIKELY(!value.IsBoolean())) {
224
215
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argmument %2, expected boolean", GetValueType(instance, value), i + 1);
225
- return env.Null();
216
+ return false;
226
217
  }
227
218
 
228
219
  bool b = value.As<Napi::Boolean>();
@@ -244,7 +235,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
244
235
  case PrimitiveKind::UInt64: {
245
236
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
246
237
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
247
- return env.Null();
238
+ return false;
248
239
  }
249
240
 
250
241
  int64_t v = CopyNumber<int64_t>(value);
@@ -257,49 +248,17 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
257
248
  args_ptr += 8;
258
249
  }
259
250
  } break;
260
- case PrimitiveKind::Float32: {
261
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
262
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
263
- return env.Null();
264
- }
265
-
266
- float f = CopyNumber<float>(value);
267
-
268
- if (RG_LIKELY(param.xmm_count)) {
269
- memcpy(xmm_ptr++, &f, 4);
270
- } else {
271
- args_ptr = AlignUp(args_ptr, 4);
272
- memcpy(args_ptr, &f, 4);
273
- args_ptr += 8;
274
- }
275
- } break;
276
- case PrimitiveKind::Float64: {
277
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
278
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
279
- return env.Null();
280
- }
281
-
282
- double d = CopyNumber<double>(value);
283
-
284
- if (RG_LIKELY(param.xmm_count)) {
285
- memcpy(xmm_ptr++, &d, 8);
286
- } else {
287
- args_ptr = AlignUp(args_ptr, 8);
288
- memcpy(args_ptr, &d, 8);
289
- args_ptr += 8;
290
- }
291
- } break;
292
251
  case PrimitiveKind::String: {
293
252
  const char *str;
294
253
  if (RG_LIKELY(value.IsString())) {
295
254
  str = PushString(value);
296
255
  if (RG_UNLIKELY(!str))
297
- return env.Null();
256
+ return false;
298
257
  } else if (IsNullOrUndefined(value)) {
299
258
  str = nullptr;
300
259
  } else {
301
260
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
302
- return env.Null();
261
+ return false;
303
262
  }
304
263
 
305
264
  if (RG_LIKELY(param.gpr_count)) {
@@ -315,12 +274,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
315
274
  if (RG_LIKELY(value.IsString())) {
316
275
  str16 = PushString16(value);
317
276
  if (RG_UNLIKELY(!str16))
318
- return env.Null();
277
+ return false;
319
278
  } else if (IsNullOrUndefined(value)) {
320
279
  str16 = nullptr;
321
280
  } else {
322
281
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
323
- return env.Null();
282
+ return false;
324
283
  }
325
284
 
326
285
  if (RG_LIKELY(param.gpr_count)) {
@@ -340,23 +299,26 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
340
299
  Napi::Object obj = value.As<Napi::Object>();
341
300
 
342
301
  if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
343
- return env.Null();
302
+ return false;
344
303
 
345
304
  if (param.directions & 1) {
346
305
  if (!PushObject(obj, param.type->ref, ptr))
347
- return env.Null();
306
+ return false;
348
307
  } else {
349
308
  memset(ptr, 0, param.type->size);
350
309
  }
351
310
  if (param.directions & 2) {
352
- OutObject out = {obj, ptr, param.type->ref};
353
- out_objects.Append(out);
311
+ OutObject *out = out_objects.AppendDefault();
312
+
313
+ out->ref.Reset(obj, 1);
314
+ out->ptr = ptr;
315
+ out->type = param.type->ref;
354
316
  }
355
317
  } else if (IsNullOrUndefined(value)) {
356
318
  ptr = nullptr;
357
319
  } else {
358
320
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
359
- return env.Null();
321
+ return false;
360
322
  }
361
323
 
362
324
  if (RG_LIKELY(param.gpr_count)) {
@@ -367,11 +329,10 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
367
329
  args_ptr += 8;
368
330
  }
369
331
  } break;
370
-
371
332
  case PrimitiveKind::Record: {
372
333
  if (RG_UNLIKELY(!IsObject(value))) {
373
334
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
374
- return env.Null();
335
+ return false;
375
336
  }
376
337
 
377
338
  Napi::Object obj = value.As<Napi::Object>();
@@ -381,7 +342,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
381
342
 
382
343
  uint64_t buf[2] = {};
383
344
  if (!PushObject(obj, param.type, (uint8_t *)buf))
384
- return env.Null();
345
+ return false;
385
346
 
386
347
  if (param.gpr_first) {
387
348
  uint64_t *ptr = buf;
@@ -405,112 +366,133 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
405
366
  } else if (param.use_memory) {
406
367
  args_ptr = AlignUp(args_ptr, param.type->align);
407
368
  if (!PushObject(obj, param.type, args_ptr))
408
- return env.Null();
369
+ return false;
409
370
  args_ptr += AlignLen(param.type->size, 8);
410
371
  }
411
372
  } break;
373
+ case PrimitiveKind::Float32: {
374
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
375
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
376
+ return false;
377
+ }
378
+
379
+ float f = CopyNumber<float>(value);
380
+
381
+ if (RG_LIKELY(param.xmm_count)) {
382
+ memcpy(xmm_ptr++, &f, 4);
383
+ } else {
384
+ args_ptr = AlignUp(args_ptr, 4);
385
+ memcpy(args_ptr, &f, 4);
386
+ args_ptr += 8;
387
+ }
388
+ } break;
389
+ case PrimitiveKind::Float64: {
390
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
391
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
392
+ return false;
393
+ }
394
+
395
+ double d = CopyNumber<double>(value);
396
+
397
+ if (RG_LIKELY(param.xmm_count)) {
398
+ memcpy(xmm_ptr++, &d, 8);
399
+ } else {
400
+ args_ptr = AlignUp(args_ptr, 8);
401
+ memcpy(args_ptr, &d, 8);
402
+ args_ptr += 8;
403
+ }
404
+ } break;
412
405
  }
413
406
  }
414
407
 
415
- if (instance->debug) {
416
- DumpDebug();
417
- }
408
+ stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
409
+ heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
418
410
 
411
+ return true;
412
+ }
413
+
414
+ void CallData::Execute()
415
+ {
419
416
  #define PERFORM_CALL(Suffix) \
420
417
  ([&]() { \
421
- auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, GetSP()) \
422
- : ForwardCall ## Suffix(func->func, GetSP())); \
423
- PopOutArguments(out_objects); \
418
+ auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
419
+ : ForwardCall ## Suffix(func->func, stack.ptr)); \
424
420
  return ret; \
425
421
  })()
426
422
 
427
423
  // Execute and convert return value
428
424
  switch (func->ret.type->primitive) {
429
- case PrimitiveKind::Void: {
430
- PERFORM_CALL(GG);
431
- return env.Null();
432
- } break;
433
- case PrimitiveKind::Bool: {
434
- RaxRdxRet ret = PERFORM_CALL(GG);
435
- return Napi::Boolean::New(env, ret.rax);
436
- } break;
425
+ case PrimitiveKind::Void:
426
+ case PrimitiveKind::Bool:
437
427
  case PrimitiveKind::Int8:
438
428
  case PrimitiveKind::UInt8:
439
429
  case PrimitiveKind::Int16:
440
430
  case PrimitiveKind::UInt16:
441
431
  case PrimitiveKind::Int32:
442
- case PrimitiveKind::UInt32: {
443
- RaxRdxRet ret = PERFORM_CALL(GG);
444
- return Napi::Number::New(env, (double)ret.rax);
445
- } break;
446
- case PrimitiveKind::Int64: {
447
- RaxRdxRet ret = PERFORM_CALL(GG);
448
- return Napi::BigInt::New(env, (int64_t)ret.rax);
449
- } break;
450
- case PrimitiveKind::UInt64: {
451
- RaxRdxRet ret = PERFORM_CALL(GG);
452
- return Napi::BigInt::New(env, ret.rax);
453
- } break;
454
- case PrimitiveKind::Float32: {
455
- float f = PERFORM_CALL(F);
456
- return Napi::Number::New(env, (double)f);
457
- } break;
458
- case PrimitiveKind::Float64: {
459
- Xmm0RaxRet ret = PERFORM_CALL(DG);
460
- return Napi::Number::New(env, ret.xmm0);
461
- } break;
462
- case PrimitiveKind::String: {
463
- RaxRdxRet ret = PERFORM_CALL(GG);
464
- return Napi::String::New(env, (const char *)ret.rax);
465
- } break;
466
- case PrimitiveKind::String16: {
467
- RaxRdxRet ret = PERFORM_CALL(GG);
468
- return Napi::String::New(env, (const char16_t *)ret.rax);
469
- } break;
470
- case PrimitiveKind::Pointer: {
471
- RaxRdxRet ret = PERFORM_CALL(GG);
472
- void *ptr = (void *)ret.rax;
473
-
474
- Napi::External<void> external = Napi::External<void>::New(env, ptr);
475
- SetValueTag(instance, external, func->ret.type);
476
-
477
- return external;
478
- } break;
479
-
432
+ case PrimitiveKind::UInt32:
433
+ case PrimitiveKind::Int64:
434
+ case PrimitiveKind::UInt64:
435
+ case PrimitiveKind::String:
436
+ case PrimitiveKind::String16:
437
+ case PrimitiveKind::Pointer: { result.u64 = PERFORM_CALL(GG).rax; } break;
480
438
  case PrimitiveKind::Record: {
481
439
  if (func->ret.gpr_first && !func->ret.xmm_count) {
482
440
  RaxRdxRet ret = PERFORM_CALL(GG);
483
-
484
- Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
485
- return obj;
441
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
486
442
  } else if (func->ret.gpr_first) {
487
443
  RaxXmm0Ret ret = PERFORM_CALL(GD);
488
-
489
- Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
490
- return obj;
491
- } else if (func->ret.xmm_count) {
444
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
445
+ } else if (func->ret.xmm_count == 2) {
446
+ Xmm0Xmm1Ret ret = PERFORM_CALL(DD);
447
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
448
+ } else {
492
449
  Xmm0RaxRet ret = PERFORM_CALL(DG);
450
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
451
+ }
452
+ } break;
453
+ case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
454
+ case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DG).xmm0; } break;
455
+ }
493
456
 
494
- Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
495
- return obj;
496
- } else if (func->ret.type->size) {
497
- RG_ASSERT(return_ptr);
457
+ #undef PERFORM_CALL
458
+ }
498
459
 
499
- RaxRdxRet ret = PERFORM_CALL(GG);
500
- RG_ASSERT(ret.rax == (uint64_t)return_ptr);
460
+ Napi::Value CallData::Complete()
461
+ {
462
+ for (const OutObject &out: out_objects) {
463
+ Napi::Object obj = out.ref.Value().As<Napi::Object>();
464
+ PopObject(obj, out.ptr, out.type);
465
+ }
501
466
 
502
- Napi::Object obj = PopObject(env, return_ptr, func->ret.type);
503
- return obj;
504
- } else {
505
- PERFORM_CALL(GG);
467
+ switch (func->ret.type->primitive) {
468
+ case PrimitiveKind::Void: return env.Null();
469
+ case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
470
+ case PrimitiveKind::Int8:
471
+ case PrimitiveKind::UInt8:
472
+ case PrimitiveKind::Int16:
473
+ case PrimitiveKind::UInt16:
474
+ case PrimitiveKind::Int32:
475
+ case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
476
+ case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
477
+ case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
478
+ case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
479
+ case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
480
+ case PrimitiveKind::Pointer: {
481
+ Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
482
+ SetValueTag(instance, external, func->ret.type);
506
483
 
507
- Napi::Object obj = Napi::Object::New(env);
508
- return obj;
509
- }
484
+ return external;
510
485
  } break;
511
- }
486
+ case PrimitiveKind::Record: {
487
+ const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
488
+ : (const uint8_t *)&result.buf;
512
489
 
513
- #undef PERFORM_CALL
490
+ Napi::Object obj = PopObject(ptr, func->ret.type);
491
+ return obj;
492
+ } break;
493
+ case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
494
+ case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
495
+ }
514
496
 
515
497
  RG_UNREACHABLE();
516
498
  }