koffi 1.1.0-beta.1 → 1.1.0-beta.2

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 (270) hide show
  1. package/CMakeLists.txt +4 -0
  2. package/README.md +12 -11
  3. package/build/qemu/1.1.0-beta.2/koffi_darwin_x64.tar.gz +0 -0
  4. package/build/qemu/1.1.0-beta.2/koffi_freebsd_arm64.tar.gz +0 -0
  5. package/build/qemu/1.1.0-beta.2/koffi_freebsd_ia32.tar.gz +0 -0
  6. package/build/qemu/1.1.0-beta.2/koffi_freebsd_x64.tar.gz +0 -0
  7. package/build/qemu/1.1.0-beta.2/koffi_linux_arm.tar.gz +0 -0
  8. package/build/qemu/1.1.0-beta.2/koffi_linux_arm64.tar.gz +0 -0
  9. package/build/qemu/1.1.0-beta.2/koffi_linux_ia32.tar.gz +0 -0
  10. package/build/qemu/1.1.0-beta.2/koffi_linux_x64.tar.gz +0 -0
  11. package/build/qemu/1.1.0-beta.2/koffi_win32_ia32.tar.gz +0 -0
  12. package/build/qemu/1.1.0-beta.2/koffi_win32_x64.tar.gz +0 -0
  13. package/package.json +1 -1
  14. package/qemu/qemu.js +1 -0
  15. package/src/abi_arm32.cc +27 -45
  16. package/src/abi_arm64.cc +58 -132
  17. package/src/abi_x64_sysv.cc +24 -7
  18. package/src/abi_x64_win.cc +3 -0
  19. package/src/abi_x86.cc +3 -0
  20. package/src/call.cc +540 -33
  21. package/src/call.hh +5 -3
  22. package/src/ffi.cc +66 -2
  23. package/src/ffi.hh +3 -1
  24. package/src/parser.cc +4 -0
  25. package/src/util.cc +72 -0
  26. package/src/util.hh +2 -0
  27. package/test/misc.c +14 -8
  28. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
  29. package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
  30. package/vendor/node-addon-api/appveyor.yml +37 -0
  31. package/vendor/node-addon-api/benchmark/README.md +47 -0
  32. package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
  33. package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
  34. package/vendor/node-addon-api/benchmark/function_args.js +60 -0
  35. package/vendor/node-addon-api/benchmark/index.js +34 -0
  36. package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
  37. package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
  38. package/vendor/node-addon-api/doc/addon.md +163 -0
  39. package/vendor/node-addon-api/doc/array.md +81 -0
  40. package/vendor/node-addon-api/doc/array_buffer.md +155 -0
  41. package/vendor/node-addon-api/doc/async_context.md +86 -0
  42. package/vendor/node-addon-api/doc/async_operations.md +31 -0
  43. package/vendor/node-addon-api/doc/async_worker.md +427 -0
  44. package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
  45. package/vendor/node-addon-api/doc/bigint.md +97 -0
  46. package/vendor/node-addon-api/doc/boolean.md +68 -0
  47. package/vendor/node-addon-api/doc/buffer.md +150 -0
  48. package/vendor/node-addon-api/doc/callback_scope.md +54 -0
  49. package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
  50. package/vendor/node-addon-api/doc/checker-tool.md +32 -0
  51. package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
  52. package/vendor/node-addon-api/doc/cmake-js.md +68 -0
  53. package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
  54. package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
  55. package/vendor/node-addon-api/doc/dataview.md +248 -0
  56. package/vendor/node-addon-api/doc/date.md +68 -0
  57. package/vendor/node-addon-api/doc/env.md +196 -0
  58. package/vendor/node-addon-api/doc/error.md +120 -0
  59. package/vendor/node-addon-api/doc/error_handling.md +254 -0
  60. package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
  61. package/vendor/node-addon-api/doc/external.md +63 -0
  62. package/vendor/node-addon-api/doc/function.md +402 -0
  63. package/vendor/node-addon-api/doc/function_reference.md +238 -0
  64. package/vendor/node-addon-api/doc/generator.md +13 -0
  65. package/vendor/node-addon-api/doc/handle_scope.md +63 -0
  66. package/vendor/node-addon-api/doc/hierarchy.md +91 -0
  67. package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
  68. package/vendor/node-addon-api/doc/maybe.md +76 -0
  69. package/vendor/node-addon-api/doc/memory_management.md +27 -0
  70. package/vendor/node-addon-api/doc/name.md +29 -0
  71. package/vendor/node-addon-api/doc/node-gyp.md +82 -0
  72. package/vendor/node-addon-api/doc/number.md +163 -0
  73. package/vendor/node-addon-api/doc/object.md +411 -0
  74. package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
  75. package/vendor/node-addon-api/doc/object_reference.md +117 -0
  76. package/vendor/node-addon-api/doc/object_wrap.md +588 -0
  77. package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
  78. package/vendor/node-addon-api/doc/promises.md +79 -0
  79. package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
  80. package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
  81. package/vendor/node-addon-api/doc/range_error.md +59 -0
  82. package/vendor/node-addon-api/doc/reference.md +113 -0
  83. package/vendor/node-addon-api/doc/setup.md +110 -0
  84. package/vendor/node-addon-api/doc/string.md +93 -0
  85. package/vendor/node-addon-api/doc/symbol.md +61 -0
  86. package/vendor/node-addon-api/doc/threadsafe.md +121 -0
  87. package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
  88. package/vendor/node-addon-api/doc/type_error.md +59 -0
  89. package/vendor/node-addon-api/doc/typed_array.md +78 -0
  90. package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
  91. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
  92. package/vendor/node-addon-api/doc/value.md +340 -0
  93. package/vendor/node-addon-api/doc/version_management.md +43 -0
  94. package/vendor/node-addon-api/package.json +415 -0
  95. package/vendor/node-addon-api/test/README.md +91 -0
  96. package/vendor/node-addon-api/test/addon.cc +36 -0
  97. package/vendor/node-addon-api/test/addon.js +11 -0
  98. package/vendor/node-addon-api/test/addon_build/index.js +49 -0
  99. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
  100. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
  101. package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
  102. package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
  103. package/vendor/node-addon-api/test/addon_data.cc +99 -0
  104. package/vendor/node-addon-api/test/addon_data.js +46 -0
  105. package/vendor/node-addon-api/test/array_buffer.cc +243 -0
  106. package/vendor/node-addon-api/test/array_buffer.js +69 -0
  107. package/vendor/node-addon-api/test/async_context.cc +36 -0
  108. package/vendor/node-addon-api/test/async_context.js +122 -0
  109. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
  110. package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
  111. package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
  112. package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
  113. package/vendor/node-addon-api/test/async_worker.cc +106 -0
  114. package/vendor/node-addon-api/test/async_worker.js +179 -0
  115. package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
  116. package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
  117. package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
  118. package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
  119. package/vendor/node-addon-api/test/basic_types/array.js +35 -0
  120. package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
  121. package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
  122. package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
  123. package/vendor/node-addon-api/test/basic_types/number.js +114 -0
  124. package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
  125. package/vendor/node-addon-api/test/basic_types/value.js +133 -0
  126. package/vendor/node-addon-api/test/bigint.cc +91 -0
  127. package/vendor/node-addon-api/test/bigint.js +53 -0
  128. package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
  129. package/vendor/node-addon-api/test/binding.cc +173 -0
  130. package/vendor/node-addon-api/test/binding.gyp +124 -0
  131. package/vendor/node-addon-api/test/buffer.cc +183 -0
  132. package/vendor/node-addon-api/test/buffer.js +69 -0
  133. package/vendor/node-addon-api/test/callbackscope.cc +22 -0
  134. package/vendor/node-addon-api/test/callbackscope.js +49 -0
  135. package/vendor/node-addon-api/test/common/index.js +114 -0
  136. package/vendor/node-addon-api/test/common/test_helper.h +71 -0
  137. package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
  138. package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
  139. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
  140. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
  141. package/vendor/node-addon-api/test/date.cc +44 -0
  142. package/vendor/node-addon-api/test/date.js +18 -0
  143. package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
  144. package/vendor/node-addon-api/test/env_cleanup.js +56 -0
  145. package/vendor/node-addon-api/test/error.cc +287 -0
  146. package/vendor/node-addon-api/test/error.js +81 -0
  147. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
  148. package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
  149. package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
  150. package/vendor/node-addon-api/test/external.cc +81 -0
  151. package/vendor/node-addon-api/test/external.js +88 -0
  152. package/vendor/node-addon-api/test/function.cc +324 -0
  153. package/vendor/node-addon-api/test/function.js +133 -0
  154. package/vendor/node-addon-api/test/function_reference.cc +202 -0
  155. package/vendor/node-addon-api/test/function_reference.js +157 -0
  156. package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
  157. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
  158. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
  159. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
  160. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
  161. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
  162. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
  163. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
  164. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
  165. package/vendor/node-addon-api/test/handlescope.cc +60 -0
  166. package/vendor/node-addon-api/test/handlescope.js +14 -0
  167. package/vendor/node-addon-api/test/index.js +159 -0
  168. package/vendor/node-addon-api/test/maybe/check.cc +23 -0
  169. package/vendor/node-addon-api/test/maybe/index.js +38 -0
  170. package/vendor/node-addon-api/test/memory_management.cc +17 -0
  171. package/vendor/node-addon-api/test/memory_management.js +9 -0
  172. package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
  173. package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
  174. package/vendor/node-addon-api/test/name.cc +108 -0
  175. package/vendor/node-addon-api/test/name.js +59 -0
  176. package/vendor/node-addon-api/test/napi_child.js +14 -0
  177. package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
  178. package/vendor/node-addon-api/test/object/delete_property.js +41 -0
  179. package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
  180. package/vendor/node-addon-api/test/object/finalizer.js +28 -0
  181. package/vendor/node-addon-api/test/object/get_property.cc +34 -0
  182. package/vendor/node-addon-api/test/object/get_property.js +40 -0
  183. package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
  184. package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
  185. package/vendor/node-addon-api/test/object/has_property.cc +38 -0
  186. package/vendor/node-addon-api/test/object/has_property.js +37 -0
  187. package/vendor/node-addon-api/test/object/object.cc +350 -0
  188. package/vendor/node-addon-api/test/object/object.js +217 -0
  189. package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
  190. package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
  191. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
  192. package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
  193. package/vendor/node-addon-api/test/object/set_property.cc +45 -0
  194. package/vendor/node-addon-api/test/object/set_property.js +30 -0
  195. package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
  196. package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
  197. package/vendor/node-addon-api/test/object_reference.cc +219 -0
  198. package/vendor/node-addon-api/test/object_reference.js +259 -0
  199. package/vendor/node-addon-api/test/objectwrap.cc +268 -0
  200. package/vendor/node-addon-api/test/objectwrap.js +284 -0
  201. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
  202. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
  203. package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
  204. package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
  205. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
  206. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
  207. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
  208. package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
  209. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
  210. package/vendor/node-addon-api/test/promise.cc +29 -0
  211. package/vendor/node-addon-api/test/promise.js +18 -0
  212. package/vendor/node-addon-api/test/reference.cc +24 -0
  213. package/vendor/node-addon-api/test/reference.js +14 -0
  214. package/vendor/node-addon-api/test/run_script.cc +56 -0
  215. package/vendor/node-addon-api/test/run_script.js +45 -0
  216. package/vendor/node-addon-api/test/symbol.cc +79 -0
  217. package/vendor/node-addon-api/test/symbol.js +73 -0
  218. package/vendor/node-addon-api/test/testUtil.js +54 -0
  219. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
  220. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
  221. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
  222. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
  223. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
  224. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
  225. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
  226. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
  227. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
  228. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
  229. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
  230. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
  231. package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
  232. package/vendor/node-addon-api/test/thunking_manual.js +17 -0
  233. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
  234. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
  235. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
  236. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
  237. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
  238. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
  239. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
  240. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
  241. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
  242. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
  243. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
  244. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
  245. package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
  246. package/vendor/node-addon-api/test/typedarray.cc +216 -0
  247. package/vendor/node-addon-api/test/typedarray.js +69 -0
  248. package/vendor/node-addon-api/test/version_management.cc +27 -0
  249. package/vendor/node-addon-api/test/version_management.js +31 -0
  250. package/vendor/node-addon-api/unit-test/README.md +28 -0
  251. package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
  252. package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
  253. package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
  254. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
  255. package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
  256. package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
  257. package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
  258. package/vendor/node-addon-api/unit-test/setup.js +13 -0
  259. package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
  260. package/vendor/node-addon-api/unit-test/test.js +30 -0
  261. package/build/qemu/1.1.0-beta.1/koffi_darwin_x64.tar.gz +0 -0
  262. package/build/qemu/1.1.0-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
  263. package/build/qemu/1.1.0-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
  264. package/build/qemu/1.1.0-beta.1/koffi_freebsd_x64.tar.gz +0 -0
  265. package/build/qemu/1.1.0-beta.1/koffi_linux_arm.tar.gz +0 -0
  266. package/build/qemu/1.1.0-beta.1/koffi_linux_arm64.tar.gz +0 -0
  267. package/build/qemu/1.1.0-beta.1/koffi_linux_ia32.tar.gz +0 -0
  268. package/build/qemu/1.1.0-beta.1/koffi_linux_x64.tar.gz +0 -0
  269. package/build/qemu/1.1.0-beta.1/koffi_win32_ia32.tar.gz +0 -0
  270. package/build/qemu/1.1.0-beta.1/koffi_win32_x64.tar.gz +0 -0
package/CMakeLists.txt CHANGED
@@ -18,7 +18,11 @@ find_package(CNoke)
18
18
 
19
19
  set(CMAKE_CXX_STANDARD 17)
20
20
  if(MSVC)
21
+ add_compile_options(/W4 /wd4200 /wd4458 /wd4706 /wd4100 /wd4127 /wd4702)
21
22
  enable_language(ASM_MASM)
23
+ else()
24
+ add_compile_options(-Wall -Wextra -Wno-missing-field-initializers
25
+ -Wno-unused-parameter -Wno-class-memaccess)
22
26
  endif()
23
27
 
24
28
  # ---- Koffi ----
package/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  - [Introduction](#introduction)
4
4
  - [Get started](#get-started)
5
5
  - [Extra features](#extra-features)
6
+ * [C arrays](#c-arrays)
6
7
  * [Variadic functions](#variadic-functions)
7
8
  * [Asynchronous calls](#asynchronous-calls)
8
9
  * [Callbacks](#callbacks)
@@ -20,9 +21,8 @@ Koffi is a fast and easy-to-use FFI module for Node.js, with support for primiti
20
21
 
21
22
  After the release of version 1.0, the following features are planned:
22
23
 
23
- * 1.1: Asynchronous calls
24
- * 1.2: Fixed-size array types
25
- * 1.3: C to JS callbacks
24
+ * 1.1: Asynchronous calls and fixed-size array types
25
+ * 1.2: C to JS callbacks
26
26
 
27
27
  The following platforms __are officially supported and tested__ at the moment:
28
28
 
@@ -218,12 +218,16 @@ while (!WindowShouldClose()) {
218
218
 
219
219
  # Extra features
220
220
 
221
+ ## C arrays
222
+
223
+ Fixed-size arrays are declared with `koffi.array(type, length)`. Just like in C, they cannot be passed
224
+ as functions parameters (they degenerate to pointers), or returned by value. You can however embed them in struct types.
225
+
221
226
  ## Variadic functions
222
227
 
223
228
  Variadic functions are declared with an ellipsis as the last argument.
224
229
 
225
- In order to call a variadic function, you must provide two Javascript arguments for each C parameter,
226
- the first one is the expected type and the second one is the value.
230
+ In order to call a variadic function, you must provide two Javascript arguments for each C parameter, the first one is the expected type and the second one is the value.
227
231
 
228
232
  ```js
229
233
  const printf = lib.func('printf', 'int', ['string', '...']);
@@ -233,9 +237,7 @@ printf('Integer %d, double %g, string %s', 'int', 6, 'double', 8.5, 'string', 'T
233
237
 
234
238
  ## Asynchronous calls
235
239
 
236
- You can issue asynchronous calls by calling the function through its async member.
237
- In this case, you need to provide a callback function as the last argument, with
238
- `(err, res)` parameters.
240
+ You can issue asynchronous calls by calling the function through its async member. In this case, you need to provide a callback function as the last argument, with `(err, res)` parameters.
239
241
 
240
242
  ```js
241
243
  const koffi = require('koffi');
@@ -251,14 +253,13 @@ console.log('Hello World!');
251
253
  // This program will print "Hello World!", and then "Result: 1257"
252
254
  ```
253
255
 
254
- You can easily convert this callback-style async function with `util.promisify()` from the
255
- Node.js standard library.
256
+ You can easily convert this callback-style async function to a promise-based version with `util.promisify()` from the Node.js standard library.
256
257
 
257
258
  Variadic functions do not support async.
258
259
 
259
260
  ## Callbacks
260
261
 
261
- Koffi does not yet support passing JS functions as callbacks. This is planned for version 1.1.
262
+ Koffi does not yet support passing JS functions as callbacks. This is planned for version 1.2.
262
263
 
263
264
  # Benchmarks
264
265
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koffi",
3
- "version": "1.1.0-beta.1",
3
+ "version": "1.1.0-beta.2",
4
4
  "description": "Fast and simple FFI (foreign function interface) for Node.js",
5
5
  "keywords": [
6
6
  "foreign",
package/qemu/qemu.js CHANGED
@@ -275,6 +275,7 @@ async function pack() {
275
275
  let json = fs.readFileSync(root_dir + '/koffi/package.json', { encoding: 'utf-8' });
276
276
  let version = JSON.parse(json).version;
277
277
 
278
+ console.log('>> Version:', version);
278
279
  console.log('>> Checking build archives...');
279
280
  for (let machine of machines) {
280
281
  let needed = false;
package/src/abi_arm32.cc CHANGED
@@ -37,28 +37,9 @@ extern "C" uint64_t ForwardCallXGG(const void *func, uint8_t *sp);
37
37
  extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
38
38
  extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
39
39
 
40
- static bool IsHFA(const TypeInfo *type)
41
- {
42
- if (type->primitive != PrimitiveKind::Record)
43
- return false;
44
-
45
- if (type->members.len < 1 || type->members.len > 4)
46
- return false;
47
- if (type->members[0].type->primitive != PrimitiveKind::Float32 &&
48
- type->members[0].type->primitive != PrimitiveKind::Float64)
49
- return false;
50
-
51
- for (Size i = 1; i < type->members.len; i++) {
52
- if (type->members[i].type != type->members[0].type)
53
- return false;
54
- }
55
-
56
- return true;
57
- }
58
-
59
40
  bool AnalyseFunction(InstanceData *, FunctionInfo *func)
60
41
  {
61
- if (IsHFA(func->ret.type)) {
42
+ if (IsHFA(func->ret.type, 1, 4)) {
62
43
  func->ret.vec_count = func->ret.type->members.len *
63
44
  (func->ret.type->members[0].type->size / 4);
64
45
  } else if (func->ret.type->primitive != PrimitiveKind::Record ||
@@ -93,7 +74,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
93
74
  started_stack = true;
94
75
  }
95
76
  } break;
96
-
97
77
  case PrimitiveKind::Int64:
98
78
  case PrimitiveKind::UInt64: {
99
79
  if (gpr_avail >= 2) {
@@ -103,31 +83,8 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
103
83
  started_stack = true;
104
84
  }
105
85
  } break;
106
-
107
- case PrimitiveKind::Float32:
108
- case PrimitiveKind::Float64: {
109
- Size need = param.type->size / 4;
110
- bool vfp = !param.variadic;
111
-
112
- if (vfp) {
113
- if (need <= vec_avail) {
114
- param.vec_count = need;
115
- vec_avail -= need;
116
- } else {
117
- started_stack = true;
118
- }
119
- } else {
120
- if (need <= gpr_avail) {
121
- param.gpr_count = need;
122
- gpr_avail -= need;
123
- } else {
124
- started_stack = true;
125
- }
126
- }
127
- } break;
128
-
129
86
  case PrimitiveKind::Record: {
130
- if (IsHFA(param.type)) {
87
+ if (IsHFA(param.type, 1, 4)) {
131
88
  int vec_count = (int)(param.type->members.len *
132
89
  param.type->members[0].type->size / 4);
133
90
 
@@ -152,6 +109,28 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
152
109
  }
153
110
  }
154
111
  } break;
112
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
113
+ case PrimitiveKind::Float32:
114
+ case PrimitiveKind::Float64: {
115
+ Size need = param.type->size / 4;
116
+ bool vfp = !param.variadic;
117
+
118
+ if (vfp) {
119
+ if (need <= vec_avail) {
120
+ param.vec_count = need;
121
+ vec_avail -= need;
122
+ } else {
123
+ started_stack = true;
124
+ }
125
+ } else {
126
+ if (need <= gpr_avail) {
127
+ param.gpr_count = need;
128
+ gpr_avail -= need;
129
+ } else {
130
+ started_stack = true;
131
+ }
132
+ }
133
+ } break;
155
134
  }
156
135
 
157
136
  func->args_size += AlignLen(param.type->size, 16);
@@ -354,6 +333,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
354
333
  args_ptr += AlignLen(param.type->size, 4);
355
334
  }
356
335
  } break;
336
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
357
337
  case PrimitiveKind::Float32: {
358
338
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
359
339
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
@@ -432,6 +412,7 @@ void CallData::Execute()
432
412
  result.u64 = PERFORM_CALL(GG);
433
413
  }
434
414
  } break;
415
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
435
416
  case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
436
417
  case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
437
418
  }
@@ -472,6 +453,7 @@ Napi::Value CallData::Complete()
472
453
  Napi::Object obj = PopObject(ptr, func->ret.type);
473
454
  return obj;
474
455
  } break;
456
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
475
457
  case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
476
458
  case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
477
459
  }
package/src/abi_arm64.cc CHANGED
@@ -41,28 +41,9 @@ extern "C" X0X1Ret ForwardCallXGG(const void *func, uint8_t *sp);
41
41
  extern "C" float ForwardCallXF(const void *func, uint8_t *sp);
42
42
  extern "C" HfaRet ForwardCallXDDDD(const void *func, uint8_t *sp);
43
43
 
44
- static bool IsHFA(const TypeInfo *type)
45
- {
46
- if (type->primitive != PrimitiveKind::Record)
47
- return false;
48
-
49
- if (type->members.len < 1 || type->members.len > 4)
50
- return false;
51
- if (type->members[0].type->primitive != PrimitiveKind::Float32 &&
52
- type->members[0].type->primitive != PrimitiveKind::Float64)
53
- return false;
54
-
55
- for (Size i = 1; i < type->members.len; i++) {
56
- if (type->members[i].type != type->members[0].type)
57
- return false;
58
- }
59
-
60
- return true;
61
- }
62
-
63
44
  bool AnalyseFunction(InstanceData *, FunctionInfo *func)
64
45
  {
65
- if (IsHFA(func->ret.type)) {
46
+ if (IsHFA(func->ret.type, 1, 4)) {
66
47
  func->ret.vec_count = func->ret.type->members.len;
67
48
  } else if (func->ret.type->size <= 16) {
68
49
  func->ret.gpr_count = (func->ret.type->size + 7) / 8;
@@ -99,20 +80,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
99
80
  gpr_avail--;
100
81
  }
101
82
  } break;
102
-
103
- case PrimitiveKind::Float32:
104
- case PrimitiveKind::Float64: {
105
- #ifdef __APPLE__
106
- if (param.variadic)
107
- break;
108
- #endif
109
-
110
- if (vec_avail) {
111
- param.vec_count = 1;
112
- vec_avail--;
113
- }
114
- } break;
115
-
116
83
  case PrimitiveKind::Record: {
117
84
  #ifdef __APPLE__
118
85
  if (param.variadic) {
@@ -121,7 +88,7 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
121
88
  }
122
89
  #endif
123
90
 
124
- if (IsHFA(param.type)) {
91
+ if (IsHFA(param.type, 1, 4)) {
125
92
  int vec_count = (int)param.type->members.len;
126
93
 
127
94
  if (vec_count <= vec_avail) {
@@ -148,6 +115,19 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
148
115
  param.use_memory = true;
149
116
  }
150
117
  } break;
118
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
119
+ case PrimitiveKind::Float32:
120
+ case PrimitiveKind::Float64: {
121
+ #ifdef __APPLE__
122
+ if (param.variadic)
123
+ break;
124
+ #endif
125
+
126
+ if (vec_avail) {
127
+ param.vec_count = 1;
128
+ vec_avail--;
129
+ }
130
+ } break;
151
131
  }
152
132
  }
153
133
 
@@ -157,62 +137,6 @@ bool AnalyseFunction(InstanceData *, FunctionInfo *func)
157
137
  return true;
158
138
  }
159
139
 
160
- static bool PushHFA(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest)
161
- {
162
- Napi::Env env = obj.Env();
163
- InstanceData *instance = env.GetInstanceData<InstanceData>();
164
-
165
- RG_ASSERT(IsObject(obj));
166
- RG_ASSERT(IsHFA(type));
167
- RG_ASSERT(type->primitive == PrimitiveKind::Record);
168
- RG_ASSERT(AlignUp(dest, type->members[0].type->size) == dest);
169
-
170
- bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
171
-
172
- for (const RecordMember &member: type->members) {
173
- Napi::Value value = obj.Get(member.name);
174
-
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
- }
179
-
180
- if (float32) {
181
- *(float *)dest = CopyNumber<float>(value);
182
- } else {
183
- *(double *)dest = CopyNumber<double>(value);
184
- }
185
-
186
- dest += 8;
187
- }
188
-
189
- return true;
190
- }
191
-
192
- static Napi::Object PopHFA(napi_env env, const uint8_t *ptr, const TypeInfo *type)
193
- {
194
- RG_ASSERT(type->primitive == PrimitiveKind::Record);
195
- RG_ASSERT(IsHFA(type));
196
-
197
- Napi::Object obj = Napi::Object::New(env);
198
-
199
- bool float32 = (type->members[0].type->primitive == PrimitiveKind::Float32);
200
-
201
- for (const RecordMember &member: type->members) {
202
- if (float32) {
203
- float f = *(float *)ptr;
204
- obj.Set(member.name, Napi::Number::New(env, (double)f));
205
- } else {
206
- double d = *(double *)ptr;
207
- obj.Set(member.name, Napi::Number::New(env, d));
208
- }
209
-
210
- ptr += 8;
211
- }
212
-
213
- return obj;
214
- }
215
-
216
140
  bool CallData::Prepare(const Napi::CallbackInfo &info)
217
141
  {
218
142
  uint8_t *args_ptr = nullptr;
@@ -288,42 +212,6 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
288
212
  #endif
289
213
  }
290
214
  } break;
291
- case PrimitiveKind::Float32: {
292
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
293
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
294
- return false;
295
- }
296
-
297
- float f = CopyNumber<float>(value);
298
-
299
- if (RG_LIKELY(param.vec_count)) {
300
- memcpy(vec_ptr++, &f, 4);
301
- } else {
302
- args_ptr = AlignUp(args_ptr, 4);
303
- memcpy(args_ptr, &f, 4);
304
- #ifdef __APPLE__
305
- args_ptr += 4;
306
- #else
307
- args_ptr += 8;
308
- #endif
309
- }
310
- } break;
311
- case PrimitiveKind::Float64: {
312
- if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
313
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
314
- return false;
315
- }
316
-
317
- double d = CopyNumber<double>(value);
318
-
319
- if (RG_LIKELY(param.vec_count)) {
320
- memcpy(vec_ptr++, &d, 8);
321
- } else {
322
- args_ptr = AlignUp(args_ptr, 8);
323
- memcpy(args_ptr, &d, 8);
324
- args_ptr += 8;
325
- }
326
- } break;
327
215
  case PrimitiveKind::String: {
328
216
  const char *str;
329
217
  if (RG_LIKELY(value.IsString())) {
@@ -405,7 +293,6 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
405
293
  args_ptr += 8;
406
294
  }
407
295
  } break;
408
-
409
296
  case PrimitiveKind::Record: {
410
297
  if (RG_UNLIKELY(!IsObject(value))) {
411
298
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected object", GetValueType(instance, value), i + 1);
@@ -414,8 +301,8 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
414
301
 
415
302
  Napi::Object obj = value.As<Napi::Object>();
416
303
 
417
- if (param.vec_count) {
418
- if (!PushHFA(obj, param.type, (uint8_t *)vec_ptr))
304
+ if (param.vec_count) { // HFA
305
+ if (!PushObject(obj, param.type, (uint8_t *)vec_ptr, 8))
419
306
  return false;
420
307
  vec_ptr += param.vec_count;
421
308
  } else if (!param.use_memory) {
@@ -451,6 +338,43 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
451
338
  return false;
452
339
  }
453
340
  } break;
341
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
342
+ case PrimitiveKind::Float32: {
343
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
344
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
345
+ return false;
346
+ }
347
+
348
+ float f = CopyNumber<float>(value);
349
+
350
+ if (RG_LIKELY(param.vec_count)) {
351
+ memcpy(vec_ptr++, &f, 4);
352
+ } else {
353
+ args_ptr = AlignUp(args_ptr, 4);
354
+ memcpy(args_ptr, &f, 4);
355
+ #ifdef __APPLE__
356
+ args_ptr += 4;
357
+ #else
358
+ args_ptr += 8;
359
+ #endif
360
+ }
361
+ } break;
362
+ case PrimitiveKind::Float64: {
363
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
364
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
365
+ return false;
366
+ }
367
+
368
+ double d = CopyNumber<double>(value);
369
+
370
+ if (RG_LIKELY(param.vec_count)) {
371
+ memcpy(vec_ptr++, &d, 8);
372
+ } else {
373
+ args_ptr = AlignUp(args_ptr, 8);
374
+ memcpy(args_ptr, &d, 8);
375
+ args_ptr += 8;
376
+ }
377
+ } break;
454
378
  }
455
379
  }
456
380
 
@@ -495,6 +419,7 @@ void CallData::Execute()
495
419
  PERFORM_CALL(GG);
496
420
  }
497
421
  } break;
422
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
498
423
  case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
499
424
  case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DDDD).d0; } break;
500
425
  }
@@ -529,8 +454,8 @@ Napi::Value CallData::Complete()
529
454
  return external;
530
455
  } break;
531
456
  case PrimitiveKind::Record: {
532
- if (func->ret.vec_count) {
533
- Napi::Object obj = PopHFA(env, (const uint8_t *)&result.buf, func->ret.type);
457
+ if (func->ret.vec_count) { // HFA
458
+ Napi::Object obj = PopObject((const uint8_t *)&result.buf, func->ret.type, 8);
534
459
  return obj;
535
460
  } else {
536
461
  const uint8_t *ptr = return_ptr ? (const uint8_t *)return_ptr
@@ -540,6 +465,7 @@ Napi::Value CallData::Complete()
540
465
  return obj;
541
466
  }
542
467
  } break;
468
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
543
469
  case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
544
470
  case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
545
471
  }
@@ -98,13 +98,6 @@ static Size ClassifyType(const TypeInfo *type, Size offset, Span<RegisterClass>
98
98
  classes[0] = MergeClasses(classes[0], RegisterClass::Integer);
99
99
  return 1;
100
100
  } break;
101
-
102
- case PrimitiveKind::Float32:
103
- case PrimitiveKind::Float64: {
104
- classes[0] = MergeClasses(classes[0], RegisterClass::SSE);
105
- return 1;
106
- } break;
107
-
108
101
  case PrimitiveKind::Record: {
109
102
  if (type->size > 64) {
110
103
  classes[0] = MergeClasses(classes[0], RegisterClass::Memory);
@@ -119,6 +112,27 @@ static Size ClassifyType(const TypeInfo *type, Size offset, Span<RegisterClass>
119
112
 
120
113
  return (offset + 7) / 8;
121
114
  } break;
115
+ case PrimitiveKind::Array: {
116
+ if (type->size > 64) {
117
+ classes[0] = MergeClasses(classes[0], RegisterClass::Memory);
118
+ return 1;
119
+ }
120
+
121
+ Size len = type->size / type->ref->size;
122
+
123
+ for (Size i = 0; i < len; i++) {
124
+ Size start = offset / 8;
125
+ ClassifyType(type->ref, offset % 8, classes.Take(start, classes.len - start));
126
+ offset += type->ref->size;
127
+ }
128
+
129
+ return (offset + 7) / 8;
130
+ } break;
131
+ case PrimitiveKind::Float32:
132
+ case PrimitiveKind::Float64: {
133
+ classes[0] = MergeClasses(classes[0], RegisterClass::SSE);
134
+ return 1;
135
+ } break;
122
136
  }
123
137
 
124
138
  RG_UNREACHABLE();
@@ -370,6 +384,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
370
384
  args_ptr += AlignLen(param.type->size, 8);
371
385
  }
372
386
  } break;
387
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
373
388
  case PrimitiveKind::Float32: {
374
389
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
375
390
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
@@ -450,6 +465,7 @@ void CallData::Execute()
450
465
  memcpy_safe(&result.buf, &ret, RG_SIZE(ret));
451
466
  }
452
467
  } break;
468
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
453
469
  case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
454
470
  case PrimitiveKind::Float64: { result.d = PERFORM_CALL(DG).xmm0; } break;
455
471
  }
@@ -490,6 +506,7 @@ Napi::Value CallData::Complete()
490
506
  Napi::Object obj = PopObject(ptr, func->ret.type);
491
507
  return obj;
492
508
  } break;
509
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
493
510
  case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
494
511
  case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
495
512
  }
@@ -182,6 +182,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
182
182
  if (!PushObject(obj, param.type, ptr))
183
183
  return false;
184
184
  } break;
185
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
185
186
  case PrimitiveKind::Float32: {
186
187
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
187
188
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
@@ -233,6 +234,7 @@ void CallData::Execute()
233
234
  case PrimitiveKind::String16:
234
235
  case PrimitiveKind::Pointer:
235
236
  case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
237
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
236
238
  case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
237
239
  case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
238
240
  }
@@ -273,6 +275,7 @@ Napi::Value CallData::Complete()
273
275
  Napi::Object obj = PopObject(ptr, func->ret.type);
274
276
  return obj;
275
277
  } break;
278
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
276
279
  case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
277
280
  case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
278
281
  }
package/src/abi_x86.cc CHANGED
@@ -226,6 +226,7 @@ bool CallData::Prepare(const Napi::CallbackInfo &info)
226
226
  args_ptr = (uint32_t *)AlignUp(ptr + param.type->size, 4);
227
227
  }
228
228
  } break;
229
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
229
230
  case PrimitiveKind::Float32: {
230
231
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
231
232
  ThrowError<Napi::TypeError>(env, "Unexpected %1 value for argument %2, expected number", GetValueType(instance, value), i + 1);
@@ -279,6 +280,7 @@ void CallData::Execute()
279
280
  case PrimitiveKind::String16:
280
281
  case PrimitiveKind::Pointer:
281
282
  case PrimitiveKind::Record: { result.u64 = PERFORM_CALL(G); } break;
283
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
282
284
  case PrimitiveKind::Float32: { result.f = PERFORM_CALL(F); } break;
283
285
  case PrimitiveKind::Float64: { result.d = PERFORM_CALL(D); } break;
284
286
  }
@@ -319,6 +321,7 @@ Napi::Value CallData::Complete()
319
321
  Napi::Object obj = PopObject(ptr, func->ret.type);
320
322
  return obj;
321
323
  } break;
324
+ case PrimitiveKind::Array: { RG_UNREACHABLE(); } break;
322
325
  case PrimitiveKind::Float32: return Napi::Number::New(env, (double)result.f);
323
326
  case PrimitiveKind::Float64: return Napi::Number::New(env, result.d);
324
327
  }