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/src/call.cc CHANGED
@@ -114,7 +114,7 @@ const char16_t *CallData::PushString16(const Napi::Value &value)
114
114
  return buf.ptr;
115
115
  }
116
116
 
117
- bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest)
117
+ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest, int16_t realign)
118
118
  {
119
119
  RG_ASSERT(IsObject(obj));
120
120
  RG_ASSERT(type->primitive == PrimitiveKind::Record);
@@ -127,21 +127,21 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
127
127
  return false;
128
128
  }
129
129
 
130
- dest = AlignUp(dest, member.align);
130
+ int16_t align = std::max(member.align, realign);
131
+ dest = AlignUp(dest, align);
131
132
 
132
133
  switch (member.type->primitive) {
133
134
  case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
134
135
 
135
136
  case PrimitiveKind::Bool: {
136
137
  if (RG_UNLIKELY(!value.IsBoolean())) {
137
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected boolean", GetValueType(instance, value), member.name);
138
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected boolean", GetValueType(instance, value), member.name);
138
139
  return false;
139
140
  }
140
141
 
141
142
  bool b = value.As<Napi::Boolean>();
142
143
  *(bool *)dest = b;
143
144
  } break;
144
-
145
145
  case PrimitiveKind::Int8:
146
146
  case PrimitiveKind::UInt8:
147
147
  case PrimitiveKind::Int16:
@@ -151,7 +151,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
151
151
  case PrimitiveKind::Int64:
152
152
  case PrimitiveKind::UInt64: {
153
153
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
154
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
154
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
155
155
  return false;
156
156
  }
157
157
 
@@ -160,7 +160,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
160
160
  } break;
161
161
  case PrimitiveKind::String: {
162
162
  if (RG_UNLIKELY(!value.IsString())) {
163
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected string", GetValueType(instance, value), member.name);
163
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected string", GetValueType(instance, value), member.name);
164
164
  return false;
165
165
  }
166
166
 
@@ -171,7 +171,7 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
171
171
  } break;
172
172
  case PrimitiveKind::String16: {
173
173
  if (RG_UNLIKELY(!value.IsString())) {
174
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected string", GetValueType(instance, value), member.name);
174
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected string", GetValueType(instance, value), member.name);
175
175
  return false;
176
176
  }
177
177
 
@@ -192,31 +192,41 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
192
192
  } break;
193
193
  case PrimitiveKind::Record: {
194
194
  if (RG_UNLIKELY(!IsObject(value))) {
195
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected object", GetValueType(instance, value), member.name);
195
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected object", GetValueType(instance, value), member.name);
196
196
  return false;
197
197
  }
198
198
 
199
199
  Napi::Object obj = value.As<Napi::Object>();
200
- if (!PushObject(obj, member.type, dest))
200
+ if (!PushObject(obj, member.type, dest, realign))
201
+ return false;
202
+ } break;
203
+ case PrimitiveKind::Array: {
204
+ if (RG_UNLIKELY(!value.IsArray() && !value.IsTypedArray())) {
205
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected array", GetValueType(instance, value), member.name);
206
+ return false;
207
+ }
208
+
209
+ Napi::Array array = value.As<Napi::Array>();
210
+ if (!PushArray(array, member.type, dest, realign))
201
211
  return false;
202
212
  } break;
203
213
  case PrimitiveKind::Float32: {
204
214
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
205
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
215
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
206
216
  return false;
207
217
  }
208
218
 
209
219
  float f = CopyNumber<float>(value);
210
- memcpy(dest, &f, 4);
220
+ *(float *)dest = f;
211
221
  } break;
212
222
  case PrimitiveKind::Float64: {
213
223
  if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
214
- ThrowError<Napi::TypeError>(env, "Unexpected value %1 for member '%2', expected number", GetValueType(instance, value), member.name);
224
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for member '%2', expected number", GetValueType(instance, value), member.name);
215
225
  return false;
216
226
  }
217
227
 
218
228
  double d = CopyNumber<double>(value);
219
- memcpy(dest, &d, 8);
229
+ *(double *)dest = d;
220
230
  } break;
221
231
  }
222
232
 
@@ -226,62 +236,297 @@ bool CallData::PushObject(const Napi::Object &obj, const TypeInfo *type, uint8_t
226
236
  return true;
227
237
  }
228
238
 
229
- void CallData::PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *type)
239
+ bool CallData::PushArray(const Napi::Object &obj, const TypeInfo *type, uint8_t *dest, int16_t realign)
240
+ {
241
+ RG_ASSERT(obj.IsArray() || obj.IsTypedArray());
242
+ RG_ASSERT(type->primitive == PrimitiveKind::Array);
243
+
244
+ uint32_t len = type->size / type->ref->size;
245
+
246
+ if (obj.IsArray()) {
247
+ Napi::Array array = obj.As<Napi::Array>();
248
+
249
+ if (array.Length() != len) {
250
+ ThrowError<Napi::Error>(env, "Expected array of length %1, got %2", len, array.Length());
251
+ return false;
252
+ }
253
+
254
+ switch (type->ref->primitive) {
255
+ case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
256
+
257
+ case PrimitiveKind::Bool: {
258
+ for (uint32_t i = 0; i < len; i++) {
259
+ Napi::Value value = array[i];
260
+
261
+ int16_t align = std::max(type->ref->align, realign);
262
+ dest = AlignUp(dest, align);
263
+
264
+ if (RG_UNLIKELY(!value.IsBoolean())) {
265
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected boolean", GetValueType(instance, value));
266
+ return false;
267
+ }
268
+
269
+ bool b = value.As<Napi::Boolean>();
270
+ *(bool *)dest = b;
271
+
272
+ dest += type->ref->size;
273
+ }
274
+ } break;
275
+ case PrimitiveKind::Int8:
276
+ case PrimitiveKind::UInt8:
277
+ case PrimitiveKind::Int16:
278
+ case PrimitiveKind::UInt16:
279
+ case PrimitiveKind::Int32:
280
+ case PrimitiveKind::UInt32:
281
+ case PrimitiveKind::Int64:
282
+ case PrimitiveKind::UInt64: {
283
+ for (uint32_t i = 0; i < len; i++) {
284
+ Napi::Value value = array[i];
285
+
286
+ int16_t align = std::max(type->ref->align, realign);
287
+ dest = AlignUp(dest, align);
288
+
289
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
290
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
291
+ return false;
292
+ }
293
+
294
+ int64_t v = CopyNumber<int64_t>(value);
295
+ memcpy(dest, &v, type->ref->size); // Little Endian
296
+
297
+ dest += type->ref->size;
298
+ }
299
+ } break;
300
+ case PrimitiveKind::String: {
301
+ for (uint32_t i = 0; i < len; i++) {
302
+ Napi::Value value = array[i];
303
+
304
+ int16_t align = std::max(type->ref->align, realign);
305
+ dest = AlignUp(dest, align);
306
+
307
+ if (RG_UNLIKELY(!value.IsString())) {
308
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected string", GetValueType(instance, value));
309
+ return false;
310
+ }
311
+
312
+ const char *str = PushString(value);
313
+ if (RG_UNLIKELY(!str))
314
+ return false;
315
+ *(const char **)dest = str;
316
+
317
+ dest += type->ref->size;
318
+ }
319
+ } break;
320
+ case PrimitiveKind::String16: {
321
+ for (uint32_t i = 0; i < len; i++) {
322
+ Napi::Value value = array[i];
323
+
324
+ int16_t align = std::max(type->ref->align, realign);
325
+ dest = AlignUp(dest, align);
326
+
327
+ if (RG_UNLIKELY(!value.IsString())) {
328
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected string", GetValueType(instance, value));
329
+ return false;
330
+ }
331
+
332
+ const char16_t *str16 = PushString16(value);
333
+ if (RG_UNLIKELY(!str16))
334
+ return false;
335
+ *(const char16_t **)dest = str16;
336
+
337
+ dest += type->ref->size;
338
+ }
339
+ } break;
340
+ case PrimitiveKind::Pointer: {
341
+ for (uint32_t i = 0; i < len; i++) {
342
+ Napi::Value value = array[i];
343
+
344
+ int16_t align = std::max(type->ref->align, realign);
345
+ dest = AlignUp(dest, align);
346
+
347
+ if (RG_UNLIKELY(!CheckValueTag(instance, value, type->ref))) {
348
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected %2", GetValueType(instance, value), type->ref->name);
349
+ return false;
350
+ }
351
+
352
+ Napi::External external = value.As<Napi::External<void>>();
353
+ *(void **)dest = external.Data();
354
+
355
+ dest += type->ref->size;
356
+ }
357
+ } break;
358
+ case PrimitiveKind::Record: {
359
+ for (uint32_t i = 0; i < len; i++) {
360
+ Napi::Value value = array[i];
361
+
362
+ int16_t align = std::max(type->ref->align, realign);
363
+ dest = AlignUp(dest, align);
364
+
365
+ if (RG_UNLIKELY(!IsObject(value))) {
366
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected object", GetValueType(instance, value));
367
+ return false;
368
+ }
369
+
370
+ Napi::Object obj = value.As<Napi::Object>();
371
+ if (!PushObject(obj, type->ref, dest, realign))
372
+ return false;
373
+
374
+ dest += type->ref->size;
375
+ }
376
+ } break;
377
+ case PrimitiveKind::Array: {
378
+ for (uint32_t i = 0; i < len; i++) {
379
+ Napi::Value value = array[i];
380
+
381
+ int16_t align = std::max(type->ref->align, realign);
382
+ dest = AlignUp(dest, align);
383
+
384
+ if (RG_UNLIKELY(!value.IsArray() && !value.IsTypedArray())) {
385
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected array", GetValueType(instance, value));
386
+ return false;
387
+ }
388
+
389
+ Napi::Array array = value.As<Napi::Array>();
390
+ if (!PushArray(array, type->ref, dest, realign))
391
+ return false;
392
+
393
+ dest += type->ref->size;
394
+ }
395
+ } break;
396
+ case PrimitiveKind::Float32: {
397
+ for (uint32_t i = 0; i < len; i++) {
398
+ Napi::Value value = array[i];
399
+
400
+ int16_t align = std::max(type->ref->align, realign);
401
+ dest = AlignUp(dest, align);
402
+
403
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
404
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
405
+ return false;
406
+ }
407
+
408
+ float f = CopyNumber<float>(value);
409
+ *(float *)dest = f;
410
+
411
+ dest += type->ref->size;
412
+ }
413
+ } break;
414
+ case PrimitiveKind::Float64: {
415
+ for (uint32_t i = 0; i < len; i++) {
416
+ Napi::Value value = array[i];
417
+
418
+ int16_t align = std::max(type->ref->align, realign);
419
+ dest = AlignUp(dest, align);
420
+
421
+ if (RG_UNLIKELY(!value.IsNumber() && !value.IsBigInt())) {
422
+ ThrowError<Napi::TypeError>(env, "Unexpected value %1 in array, expected number", GetValueType(instance, value));
423
+ return false;
424
+ }
425
+
426
+ double d = CopyNumber<double>(value);
427
+ *(double *)dest = d;
428
+
429
+ dest += type->ref->size;
430
+ }
431
+ } break;
432
+ }
433
+ } else {
434
+ Napi::TypedArray array = obj.As<Napi::TypedArray>();
435
+ const uint8_t *buf = (const uint8_t *)array.ArrayBuffer().Data();
436
+
437
+ if (array.ElementLength() != len) {
438
+ ThrowError<Napi::Error>(env, "Expected array of length %1, got %2", len, array.ElementLength());
439
+ return false;
440
+ }
441
+
442
+ bool match;
443
+ switch (type->ref->primitive) {
444
+ case PrimitiveKind::Int8: { match = (array.TypedArrayType() == napi_int8_array); } break;
445
+ case PrimitiveKind::UInt8: { match = (array.TypedArrayType() == napi_uint8_array); } break;
446
+ case PrimitiveKind::Int16: { match = (array.TypedArrayType() == napi_int16_array); } break;
447
+ case PrimitiveKind::UInt16: { match = (array.TypedArrayType() == napi_uint16_array); } break;
448
+ case PrimitiveKind::Int32: { match = (array.TypedArrayType() == napi_int32_array); } break;
449
+ case PrimitiveKind::UInt32: { match = (array.TypedArrayType() == napi_uint32_array); } break;
450
+ case PrimitiveKind::Float32: { match = (array.TypedArrayType() == napi_float32_array); } break;
451
+ case PrimitiveKind::Float64: { match = (array.TypedArrayType() == napi_float64_array); } break;
452
+
453
+ default: { match = false; } break;
454
+ }
455
+ if (!match) {
456
+ ThrowError<Napi::TypeError>(env, "TypedArray is not approriate for %1 array", type->ref->name);
457
+ return false;
458
+ }
459
+
460
+ for (uint32_t i = 0; i < len; i++) {
461
+ int16_t align = std::max(type->ref->align, realign);
462
+ dest = AlignUp(dest, align);
463
+
464
+ memcpy(dest, buf + i * type->ref->size, type->ref->size);
465
+
466
+ dest += type->ref->size;
467
+ }
468
+ }
469
+
470
+ return true;
471
+ }
472
+
473
+ void CallData::PopObject(Napi::Object obj, const uint8_t *src, const TypeInfo *type, int16_t realign)
230
474
  {
231
475
  RG_ASSERT(type->primitive == PrimitiveKind::Record);
232
476
 
233
477
  for (const RecordMember &member: type->members) {
234
- ptr = AlignUp(ptr, member.align);
478
+ int16_t align = std::max(realign, member.align);
479
+ src = AlignUp(src, align);
235
480
 
236
481
  switch (member.type->primitive) {
237
482
  case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
238
483
 
239
484
  case PrimitiveKind::Bool: {
240
- bool b = *(bool *)ptr;
485
+ bool b = *(bool *)src;
241
486
  obj.Set(member.name, Napi::Boolean::New(env, b));
242
487
  } break;
243
488
  case PrimitiveKind::Int8: {
244
- double d = (double)*(int8_t *)ptr;
489
+ double d = (double)*(int8_t *)src;
245
490
  obj.Set(member.name, Napi::Number::New(env, d));
246
491
  } break;
247
492
  case PrimitiveKind::UInt8: {
248
- double d = (double)*(uint8_t *)ptr;
493
+ double d = (double)*(uint8_t *)src;
249
494
  obj.Set(member.name, Napi::Number::New(env, d));
250
495
  } break;
251
496
  case PrimitiveKind::Int16: {
252
- double d = (double)*(int16_t *)ptr;
497
+ double d = (double)*(int16_t *)src;
253
498
  obj.Set(member.name, Napi::Number::New(env, d));
254
499
  } break;
255
500
  case PrimitiveKind::UInt16: {
256
- double d = (double)*(uint16_t *)ptr;
501
+ double d = (double)*(uint16_t *)src;
257
502
  obj.Set(member.name, Napi::Number::New(env, d));
258
503
  } break;
259
504
  case PrimitiveKind::Int32: {
260
- double d = (double)*(int32_t *)ptr;
505
+ double d = (double)*(int32_t *)src;
261
506
  obj.Set(member.name, Napi::Number::New(env, d));
262
507
  } break;
263
508
  case PrimitiveKind::UInt32: {
264
- double d = (double)*(uint32_t *)ptr;
509
+ double d = (double)*(uint32_t *)src;
265
510
  obj.Set(member.name, Napi::Number::New(env, d));
266
511
  } break;
267
512
  case PrimitiveKind::Int64: {
268
- int64_t v = *(int64_t *)ptr;
513
+ int64_t v = *(int64_t *)src;
269
514
  obj.Set(member.name, Napi::BigInt::New(env, v));
270
515
  } break;
271
516
  case PrimitiveKind::UInt64: {
272
- uint64_t v = *(uint64_t *)ptr;
517
+ uint64_t v = *(uint64_t *)src;
273
518
  obj.Set(member.name, Napi::BigInt::New(env, v));
274
519
  } break;
275
520
  case PrimitiveKind::String: {
276
- const char *str = *(const char **)ptr;
521
+ const char *str = *(const char **)src;
277
522
  obj.Set(member.name, Napi::String::New(env, str));
278
523
  } break;
279
524
  case PrimitiveKind::String16: {
280
- const char16_t *str16 = *(const char16_t **)ptr;
525
+ const char16_t *str16 = *(const char16_t **)src;
281
526
  obj.Set(member.name, Napi::String::New(env, str16));
282
527
  } break;
283
528
  case PrimitiveKind::Pointer: {
284
- void *ptr2 = *(void **)ptr;
529
+ void *ptr2 = *(void **)src;
285
530
 
286
531
  Napi::External<void> external = Napi::External<void>::New(env, ptr2);
287
532
  SetValueTag(instance, external, member.type);
@@ -289,32 +534,294 @@ void CallData::PopObject(Napi::Object obj, const uint8_t *ptr, const TypeInfo *t
289
534
  obj.Set(member.name, external);
290
535
  } break;
291
536
  case PrimitiveKind::Record: {
292
- Napi::Object obj2 = PopObject(ptr, member.type);
537
+ Napi::Object obj2 = PopObject(src, member.type, realign);
538
+ obj.Set(member.name, obj2);
539
+ } break;
540
+ case PrimitiveKind::Array: {
541
+ Napi::Object obj2 = PopArray(src, member.type, realign);
293
542
  obj.Set(member.name, obj2);
294
543
  } break;
295
544
  case PrimitiveKind::Float32: {
296
545
  float f;
297
- memcpy(&f, ptr, 4);
546
+ memcpy(&f, src, 4);
298
547
  obj.Set(member.name, Napi::Number::New(env, (double)f));
299
548
  } break;
300
549
  case PrimitiveKind::Float64: {
301
550
  double d;
302
- memcpy(&d, ptr, 8);
551
+ memcpy(&d, src, 8);
303
552
  obj.Set(member.name, Napi::Number::New(env, d));
304
553
  } break;
305
554
  }
306
555
 
307
- ptr += member.type->size;
556
+ src += member.type->size;
308
557
  }
309
558
  }
310
559
 
311
- Napi::Object CallData::PopObject(const uint8_t *ptr, const TypeInfo *type)
560
+ Napi::Object CallData::PopObject(const uint8_t *src, const TypeInfo *type, int16_t realign)
312
561
  {
313
562
  Napi::Object obj = Napi::Object::New(env);
314
- PopObject(obj, ptr, type);
563
+ PopObject(obj, src, type, realign);
315
564
  return obj;
316
565
  }
317
566
 
567
+ Napi::Object CallData::PopArray(const uint8_t *src, const TypeInfo *type, int16_t realign)
568
+ {
569
+ RG_ASSERT(type->primitive == PrimitiveKind::Array);
570
+
571
+ uint32_t len = type->size / type->ref->size;
572
+
573
+ switch (type->ref->primitive) {
574
+ case PrimitiveKind::Void: { RG_UNREACHABLE(); } break;
575
+
576
+ case PrimitiveKind::Bool: {
577
+ Napi::Array array = Napi::Array::New(env);
578
+
579
+ for (uint32_t i = 0; i < len; i++) {
580
+ int16_t align = std::max(realign, type->ref->align);
581
+ src = AlignUp(src, align);
582
+
583
+ bool b = *(bool *)src;
584
+ array.Set(i, Napi::Boolean::New(env, b));
585
+
586
+ src += type->ref->size;
587
+ }
588
+
589
+ return array;
590
+ } break;
591
+ case PrimitiveKind::Int8: {
592
+ Napi::Int8Array array = Napi::Int8Array::New(env, len);
593
+
594
+ for (uint32_t i = 0; i < len; i++) {
595
+ int16_t align = std::max(realign, type->ref->align);
596
+ src = AlignUp(src, align);
597
+
598
+ int8_t v = *(int8_t *)src;
599
+ array[i] = v;
600
+
601
+ src += type->ref->size;
602
+ }
603
+
604
+ return array;
605
+ } break;
606
+ case PrimitiveKind::UInt8: {
607
+ Napi::Uint8Array array = Napi::Uint8Array::New(env, len);
608
+
609
+ for (uint32_t i = 0; i < len; i++) {
610
+ int16_t align = std::max(realign, type->ref->align);
611
+ src = AlignUp(src, align);
612
+
613
+ uint8_t v = *(uint8_t *)src;
614
+ array[i] = v;
615
+
616
+ src += type->ref->size;
617
+ }
618
+
619
+ return array;
620
+ } break;
621
+ case PrimitiveKind::Int16: {
622
+ Napi::Int16Array array = Napi::Int16Array::New(env, len);
623
+
624
+ for (uint32_t i = 0; i < len; i++) {
625
+ int16_t align = std::max(realign, type->ref->align);
626
+ src = AlignUp(src, align);
627
+
628
+ int16_t v = *(int16_t *)src;
629
+ array[i] = v;
630
+
631
+ src += type->ref->size;
632
+ }
633
+
634
+ return array;
635
+ } break;
636
+ case PrimitiveKind::UInt16: {
637
+ Napi::Uint16Array array = Napi::Uint16Array::New(env, len);
638
+
639
+ for (uint32_t i = 0; i < len; i++) {
640
+ int16_t align = std::max(realign, type->ref->align);
641
+ src = AlignUp(src, align);
642
+
643
+ uint16_t v = *(uint16_t *)src;
644
+ array[i] = v;
645
+
646
+ src += type->ref->size;
647
+ }
648
+
649
+ return array;
650
+ } break;
651
+ case PrimitiveKind::Int32: {
652
+ Napi::Int32Array array = Napi::Int32Array::New(env, len);
653
+
654
+ for (uint32_t i = 0; i < len; i++) {
655
+ int16_t align = std::max(realign, type->ref->align);
656
+ src = AlignUp(src, align);
657
+
658
+ int32_t v = *(int32_t *)src;
659
+ array[i] = v;
660
+
661
+ src += type->ref->size;
662
+ }
663
+
664
+ return array;
665
+ } break;
666
+ case PrimitiveKind::UInt32: {
667
+ Napi::Uint32Array array = Napi::Uint32Array::New(env, len);
668
+
669
+ for (uint32_t i = 0; i < len; i++) {
670
+ int16_t align = std::max(realign, type->ref->align);
671
+ src = AlignUp(src, align);
672
+
673
+ uint32_t v = *(uint32_t *)src;
674
+ array[i] = v;
675
+
676
+ src += type->ref->size;
677
+ }
678
+
679
+ return array;
680
+ } break;
681
+ case PrimitiveKind::Int64: {
682
+ Napi::Array array = Napi::Array::New(env);
683
+
684
+ for (uint32_t i = 0; i < len; i++) {
685
+ int16_t align = std::max(realign, type->ref->align);
686
+ src = AlignUp(src, align);
687
+
688
+ int64_t v = *(int64_t *)src;
689
+ array.Set(i, Napi::BigInt::New(env, v));
690
+
691
+ src += type->ref->size;
692
+ }
693
+
694
+ return array;
695
+ } break;
696
+ case PrimitiveKind::UInt64: {
697
+ Napi::Array array = Napi::Array::New(env);
698
+
699
+ for (uint32_t i = 0; i < len; i++) {
700
+ int16_t align = std::max(realign, type->ref->align);
701
+ src = AlignUp(src, align);
702
+
703
+ uint64_t v = *(uint64_t *)src;
704
+ array.Set(i, Napi::BigInt::New(env, v));
705
+
706
+ src += type->ref->size;
707
+ }
708
+
709
+ return array;
710
+ } break;
711
+ case PrimitiveKind::String: {
712
+ Napi::Array array = Napi::Array::New(env);
713
+
714
+ for (uint32_t i = 0; i < len; i++) {
715
+ int16_t align = std::max(realign, type->ref->align);
716
+ src = AlignUp(src, align);
717
+
718
+ const char *str = *(const char **)src;
719
+ array.Set(i, Napi::String::New(env, str));
720
+
721
+ src += type->ref->size;
722
+ }
723
+
724
+ return array;
725
+ } break;
726
+ case PrimitiveKind::String16: {
727
+ Napi::Array array = Napi::Array::New(env);
728
+
729
+ for (uint32_t i = 0; i < len; i++) {
730
+ int16_t align = std::max(realign, type->ref->align);
731
+ src = AlignUp(src, align);
732
+
733
+ const char16_t *str16 = *(const char16_t **)src;
734
+ array.Set(i, Napi::String::New(env, str16));
735
+
736
+ src += type->ref->size;
737
+ }
738
+
739
+ return array;
740
+ } break;
741
+ case PrimitiveKind::Pointer: {
742
+ Napi::Array array = Napi::Array::New(env);
743
+
744
+ for (uint32_t i = 0; i < len; i++) {
745
+ int16_t align = std::max(realign, type->ref->align);
746
+ src = AlignUp(src, align);
747
+
748
+ void *ptr2 = *(void **)src;
749
+
750
+ Napi::External<void> external = Napi::External<void>::New(env, ptr2);
751
+ SetValueTag(instance, external, type->ref);
752
+
753
+ array.Set(i, external);
754
+
755
+ src += type->ref->size;
756
+ }
757
+
758
+ return array;
759
+ } break;
760
+ case PrimitiveKind::Record: {
761
+ Napi::Array array = Napi::Array::New(env);
762
+
763
+ for (uint32_t i = 0; i < len; i++) {
764
+ int16_t align = std::max(realign, type->ref->align);
765
+ src = AlignUp(src, align);
766
+
767
+ Napi::Object obj = PopObject(src, type->ref, realign);
768
+ array.Set(i, obj);
769
+
770
+ src += type->ref->size;
771
+ }
772
+
773
+ return array;
774
+ } break;
775
+ case PrimitiveKind::Array: {
776
+ Napi::Array array = Napi::Array::New(env);
777
+
778
+ for (uint32_t i = 0; i < len; i++) {
779
+ int16_t align = std::max(realign, type->ref->align);
780
+ src = AlignUp(src, align);
781
+
782
+ Napi::Object obj = PopArray(src, type->ref, realign);
783
+ array.Set(i, obj);
784
+
785
+ src += type->ref->size;
786
+ }
787
+
788
+ return array;
789
+ } break;
790
+ case PrimitiveKind::Float32: {
791
+ Napi::Float32Array array = Napi::Float32Array::New(env, len);
792
+
793
+ for (uint32_t i = 0; i < len; i++) {
794
+ int16_t align = std::max(realign, type->ref->align);
795
+ src = AlignUp(src, align);
796
+
797
+ float f = *(float *)src;
798
+ array[i] = f;
799
+
800
+ src += type->ref->size;
801
+ }
802
+
803
+ return array;
804
+ } break;
805
+ case PrimitiveKind::Float64: {
806
+ Napi::Float64Array array = Napi::Float64Array::New(env, len);
807
+
808
+ for (uint32_t i = 0; i < len; i++) {
809
+ int16_t align = std::max(realign, type->ref->align);
810
+ src = AlignUp(src, align);
811
+
812
+ double d = *(double *)src;
813
+ array[i] = d;
814
+
815
+ src += type->ref->size;
816
+ }
817
+
818
+ return array;
819
+ } break;
820
+ }
821
+
822
+ RG_UNREACHABLE();
823
+ }
824
+
318
825
  static void DumpMemory(const char *type, Span<const uint8_t> bytes)
319
826
  {
320
827
  if (bytes.len) {