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
package/src/abi_arm64.cc CHANGED
@@ -163,28 +163,24 @@ static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest
163
163
  InstanceData *instance = env.GetInstanceData<InstanceData>();
164
164
 
165
165
  RG_ASSERT(IsObject(obj));
166
+ RG_ASSERT(IsHFA(type));
166
167
  RG_ASSERT(type->primitive == PrimitiveKind::Record);
167
- RG_ASSERT(AlignUp(dest, 8) == dest);
168
+ RG_ASSERT(AlignUp(dest, type->members[0].type->size) == dest);
169
+
170
+ bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
168
171
 
169
172
  for (const RecordMember &member: type->members) {
170
173
  Napi::Value value = obj.Get(member.name);
171
174
 
172
- if (member.type->primitive == PrimitiveKind::Float32) {
173
- if (!value.IsNumber() && !value.IsBigInt()) {
174
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
175
- return false;
176
- }
175
+ if (!value.IsNumber() && !value.IsBigInt()) {
176
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
177
+ return false;
178
+ }
177
179
 
180
+ if (float32) {
178
181
  *(float *)dest = CopyNumber<float>(value);
179
- } else if (member.type->primitive == PrimitiveKind::Float64) {
180
- if (!value.IsNumber() && !value.IsBigInt()) {
181
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
182
- return false;
183
- }
184
-
185
- *(double *)dest = CopyNumber<double>(value);
186
182
  } else {
187
- RG_UNREACHABLE();
183
+ *(double *)dest = CopyNumber<double>(value);
188
184
  }
189
185
 
190
186
  dest += 8;
@@ -196,18 +192,19 @@ static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest
196
192
  static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *type)
197
193
  {
198
194
  RG_ASSERT(type->primitive == PrimitiveKind::Record);
195
+ RG_ASSERT(IsHFA(type));
199
196
 
200
197
  Napi::Object obj = Napi::Object::New(env);
201
198
 
199
+ bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
200
+
202
201
  for (const RecordMember &member: type->members) {
203
- if (member.type->primitive == PrimitiveKind::Float32) {
202
+ if (float32) {
204
203
  float f = *(float *)ptr;
205
204
  obj.Set(member.name, Napi::Number::New(env, (double)f));
206
- } else if (member.type->primitive == PrimitiveKind::Float64) {
205
+ } else {
207
206
  double d = *(double *)ptr;
208
207
  obj.Set(member.name, Napi::Number::New(env, d));
209
- } else {
210
- RG_UNREACHABLE();
211
208
  }
212
209
 
213
210
  ptr += 8;
@@ -216,34 +213,25 @@ static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *typ
216
213
  return obj;
217
214
  }
218
215
 
219
- Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
216
+ bool CallData::Prepare(const Napi::CallbackInfo &info)
220
217
  {
221
- // Sanity checks
222
- if (info.Length() < (uint32_t)func->parameters.len) {
223
- ThrowError<Napi::TypeError>(env, "Expected %1 arguments, got %2", func->parameters.len, info.Length());
224
- return env.Null();
225
- }
226
-
227
- uint8_t *return_ptr = nullptr;
228
218
  uint8_t *args_ptr = nullptr;
229
219
  uint64_t *gpr_ptr = nullptr;
230
220
  uint64_t *vec_ptr = nullptr;
231
221
 
232
222
  // Return through registers unless it's too big
233
223
  if (RG_UNLIKELY(!AllocStack(func->args_size, 16, &args_ptr)))
234
- return env.Null();
224
+ return false;
235
225
  if (RG_UNLIKELY(!AllocStack(8 * 8, 8, &vec_ptr)))
236
- return env.Null();
226
+ return false;
237
227
  if (RG_UNLIKELY(!AllocStack(9 * 8, 8, &gpr_ptr)))
238
- return env.Null();
228
+ return false;
239
229
  if (func->ret.use_memory) {
240
230
  if (RG_UNLIKELY(!AllocHeap(func->ret.type->size, 16, &return_ptr)))
241
- return env.Null();
231
+ return false;
242
232
  gpr_ptr[8] = (uint64_t)return_ptr;
243
233
  }
244
234
 
245
- LocalArray<OutObject, MaxOutParameters> out_objects;
246
-
247
235
  // Push arguments
248
236
  for (Size i = 0; i < func->parameters.len; i++) {
249
237
  const ParameterInfo &param = func->parameters[i];
@@ -257,7 +245,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
257
245
  case PrimitiveKind::Bool: {
258
246
  if (RG_UNLIKELY(!value.IsBoolean())) {
259
247
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected boolean", GetValueType(instance, value), i + 1);
260
- return env.Null();
248
+ return false;
261
249
  }
262
250
 
263
251
  bool b = value.As<Napi::Boolean>();
@@ -283,7 +271,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
283
271
  case PrimitiveKind::UInt64: {
284
272
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
285
273
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
286
- return env.Null();
274
+ return false;
287
275
  }
288
276
 
289
277
  int64_t v = CopyNumber<int64_t>(value);
@@ -303,7 +291,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
303
291
  case PrimitiveKind::Float32: {
304
292
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
305
293
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
306
- return env.Null();
294
+ return false;
307
295
  }
308
296
 
309
297
  float f = CopyNumber<float>(value);
@@ -323,7 +311,7 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
323
311
  case PrimitiveKind::Float64: {
324
312
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
325
313
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
326
- return env.Null();
314
+ return false;
327
315
  }
328
316
 
329
317
  double d = CopyNumber<double>(value);
@@ -341,12 +329,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
341
329
  if (RG_LIKELY(value.IsString())) {
342
330
  str = PushString(value);
343
331
  if (RG_UNLIKELY(!str))
344
- return env.Null();
332
+ return false;
345
333
  } else if (IsNullOrUndefined(value)) {
346
334
  str = nullptr;
347
335
  } else {
348
336
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
349
- return env.Null();
337
+ return false;
350
338
  }
351
339
 
352
340
  if (RG_LIKELY(param.gpr_count)) {
@@ -362,12 +350,12 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
362
350
  if (RG_LIKELY(value.IsString())) {
363
351
  str16 = PushString16(value);
364
352
  if (RG_UNLIKELY(!str16))
365
- return env.Null();
353
+ return false;
366
354
  } else if (IsNullOrUndefined(value)) {
367
355
  str16 = nullptr;
368
356
  } else {
369
357
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected string", GetValueType(instance, value), i + 1);
370
- return env.Null();
358
+ return false;
371
359
  }
372
360
 
373
361
  if (RG_LIKELY(param.gpr_count)) {
@@ -387,23 +375,26 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
387
375
  Napi::Object obj = value.As<Napi::Object>();
388
376
 
389
377
  if (RG_UNLIKELY(!AllocHeap(param.type->ref->size, 16, &ptr)))
390
- return env.Null();
378
+ return false;
391
379
 
392
380
  if (param.directions & 1) {
393
381
  if (!PushObject(obj, param.type->ref, ptr))
394
- return env.Null();
382
+ return false;
395
383
  } else {
396
384
  memset(ptr, 0, param.type->size);
397
385
  }
398
386
  if (param.directions & 2) {
399
- OutObject out = {obj, ptr, param.type->ref};
400
- out_objects.Append(out);
387
+ OutObject *out = out_objects.AppendDefault();
388
+
389
+ out->ref.Reset(obj, 1);
390
+ out->ptr = ptr;
391
+ out->type = param.type->ref;
401
392
  }
402
393
  } else if (IsNullOrUndefined(value)) {
403
394
  ptr = nullptr;
404
395
  } else {
405
396
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected %3", GetValueType(instance, value), i + 1, param.type->name);
406
- return env.Null();
397
+ return false;
407
398
  }
408
399
 
409
400
  if (RG_LIKELY(param.gpr_count)) {
@@ -418,32 +409,32 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
418
409
  case PrimitiveKind::Record: {
419
410
  if (RG_UNLIKELY(!IsObject(value))) {
420
411
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
421
- return env.Null();
412
+ return false;
422
413
  }
423
414
 
424
415
  Napi::Object obj = value.As<Napi::Object>();
425
416
 
426
417
  if (param.vec_count) {
427
418
  if (!PushHFA(obj, param.type, (uint8_t *)vec_ptr))
428
- return env.Null();
419
+ return false;
429
420
  vec_ptr += param.vec_count;
430
421
  } else if (!param.use_memory) {
431
422
  if (param.gpr_count) {
432
423
  RG_ASSERT(param.type->align <= 8);
433
424
 
434
425
  if (!PushObject(obj, param.type, (uint8_t *)gpr_ptr))
435
- return env.Null();
426
+ return false;
436
427
  gpr_ptr += param.gpr_count;
437
428
  } else if (param.type->size) {
438
429
  args_ptr = AlignUp(args_ptr, 8);
439
430
  if (!PushObject(obj, param.type, args_ptr))
440
- return env.Null();
431
+ return false;
441
432
  args_ptr += AlignLen(param.type->size, 8);
442
433
  }
443
434
  } else {
444
435
  uint8_t *ptr;
445
436
  if (RG_UNLIKELY(!AllocHeap(param.type->size, 16, &ptr)))
446
- return env.Null();
437
+ return false;
447
438
 
448
439
  if (param.gpr_count) {
449
440
  RG_ASSERT(param.gpr_count == 1);
@@ -457,107 +448,102 @@ Napi::Value CallData::Execute(const Napi::CallbackInfo &info)
457
448
  }
458
449
 
459
450
  if (!PushObject(obj, param.type, ptr))
460
- return env.Null();
451
+ return false;
461
452
  }
462
453
  } break;
463
454
  }
464
455
  }
465
456
 
466
- if (instance->debug) {
467
- DumpDebug();
468
- }
457
+ stack = MakeSpan(mem->stack.end(), old_stack_mem.end() - mem->stack.end());
458
+ heap = MakeSpan(old_heap_mem.ptr, mem->heap.ptr - old_heap_mem.ptr);
469
459
 
460
+ return true;
461
+ }
462
+
463
+ void CallData::Execute()
464
+ {
470
465
  #define PERFORM_CALL(Suffix) \
471
466
  ([&]() { \
472
- auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, GetSP()) \
473
- : ForwardCall ## Suffix(func->func, GetSP())); \
474
- PopOutArguments(out_objects); \
467
+ auto ret = (func->forward_fp ? ForwardCallX ## Suffix(func->func, stack.ptr) \
468
+ : ForwardCall ## Suffix(func->func, stack.ptr)); \
475
469
  return ret; \
476
470
  })()
477
471
 
478
472
  // Execute and convert return value
479
473
  switch (func->ret.type->primitive) {
480
- case PrimitiveKind::Void: {
481
- PERFORM_CALL(GG);
482
- return env.Null();
483
- } break;
484
- case PrimitiveKind::Bool: {
485
- X0X1Ret ret = PERFORM_CALL(GG);
486
- return Napi::Boolean::New(env, ret.x0);
487
- } break;
474
+ case PrimitiveKind::Void:
475
+ case PrimitiveKind::Bool:
488
476
  case PrimitiveKind::Int8:
489
477
  case PrimitiveKind::UInt8:
490
478
  case PrimitiveKind::Int16:
491
479
  case PrimitiveKind::UInt16:
492
480
  case PrimitiveKind::Int32:
493
- case PrimitiveKind::UInt32: {
494
- X0X1Ret ret = PERFORM_CALL(GG);
495
- return Napi::Number::New(env, (double)ret.x0);
496
- } break;
497
- case PrimitiveKind::Int64: {
498
- X0X1Ret ret = PERFORM_CALL(GG);
499
- return Napi::BigInt::New(env, (int64_t)ret.x0);
500
- } break;
501
- case PrimitiveKind::UInt64: {
502
- X0X1Ret ret = PERFORM_CALL(GG);
503
- return Napi::BigInt::New(env, ret.x0);
504
- } break;
505
- case PrimitiveKind::Float32: {
506
- float f = PERFORM_CALL(F);
507
- return Napi::Number::New(env, (double)f);
508
- } break;
509
- case PrimitiveKind::Float64: {
510
- HfaRet ret = PERFORM_CALL(DDDD);
511
- return Napi::Number::New(env, (double)ret.d0);
512
- } break;
513
- case PrimitiveKind::String: {
514
- X0X1Ret ret = PERFORM_CALL(GG);
515
- return Napi::String::New(env, (const char *)ret.x0);
516
- } break;
517
- case PrimitiveKind::String16: {
518
- X0X1Ret ret = PERFORM_CALL(GG);
519
- return Napi::String::New(env, (const char16_t *)ret.x0);
520
- } break;
521
- case PrimitiveKind::Pointer: {
522
- X0X1Ret ret = PERFORM_CALL(GG);
523
- void *ptr = (void *)ret.x0;
524
-
525
- Napi::External<void> external = Napi::External<void>::New(env, ptr);
526
- SetValueTag(instance, external, func->ret.type);
527
-
528
- return external;
529
- } break;
530
-
481
+ case PrimitiveKind::UInt32:
482
+ case PrimitiveKind::Int64:
483
+ case PrimitiveKind::UInt64:
484
+ case PrimitiveKind::String:
485
+ case PrimitiveKind::String16:
486
+ case PrimitiveKind::Pointer: { result.u64 = PERFORM_CALL(GG).x0; } break;
531
487
  case PrimitiveKind::Record: {
532
488
  if (func->ret.gpr_count) {
533
489
  X0X1Ret ret = PERFORM_CALL(GG);
534
-
535
- Napi::Object obj = PopObject(env, (const uint8_t *)&ret, func->ret.type);
536
- return obj;
490
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
537
491
  } else if (func->ret.vec_count) {
538
492
  HfaRet ret = PERFORM_CALL(DDDD);
493
+ memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
494
+ } else {
495
+ PERFORM_CALL(GG);
496
+ }
497
+ } break;
498
+ case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
499
+ case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
500
+ }
539
501
 
540
- Napi::Object obj = PopHFA(env, (const uint8_t *)&ret, func->ret.type);
541
- return obj;
542
- } else if (func->ret.type->size) {
543
- RG_ASSERT(return_ptr);
502
+ #undef PERFORM_CALL
503
+ }
544
504
 
545
- X0X1Ret ret = PERFORM_CALL(GG);
546
- RG_ASSERT(ret.x0 == (uint64_t)return_ptr);
505
+ Napi::Value CallData::Complete()
506
+ {
507
+ for (const OutObject &out: out_objects) {
508
+ Napi::Object obj = out.ref.Value().As<Napi::Object>();
509
+ PopObject(obj, out.ptr, out.type);
510
+ }
547
511
 
548
- Napi::Object obj = PopObject(env, return_ptr, func->ret.type);
512
+ switch (func->ret.type->primitive) {
513
+ case PrimitiveKind::Void: return env.Null();
514
+ case PrimitiveKind::Bool: return Napi::Boolean::New(env, result.u32);
515
+ case PrimitiveKind::Int8:
516
+ case PrimitiveKind::UInt8:
517
+ case PrimitiveKind::Int16:
518
+ case PrimitiveKind::UInt16:
519
+ case PrimitiveKind::Int32:
520
+ case PrimitiveKind::UInt32: return Napi::Number::New(env, (double)result.u32);
521
+ case PrimitiveKind::Int64: return Napi::BigInt::New(env, (int64_t)result.u64);
522
+ case PrimitiveKind::UInt64: return Napi::BigInt::New(env, result.u64);
523
+ case PrimitiveKind::String: return Napi::String::New(env, (const char *)result.ptr);
524
+ case PrimitiveKind::String16: return Napi::String::New(env, (const char16_t *)result.ptr);
525
+ case PrimitiveKind::Pointer: {
526
+ Napi::External<void> external = Napi::External<void>::New(env, result.ptr);
527
+ SetValueTag(instance, external, func->ret.type);
528
+
529
+ return external;
530
+ } break;
531
+ case PrimitiveKind::Record: {
532
+ if (func->ret.vec_count) {
533
+ Napi::Object obj = PopHFA(env, (const uint8_t *)&result.buf, func->ret.type);
549
534
  return obj;
550
535
  } else {
551
- PERFORM_CALL(GG);
536
+ const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
537
+ : (const uint8_t *)&result.buf;
552
538
 
553
- Napi::Object obj = Napi::Object::New(env);
539
+ Napi::Object obj = PopObject(ptr, func->ret.type);
554
540
  return obj;
555
541
  }
556
542
  } break;
543
+ case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
544
+ case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
557
545
  }
558
546
 
559
- #undef PERFORM_CALL
560
-
561
547
  RG_UNREACHABLE();
562
548
  }
563
549