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