koffi 0.9.34 → 0.9.37

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 (375) hide show
  1. package/CMakeLists.txt +2 -1
  2. package/README.md +16 -13
  3. package/package.json +5 -4
  4. package/src/call_arm32.cc +6 -2
  5. package/src/call_arm64.cc +6 -2
  6. package/src/call_x64_sysv.cc +6 -2
  7. package/src/call_x64_win.cc +6 -2
  8. package/src/call_x86.cc +7 -3
  9. package/src/ffi.cc +77 -59
  10. package/src/ffi.hh +2 -2
  11. package/src/parser.cc +246 -0
  12. package/src/parser.hh +63 -0
  13. package/src/util.cc +23 -0
  14. package/src/util.hh +3 -0
  15. package/test/registry/machines.json +70 -0
  16. package/test/test.js +116 -7
  17. package/test/tests/misc.js +16 -16
  18. package/test/tests/raylib.js +8 -8
  19. package/test/tests/sqlite.js +9 -9
  20. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
  21. package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
  22. package/vendor/node-addon-api/appveyor.yml +37 -0
  23. package/vendor/node-addon-api/benchmark/README.md +47 -0
  24. package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
  25. package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
  26. package/vendor/node-addon-api/benchmark/function_args.js +60 -0
  27. package/vendor/node-addon-api/benchmark/index.js +34 -0
  28. package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
  29. package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
  30. package/vendor/node-addon-api/doc/addon.md +163 -0
  31. package/vendor/node-addon-api/doc/array.md +81 -0
  32. package/vendor/node-addon-api/doc/array_buffer.md +155 -0
  33. package/vendor/node-addon-api/doc/async_context.md +86 -0
  34. package/vendor/node-addon-api/doc/async_operations.md +31 -0
  35. package/vendor/node-addon-api/doc/async_worker.md +427 -0
  36. package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
  37. package/vendor/node-addon-api/doc/bigint.md +97 -0
  38. package/vendor/node-addon-api/doc/boolean.md +68 -0
  39. package/vendor/node-addon-api/doc/buffer.md +150 -0
  40. package/vendor/node-addon-api/doc/callback_scope.md +54 -0
  41. package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
  42. package/vendor/node-addon-api/doc/checker-tool.md +32 -0
  43. package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
  44. package/vendor/node-addon-api/doc/cmake-js.md +68 -0
  45. package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
  46. package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
  47. package/vendor/node-addon-api/doc/dataview.md +248 -0
  48. package/vendor/node-addon-api/doc/date.md +68 -0
  49. package/vendor/node-addon-api/doc/env.md +196 -0
  50. package/vendor/node-addon-api/doc/error.md +120 -0
  51. package/vendor/node-addon-api/doc/error_handling.md +254 -0
  52. package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
  53. package/vendor/node-addon-api/doc/external.md +63 -0
  54. package/vendor/node-addon-api/doc/function.md +402 -0
  55. package/vendor/node-addon-api/doc/function_reference.md +238 -0
  56. package/vendor/node-addon-api/doc/generator.md +13 -0
  57. package/vendor/node-addon-api/doc/handle_scope.md +63 -0
  58. package/vendor/node-addon-api/doc/hierarchy.md +91 -0
  59. package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
  60. package/vendor/node-addon-api/doc/maybe.md +76 -0
  61. package/vendor/node-addon-api/doc/memory_management.md +27 -0
  62. package/vendor/node-addon-api/doc/name.md +29 -0
  63. package/vendor/node-addon-api/doc/node-gyp.md +82 -0
  64. package/vendor/node-addon-api/doc/number.md +163 -0
  65. package/vendor/node-addon-api/doc/object.md +411 -0
  66. package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
  67. package/vendor/node-addon-api/doc/object_reference.md +117 -0
  68. package/vendor/node-addon-api/doc/object_wrap.md +588 -0
  69. package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
  70. package/vendor/node-addon-api/doc/promises.md +79 -0
  71. package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
  72. package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
  73. package/vendor/node-addon-api/doc/range_error.md +59 -0
  74. package/vendor/node-addon-api/doc/reference.md +113 -0
  75. package/vendor/node-addon-api/doc/setup.md +110 -0
  76. package/vendor/node-addon-api/doc/string.md +93 -0
  77. package/vendor/node-addon-api/doc/symbol.md +61 -0
  78. package/vendor/node-addon-api/doc/threadsafe.md +121 -0
  79. package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
  80. package/vendor/node-addon-api/doc/type_error.md +59 -0
  81. package/vendor/node-addon-api/doc/typed_array.md +78 -0
  82. package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
  83. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
  84. package/vendor/node-addon-api/doc/value.md +340 -0
  85. package/vendor/node-addon-api/doc/version_management.md +43 -0
  86. package/vendor/node-addon-api/package.json +415 -0
  87. package/vendor/node-addon-api/test/README.md +91 -0
  88. package/vendor/node-addon-api/test/addon.cc +36 -0
  89. package/vendor/node-addon-api/test/addon.js +11 -0
  90. package/vendor/node-addon-api/test/addon_build/index.js +49 -0
  91. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
  92. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
  93. package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
  94. package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
  95. package/vendor/node-addon-api/test/addon_data.cc +99 -0
  96. package/vendor/node-addon-api/test/addon_data.js +46 -0
  97. package/vendor/node-addon-api/test/array_buffer.cc +243 -0
  98. package/vendor/node-addon-api/test/array_buffer.js +69 -0
  99. package/vendor/node-addon-api/test/async_context.cc +36 -0
  100. package/vendor/node-addon-api/test/async_context.js +122 -0
  101. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
  102. package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
  103. package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
  104. package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
  105. package/vendor/node-addon-api/test/async_worker.cc +106 -0
  106. package/vendor/node-addon-api/test/async_worker.js +179 -0
  107. package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
  108. package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
  109. package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
  110. package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
  111. package/vendor/node-addon-api/test/basic_types/array.js +35 -0
  112. package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
  113. package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
  114. package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
  115. package/vendor/node-addon-api/test/basic_types/number.js +114 -0
  116. package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
  117. package/vendor/node-addon-api/test/basic_types/value.js +133 -0
  118. package/vendor/node-addon-api/test/bigint.cc +91 -0
  119. package/vendor/node-addon-api/test/bigint.js +53 -0
  120. package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
  121. package/vendor/node-addon-api/test/binding.cc +173 -0
  122. package/vendor/node-addon-api/test/binding.gyp +124 -0
  123. package/vendor/node-addon-api/test/buffer.cc +183 -0
  124. package/vendor/node-addon-api/test/buffer.js +69 -0
  125. package/vendor/node-addon-api/test/callbackscope.cc +22 -0
  126. package/vendor/node-addon-api/test/callbackscope.js +49 -0
  127. package/vendor/node-addon-api/test/common/index.js +114 -0
  128. package/vendor/node-addon-api/test/common/test_helper.h +71 -0
  129. package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
  130. package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
  131. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
  132. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
  133. package/vendor/node-addon-api/test/date.cc +44 -0
  134. package/vendor/node-addon-api/test/date.js +18 -0
  135. package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
  136. package/vendor/node-addon-api/test/env_cleanup.js +56 -0
  137. package/vendor/node-addon-api/test/error.cc +287 -0
  138. package/vendor/node-addon-api/test/error.js +81 -0
  139. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
  140. package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
  141. package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
  142. package/vendor/node-addon-api/test/external.cc +81 -0
  143. package/vendor/node-addon-api/test/external.js +88 -0
  144. package/vendor/node-addon-api/test/function.cc +324 -0
  145. package/vendor/node-addon-api/test/function.js +133 -0
  146. package/vendor/node-addon-api/test/function_reference.cc +202 -0
  147. package/vendor/node-addon-api/test/function_reference.js +157 -0
  148. package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
  149. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
  150. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
  151. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
  152. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
  153. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
  154. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
  155. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
  156. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
  157. package/vendor/node-addon-api/test/handlescope.cc +60 -0
  158. package/vendor/node-addon-api/test/handlescope.js +14 -0
  159. package/vendor/node-addon-api/test/index.js +159 -0
  160. package/vendor/node-addon-api/test/maybe/check.cc +23 -0
  161. package/vendor/node-addon-api/test/maybe/index.js +38 -0
  162. package/vendor/node-addon-api/test/memory_management.cc +17 -0
  163. package/vendor/node-addon-api/test/memory_management.js +9 -0
  164. package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
  165. package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
  166. package/vendor/node-addon-api/test/name.cc +108 -0
  167. package/vendor/node-addon-api/test/name.js +59 -0
  168. package/vendor/node-addon-api/test/napi_child.js +14 -0
  169. package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
  170. package/vendor/node-addon-api/test/object/delete_property.js +41 -0
  171. package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
  172. package/vendor/node-addon-api/test/object/finalizer.js +28 -0
  173. package/vendor/node-addon-api/test/object/get_property.cc +34 -0
  174. package/vendor/node-addon-api/test/object/get_property.js +40 -0
  175. package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
  176. package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
  177. package/vendor/node-addon-api/test/object/has_property.cc +38 -0
  178. package/vendor/node-addon-api/test/object/has_property.js +37 -0
  179. package/vendor/node-addon-api/test/object/object.cc +350 -0
  180. package/vendor/node-addon-api/test/object/object.js +217 -0
  181. package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
  182. package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
  183. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
  184. package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
  185. package/vendor/node-addon-api/test/object/set_property.cc +45 -0
  186. package/vendor/node-addon-api/test/object/set_property.js +30 -0
  187. package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
  188. package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
  189. package/vendor/node-addon-api/test/object_reference.cc +219 -0
  190. package/vendor/node-addon-api/test/object_reference.js +259 -0
  191. package/vendor/node-addon-api/test/objectwrap.cc +268 -0
  192. package/vendor/node-addon-api/test/objectwrap.js +284 -0
  193. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
  194. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
  195. package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
  196. package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
  197. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
  198. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
  199. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
  200. package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
  201. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
  202. package/vendor/node-addon-api/test/promise.cc +29 -0
  203. package/vendor/node-addon-api/test/promise.js +18 -0
  204. package/vendor/node-addon-api/test/reference.cc +24 -0
  205. package/vendor/node-addon-api/test/reference.js +14 -0
  206. package/vendor/node-addon-api/test/run_script.cc +56 -0
  207. package/vendor/node-addon-api/test/run_script.js +45 -0
  208. package/vendor/node-addon-api/test/symbol.cc +79 -0
  209. package/vendor/node-addon-api/test/symbol.js +73 -0
  210. package/vendor/node-addon-api/test/testUtil.js +54 -0
  211. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
  212. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
  213. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
  214. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
  215. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
  216. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
  217. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
  218. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
  219. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
  220. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
  221. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
  222. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
  223. package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
  224. package/vendor/node-addon-api/test/thunking_manual.js +17 -0
  225. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
  226. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
  227. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
  228. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
  229. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
  230. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
  231. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
  232. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
  233. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
  234. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
  235. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
  236. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
  237. package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
  238. package/vendor/node-addon-api/test/typedarray.cc +216 -0
  239. package/vendor/node-addon-api/test/typedarray.js +69 -0
  240. package/vendor/node-addon-api/test/version_management.cc +27 -0
  241. package/vendor/node-addon-api/test/version_management.js +31 -0
  242. package/vendor/node-addon-api/unit-test/README.md +28 -0
  243. package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
  244. package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
  245. package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
  246. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
  247. package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
  248. package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
  249. package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
  250. package/vendor/node-addon-api/unit-test/setup.js +13 -0
  251. package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
  252. package/vendor/node-addon-api/unit-test/test.js +30 -0
  253. package/vendor/raylib/projects/VS2019/examples/audio_module_playing.vcxproj +387 -0
  254. package/vendor/raylib/projects/VS2019/examples/audio_multichannel_sound.vcxproj +387 -0
  255. package/vendor/raylib/projects/VS2019/examples/audio_music_stream.vcxproj +387 -0
  256. package/vendor/raylib/projects/VS2019/examples/audio_raw_stream.vcxproj +387 -0
  257. package/vendor/raylib/projects/VS2019/examples/audio_sound_loading.vcxproj +387 -0
  258. package/vendor/raylib/projects/VS2019/examples/core_2d_camera.vcxproj +387 -0
  259. package/vendor/raylib/projects/VS2019/examples/core_2d_camera_platformer.vcxproj +387 -0
  260. package/vendor/raylib/projects/VS2019/examples/core_3d_camera_first_person.vcxproj +387 -0
  261. package/vendor/raylib/projects/VS2019/examples/core_3d_camera_free.vcxproj +387 -0
  262. package/vendor/raylib/projects/VS2019/examples/core_3d_camera_mode.vcxproj +387 -0
  263. package/vendor/raylib/projects/VS2019/examples/core_3d_picking.vcxproj +387 -0
  264. package/vendor/raylib/projects/VS2019/examples/core_basic_window.vcxproj +387 -0
  265. package/vendor/raylib/projects/VS2019/examples/core_custom_logging.vcxproj +387 -0
  266. package/vendor/raylib/projects/VS2019/examples/core_drop_files.vcxproj +387 -0
  267. package/vendor/raylib/projects/VS2019/examples/core_input_gamepad.vcxproj +387 -0
  268. package/vendor/raylib/projects/VS2019/examples/core_input_gestures.vcxproj +387 -0
  269. package/vendor/raylib/projects/VS2019/examples/core_input_keys.vcxproj +387 -0
  270. package/vendor/raylib/projects/VS2019/examples/core_input_mouse.vcxproj +387 -0
  271. package/vendor/raylib/projects/VS2019/examples/core_input_mouse_wheel.vcxproj +387 -0
  272. package/vendor/raylib/projects/VS2019/examples/core_input_multitouch.vcxproj +387 -0
  273. package/vendor/raylib/projects/VS2019/examples/core_loading_thread.vcxproj +387 -0
  274. package/vendor/raylib/projects/VS2019/examples/core_quat_conversion.vcxproj +387 -0
  275. package/vendor/raylib/projects/VS2019/examples/core_random_values.vcxproj +387 -0
  276. package/vendor/raylib/projects/VS2019/examples/core_scissor_test.vcxproj +387 -0
  277. package/vendor/raylib/projects/VS2019/examples/core_split_screen.vcxproj +387 -0
  278. package/vendor/raylib/projects/VS2019/examples/core_storage_values.vcxproj +387 -0
  279. package/vendor/raylib/projects/VS2019/examples/core_vr_simulator.vcxproj +387 -0
  280. package/vendor/raylib/projects/VS2019/examples/core_window_flags.vcxproj +387 -0
  281. package/vendor/raylib/projects/VS2019/examples/core_window_letterbox.vcxproj +387 -0
  282. package/vendor/raylib/projects/VS2019/examples/core_world_screen.vcxproj +387 -0
  283. package/vendor/raylib/projects/VS2019/examples/easings_testbed.vcxproj +387 -0
  284. package/vendor/raylib/projects/VS2019/examples/embedded_files_loading.vcxproj +387 -0
  285. package/vendor/raylib/projects/VS2019/examples/models_animation.vcxproj +387 -0
  286. package/vendor/raylib/projects/VS2019/examples/models_billboard.vcxproj +387 -0
  287. package/vendor/raylib/projects/VS2019/examples/models_box_collisions.vcxproj +387 -0
  288. package/vendor/raylib/projects/VS2019/examples/models_cubicmap.vcxproj +387 -0
  289. package/vendor/raylib/projects/VS2019/examples/models_first_person_maze.vcxproj +387 -0
  290. package/vendor/raylib/projects/VS2019/examples/models_geometric_shapes.vcxproj +387 -0
  291. package/vendor/raylib/projects/VS2019/examples/models_heightmap.vcxproj +387 -0
  292. package/vendor/raylib/projects/VS2019/examples/models_loading.vcxproj +387 -0
  293. package/vendor/raylib/projects/VS2019/examples/models_loading_gltf.vcxproj +387 -0
  294. package/vendor/raylib/projects/VS2019/examples/models_loading_vox.vcxproj +387 -0
  295. package/vendor/raylib/projects/VS2019/examples/models_mesh_generation.vcxproj +387 -0
  296. package/vendor/raylib/projects/VS2019/examples/models_mesh_picking.vcxproj +387 -0
  297. package/vendor/raylib/projects/VS2019/examples/models_orthographic_projection.vcxproj +387 -0
  298. package/vendor/raylib/projects/VS2019/examples/models_rlgl_solar_system.vcxproj +387 -0
  299. package/vendor/raylib/projects/VS2019/examples/models_skybox.vcxproj +387 -0
  300. package/vendor/raylib/projects/VS2019/examples/models_waving_cubes.vcxproj +387 -0
  301. package/vendor/raylib/projects/VS2019/examples/models_yaw_pitch_roll.vcxproj +387 -0
  302. package/vendor/raylib/projects/VS2019/examples/physics_demo.vcxproj +387 -0
  303. package/vendor/raylib/projects/VS2019/examples/physics_friction.vcxproj +387 -0
  304. package/vendor/raylib/projects/VS2019/examples/physics_movement.vcxproj +387 -0
  305. package/vendor/raylib/projects/VS2019/examples/physics_restitution.vcxproj +387 -0
  306. package/vendor/raylib/projects/VS2019/examples/physics_shatter.vcxproj +387 -0
  307. package/vendor/raylib/projects/VS2019/examples/raudio_standalone.vcxproj +387 -0
  308. package/vendor/raylib/projects/VS2019/examples/rlgl_standalone.vcxproj +391 -0
  309. package/vendor/raylib/projects/VS2019/examples/shaders_basic_lighting.vcxproj +387 -0
  310. package/vendor/raylib/projects/VS2019/examples/shaders_custom_uniform.vcxproj +387 -0
  311. package/vendor/raylib/projects/VS2019/examples/shaders_eratosthenes.vcxproj +387 -0
  312. package/vendor/raylib/projects/VS2019/examples/shaders_fog.vcxproj +387 -0
  313. package/vendor/raylib/projects/VS2019/examples/shaders_hot_reloading.vcxproj +387 -0
  314. package/vendor/raylib/projects/VS2019/examples/shaders_julia_set.vcxproj +387 -0
  315. package/vendor/raylib/projects/VS2019/examples/shaders_mesh_instancing.vcxproj +387 -0
  316. package/vendor/raylib/projects/VS2019/examples/shaders_model_shader.vcxproj +387 -0
  317. package/vendor/raylib/projects/VS2019/examples/shaders_multi_sample2d.vcxproj +387 -0
  318. package/vendor/raylib/projects/VS2019/examples/shaders_palette_switch.vcxproj +387 -0
  319. package/vendor/raylib/projects/VS2019/examples/shaders_postprocessing.vcxproj +387 -0
  320. package/vendor/raylib/projects/VS2019/examples/shaders_raymarching.vcxproj +387 -0
  321. package/vendor/raylib/projects/VS2019/examples/shaders_shapes_textures.vcxproj +387 -0
  322. package/vendor/raylib/projects/VS2019/examples/shaders_simple_mask.vcxproj +387 -0
  323. package/vendor/raylib/projects/VS2019/examples/shaders_spotlight.vcxproj +387 -0
  324. package/vendor/raylib/projects/VS2019/examples/shaders_texture_drawing.vcxproj +387 -0
  325. package/vendor/raylib/projects/VS2019/examples/shaders_texture_waves.vcxproj +387 -0
  326. package/vendor/raylib/projects/VS2019/examples/shapes_basic_shapes.vcxproj +387 -0
  327. package/vendor/raylib/projects/VS2019/examples/shapes_bouncing_ball.vcxproj +387 -0
  328. package/vendor/raylib/projects/VS2019/examples/shapes_collision_area.vcxproj +387 -0
  329. package/vendor/raylib/projects/VS2019/examples/shapes_colors_palette.vcxproj +387 -0
  330. package/vendor/raylib/projects/VS2019/examples/shapes_draw_circle_sector.vcxproj +387 -0
  331. package/vendor/raylib/projects/VS2019/examples/shapes_draw_rectangle_rounded.vcxproj +387 -0
  332. package/vendor/raylib/projects/VS2019/examples/shapes_draw_ring.vcxproj +387 -0
  333. package/vendor/raylib/projects/VS2019/examples/shapes_easings_ball_anim.vcxproj +387 -0
  334. package/vendor/raylib/projects/VS2019/examples/shapes_easings_box_anim.vcxproj +387 -0
  335. package/vendor/raylib/projects/VS2019/examples/shapes_easings_rectangle_array.vcxproj +387 -0
  336. package/vendor/raylib/projects/VS2019/examples/shapes_following_eyes.vcxproj +387 -0
  337. package/vendor/raylib/projects/VS2019/examples/shapes_lines_bezier.vcxproj +387 -0
  338. package/vendor/raylib/projects/VS2019/examples/shapes_logo_raylib.vcxproj +387 -0
  339. package/vendor/raylib/projects/VS2019/examples/shapes_logo_raylib_anim.vcxproj +387 -0
  340. package/vendor/raylib/projects/VS2019/examples/shapes_rectangle_scaling.vcxproj +387 -0
  341. package/vendor/raylib/projects/VS2019/examples/text_font_filters.vcxproj +387 -0
  342. package/vendor/raylib/projects/VS2019/examples/text_font_loading.vcxproj +387 -0
  343. package/vendor/raylib/projects/VS2019/examples/text_font_sdf.vcxproj +387 -0
  344. package/vendor/raylib/projects/VS2019/examples/text_font_spritefont.vcxproj +387 -0
  345. package/vendor/raylib/projects/VS2019/examples/text_format_text.vcxproj +387 -0
  346. package/vendor/raylib/projects/VS2019/examples/text_input_box.vcxproj +387 -0
  347. package/vendor/raylib/projects/VS2019/examples/text_raylib_fonts.vcxproj +387 -0
  348. package/vendor/raylib/projects/VS2019/examples/text_rectangle_bounds.vcxproj +387 -0
  349. package/vendor/raylib/projects/VS2019/examples/text_unicode.vcxproj +387 -0
  350. package/vendor/raylib/projects/VS2019/examples/text_writing_anim.vcxproj +387 -0
  351. package/vendor/raylib/projects/VS2019/examples/textures_background_scrolling.vcxproj +387 -0
  352. package/vendor/raylib/projects/VS2019/examples/textures_blend_modes.vcxproj +387 -0
  353. package/vendor/raylib/projects/VS2019/examples/textures_bunnymark.vcxproj +387 -0
  354. package/vendor/raylib/projects/VS2019/examples/textures_draw_tiled.vcxproj +387 -0
  355. package/vendor/raylib/projects/VS2019/examples/textures_image_drawing.vcxproj +387 -0
  356. package/vendor/raylib/projects/VS2019/examples/textures_image_generation.vcxproj +387 -0
  357. package/vendor/raylib/projects/VS2019/examples/textures_image_loading.vcxproj +387 -0
  358. package/vendor/raylib/projects/VS2019/examples/textures_image_processing.vcxproj +387 -0
  359. package/vendor/raylib/projects/VS2019/examples/textures_image_text.vcxproj +387 -0
  360. package/vendor/raylib/projects/VS2019/examples/textures_logo_raylib.vcxproj +387 -0
  361. package/vendor/raylib/projects/VS2019/examples/textures_mouse_painting.vcxproj +387 -0
  362. package/vendor/raylib/projects/VS2019/examples/textures_npatch_drawing.vcxproj +387 -0
  363. package/vendor/raylib/projects/VS2019/examples/textures_particles_blending.vcxproj +387 -0
  364. package/vendor/raylib/projects/VS2019/examples/textures_raw_data.vcxproj +387 -0
  365. package/vendor/raylib/projects/VS2019/examples/textures_rectangle.vcxproj +387 -0
  366. package/vendor/raylib/projects/VS2019/examples/textures_sprite_button.vcxproj +387 -0
  367. package/vendor/raylib/projects/VS2019/examples/textures_sprite_explosion.vcxproj +387 -0
  368. package/vendor/raylib/projects/VS2019/examples/textures_srcrec_dstrec.vcxproj +387 -0
  369. package/vendor/raylib/projects/VS2019/examples/textures_to_image.vcxproj +387 -0
  370. package/vendor/raylib/projects/VS2019/raylib/raylib.vcxproj +341 -0
  371. package/vendor/raylib/projects/VS2019/raylib.sln +2274 -0
  372. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj +226 -0
  373. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.filters +10 -0
  374. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.user +4 -0
  375. package/vendor/raylib/projects/VS2019-Android/raylib_android.sln +75 -0
package/CMakeLists.txt CHANGED
@@ -30,6 +30,7 @@ set(KOFFI_SRC
30
30
  src/call_x64_win.cc
31
31
  src/call_x86.cc
32
32
  src/ffi.cc
33
+ src/parser.cc
33
34
  src/util.cc
34
35
  vendor/libcc/libcc.cc
35
36
  )
@@ -54,7 +55,7 @@ endif()
54
55
  add_node_addon(NAME koffi SOURCES ${KOFFI_SRC})
55
56
  target_include_directories(koffi PRIVATE . vendor/node-addon-api)
56
57
 
57
- target_compile_definitions(koffi PRIVATE FELIX_TARGET=koffi NAPI_DISABLE_CPP_EXCEPTIONS)
58
+ target_compile_definitions(koffi PRIVATE FELIX_TARGET=koffi NAPI_DISABLE_CPP_EXCEPTIONS NAPI_VERSION=8)
58
59
  if(WIN32)
59
60
  target_compile_definitions(koffi PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE)
60
61
  target_link_libraries(koffi PRIVATE ws2_32)
package/README.md CHANGED
@@ -196,17 +196,20 @@ const Font = koffi.struct('Font', {
196
196
  // Fix the path to Raylib DLL if needed
197
197
  let lib = koffi.load('build/raylib' + koffi.extension);
198
198
 
199
- const InitWindow = lib.cdecl('InitWindow', 'void', ['int', 'int', 'string']);
200
- const SetTargetFPS = lib.cdecl('SetTargetFPS', 'void', ['int']);
201
- const GetScreenWidth = lib.cdecl('GetScreenWidth', 'int', []);
202
- const GetScreenHeight = lib.cdecl('GetScreenHeight', 'int', []);
203
- const ClearBackground = lib.cdecl('ClearBackground', 'void', [Color]);
204
- const BeginDrawing = lib.cdecl('BeginDrawing', 'void', []);
205
- const EndDrawing = lib.cdecl('EndDrawing', 'void', []);
206
- const WindowShouldClose = lib.cdecl('WindowShouldClose', 'bool', []);
207
- const GetFontDefault = lib.cdecl('GetFontDefault', Font, []);
208
- const MeasureTextEx = lib.cdecl('MeasureTextEx', Vector2, [Font, 'string', 'float', 'float']);
209
- const DrawTextEx = lib.cdecl('DrawTextEx', 'void', [Font, 'string', Vector2, 'float', 'float', Color]);
199
+ // Classic function declaration
200
+ const InitWindow = lib.func('InitWindow', 'void', ['int', 'int', 'string']);
201
+ const SetTargetFPS = lib.func('SetTargetFPS', 'void', ['int']);
202
+ const GetScreenWidth = lib.func('GetScreenWidth', 'int', []);
203
+ const GetScreenHeight = lib.func('GetScreenHeight', 'int', []);
204
+ const ClearBackground = lib.func('ClearBackground', 'void', [Color]);
205
+
206
+ // Prototype parser
207
+ const BeginDrawing = lib.func('void BeginDrawing()');
208
+ const EndDrawing = lib.func('void EndDrawing()');
209
+ const WindowShouldClose = lib.func('void WindowShouldClose(bool)');
210
+ const GetFontDefault = lib.func('Font GetFontDefault()');
211
+ const MeasureTextEx = lib.func('Vector2 MeasureTextEx(Font, const char *, float, float)');
212
+ const DrawTextEx = lib.func('void DrawTextEx(Font font, const char *text, Vector2 pos, float size, float spacing, Color tint)');
210
213
 
211
214
  InitWindow(800, 600, 'Test Raylib');
212
215
  SetTargetFPS(60);
@@ -260,13 +263,13 @@ MessageBoxA(null, 'Hello', 'Foobar', MB_ICONINFORMATION);
260
263
 
261
264
  Koffi is tested on multiple architectures using emulated (accelerated when possible) QEMU machines. First, you need to install qemu packages, such as `qemu-system` (or even `qemu-system-gui`) on Ubuntu.
262
265
 
263
- These machines are not included directly in this repository (for license and size reasons), but they are available here: https://koromix.dev/files/koffi/
266
+ These machines are not included directly in this repository (for license and size reasons), but they are available here: https://koromix.dev/files/koffi/machines/
264
267
 
265
268
  For example, if you want to run the tests on Debian ARM64, run the following commands:
266
269
 
267
270
  ```sh
268
271
  cd luigi/koffi/test/
269
- wget -q -O- https://koromix.dev/files/koffi/qemu_debian_arm64.tar.zst | zstd -d | tar xv
272
+ wget -q -O- https://koromix.dev/files/koffi/machines/qemu_debian_arm64.tar.zst | zstd -d | tar xv
270
273
  sha256sum -c --ignore-missing registry/sha256sum.txt
271
274
  ```
272
275
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koffi",
3
- "version": "0.9.34",
3
+ "version": "0.9.37",
4
4
  "description": "Fast and simple FFI (foreign function interface) for Node.js",
5
5
  "keywords": [
6
6
  "foreign",
@@ -18,12 +18,12 @@
18
18
  "author": "Niels Martignène <niels.martignene@protonmail.com>",
19
19
  "main": "src/index.js",
20
20
  "scripts": {
21
- "install": "cnoke",
21
+ "install": "cnoke --prebuild https://koromix.dev/files/koffi/builds/{{version}}/koffi_{{platform}}_{{arch}}.tar.gz",
22
22
  "test": "node test/test.js"
23
23
  },
24
24
  "license": "AGPL-3.0",
25
25
  "dependencies": {
26
- "cnoke": "^1.0.1"
26
+ "cnoke": "^1.0.4"
27
27
  },
28
28
  "devDependencies": {
29
29
  "chalk": "^4.1.2",
@@ -31,7 +31,8 @@
31
31
  "minimatch": "^5.0.1",
32
32
  "node-ssh": "^12.0.3",
33
33
  "ref-napi": "^3.0.3",
34
- "ref-struct-di": "^1.1.1"
34
+ "ref-struct-di": "^1.1.1",
35
+ "tar": "^6.1.11"
35
36
  },
36
37
  "files": [
37
38
  "src",
package/src/call_arm32.cc CHANGED
@@ -394,8 +394,12 @@ Napi::Value TranslateCall(InstanceData *instance, const FunctionInfo *func, cons
394
394
  if (RG_UNLIKELY(!call.AllocHeap(param.type->ref->size, 16, &ptr)))
395
395
  return env.Null();
396
396
 
397
- if ((param.directions & 1) && !call.PushObject(obj, param.type->ref, ptr))
398
- return env.Null();
397
+ if (param.directions & 1) {
398
+ if (!call.PushObject(obj, param.type->ref, ptr))
399
+ return env.Null();
400
+ } else {
401
+ memset(ptr, 0, param.type->size);
402
+ }
399
403
  if (param.directions & 2) {
400
404
  OutObject out = {obj, ptr, param.type->ref};
401
405
  out_objects.Append(out);
package/src/call_arm64.cc CHANGED
@@ -353,8 +353,12 @@ Napi::Value TranslateCall(InstanceData *instance, const FunctionInfo *func, cons
353
353
  if (RG_UNLIKELY(!call.AllocHeap(param.type->ref->size, 16, &ptr)))
354
354
  return env.Null();
355
355
 
356
- if ((param.directions & 1) && !call.PushObject(obj, param.type->ref, ptr))
357
- return env.Null();
356
+ if (param.directions & 1) {
357
+ if (!call.PushObject(obj, param.type->ref, ptr))
358
+ return env.Null();
359
+ } else {
360
+ memset(ptr, 0, param.type->size);
361
+ }
358
362
  if (param.directions & 2) {
359
363
  OutObject out = {obj, ptr, param.type->ref};
360
364
  out_objects.Append(out);
@@ -323,8 +323,12 @@ Napi::Value TranslateCall(InstanceData *instance, const FunctionInfo *func, cons
323
323
  if (RG_UNLIKELY(!call.AllocHeap(param.type->ref->size, 16, &ptr)))
324
324
  return env.Null();
325
325
 
326
- if ((param.directions & 1) && !call.PushObject(obj, param.type->ref, ptr))
327
- return env.Null();
326
+ if (param.directions & 1) {
327
+ if (!call.PushObject(obj, param.type->ref, ptr))
328
+ return env.Null();
329
+ } else {
330
+ memset(ptr, 0, param.type->size);
331
+ }
328
332
  if (param.directions & 2) {
329
333
  OutObject out = {obj, ptr, param.type->ref};
330
334
  out_objects.Append(out);
@@ -157,8 +157,12 @@ Napi::Value TranslateCall(InstanceData *instance, const FunctionInfo *func, cons
157
157
  if (RG_UNLIKELY(!call.AllocHeap(param.type->ref->size, 16, &ptr)))
158
158
  return env.Null();
159
159
 
160
- if ((param.directions & 1) && !call.PushObject(obj, param.type->ref, ptr))
161
- return env.Null();
160
+ if (param.directions & 1) {
161
+ if (!call.PushObject(obj, param.type->ref, ptr))
162
+ return env.Null();
163
+ } else {
164
+ memset(ptr, 0, param.type->size);
165
+ }
162
166
  if (param.directions & 2) {
163
167
  OutObject out = {obj, ptr, param.type->ref};
164
168
  out_objects.Append(out);
package/src/call_x86.cc CHANGED
@@ -65,7 +65,7 @@ bool AnalyseFunction(InstanceData *instance, FunctionInfo *func)
65
65
  func->args_size = params_size + 4 * !func->ret.trivial;
66
66
 
67
67
  switch (func->convention) {
68
- case CallConvention::Default: {
68
+ case CallConvention::Cdecl: {
69
69
  func->decorated_name = Fmt(&instance->str_alloc, "_%1", func->name).ptr;
70
70
  } break;
71
71
  case CallConvention::Stdcall: {
@@ -201,8 +201,12 @@ Napi::Value TranslateCall(InstanceData *instance, const FunctionInfo *func, cons
201
201
  if (RG_UNLIKELY(!call.AllocHeap(param.type->ref->size, 16, &ptr)))
202
202
  return env.Null();
203
203
 
204
- if ((param.directions & 1) && !call.PushObject(obj, param.type->ref, ptr))
205
- return env.Null();
204
+ if (param.directions & 1) {
205
+ if (!call.PushObject(obj, param.type->ref, ptr))
206
+ return env.Null();
207
+ } else {
208
+ memset(ptr, 0, param.type->size);
209
+ }
206
210
  if (param.directions & 2) {
207
211
  OutObject out = {obj, ptr, param.type->ref};
208
212
  out_objects.Append(out);
package/src/ffi.cc CHANGED
@@ -14,6 +14,7 @@
14
14
  #include "vendor/libcc/libcc.hh"
15
15
  #include "ffi.hh"
16
16
  #include "call.hh"
17
+ #include "parser.hh"
17
18
  #include "util.hh"
18
19
 
19
20
  #ifdef _WIN32
@@ -182,23 +183,8 @@ static Napi::Value CreatePointerType(const Napi::CallbackInfo &info)
182
183
  if (!ref)
183
184
  return env.Null();
184
185
 
185
- char name_buf[256];
186
- Fmt(name_buf, "%1%2*", ref->name, ref->primitive == PrimitiveKind::Pointer ? "" : " ");
187
-
188
- TypeInfo *type = instance->types_map.FindValue(name_buf, nullptr);
189
-
190
- if (!type) {
191
- type = instance->types.AppendDefault();
192
-
193
- type->name = DuplicateString(name_buf, &instance->str_alloc).ptr;
194
-
195
- type->primitive = PrimitiveKind::Pointer;
196
- type->size = RG_SIZE(void *);
197
- type->align = RG_SIZE(void *);
198
- type->ref = ref;
199
-
200
- instance->types_map.Set(type);
201
- }
186
+ TypeInfo *type = (TypeInfo *)GetPointerType(instance, ref);
187
+ RG_ASSERT(type);
202
188
 
203
189
  Napi::External<TypeInfo> external = Napi::External<TypeInfo>::New(env, type);
204
190
  SetValueTag(instance, external, &TypeInfoMarker);
@@ -316,38 +302,33 @@ static Napi::Value TranslateVariadicCall(const Napi::CallbackInfo &info)
316
302
  return TranslateCall(instance, &func, info);
317
303
  }
318
304
 
319
- static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConvention convention, bool variadic)
305
+ static bool ParseClassicFunction(Napi::Env env, Napi::String name, Napi::Value ret,
306
+ Napi::Array parameters, FunctionInfo *func)
320
307
  {
321
- Napi::Env env = info.Env();
322
308
  InstanceData *instance = env.GetInstanceData<InstanceData>();
323
- LibraryHolder *lib = (LibraryHolder *)info.Data();
324
309
 
325
- if (info.Length() < 3) {
326
- ThrowError<Napi::TypeError>(env, "Expected 3 or 4 arguments, not %1", info.Length());
327
- return env.Null();
310
+ #ifdef _WIN32
311
+ if (!name.IsString() && !name.IsNumber()) {
312
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for name, expected string or integer", GetValueType(instance, name));
313
+ return false;
328
314
  }
329
- if (!info[0].IsString()) {
330
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for filename, expected string", GetValueType(instance, info[0]));
331
- return env.Null();
315
+ #else
316
+ if (!name.IsString()) {
317
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for name, expected string", GetValueType(instance, name));
318
+ return false;
332
319
  }
320
+ #endif
333
321
 
334
- FunctionInfo *func = new FunctionInfo();
335
- RG_DEFER_N(func_guard) { delete func; };
336
-
337
- std::string name = ((Napi::Value)info[0u]).As<Napi::String>();
338
- func->name = DuplicateString(name.c_str(), &instance->str_alloc).ptr;
339
- func->lib = lib->Ref();
340
- func->convention = convention;
322
+ func->name = DuplicateString(std::string(name).c_str(), &instance->str_alloc).ptr;
341
323
 
342
- func->ret.type = ResolveType(instance, info[1u]);
324
+ func->ret.type = ResolveType(instance, ret);
343
325
  if (!func->ret.type)
344
- return env.Null();
345
- if (!((Napi::Value)info[2u]).IsArray()) {
346
- ThrowError<Napi::TypeError>(env, "Unexpected %1 value for parameters of '%2', expected an array", GetValueType(instance, (Napi::Value)info[1u]), func->name);
347
- return env.Null();
326
+ return false;
327
+ if (!parameters.IsArray()) {
328
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for parameters of '%2', expected an array", GetValueType(instance, parameters), func->name);
329
+ return false;
348
330
  }
349
331
 
350
- Napi::Array parameters = ((Napi::Value)info[2u]).As<Napi::Array>();
351
332
  Size parameters_len = parameters.Length();
352
333
 
353
334
  if (parameters_len) {
@@ -357,11 +338,6 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
357
338
  func->variadic = true;
358
339
  parameters_len--;
359
340
  }
360
-
361
- if (!variadic && func->variadic) {
362
- LogError("Call convention '%1' does not support variadic functions, ignoring");
363
- func->convention = CallConvention::Default;
364
- }
365
341
  }
366
342
 
367
343
  for (uint32_t j = 0; j < parameters_len; j++) {
@@ -369,19 +345,19 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
369
345
 
370
346
  param.type = ResolveType(instance, parameters[j], &param.directions);
371
347
  if (!param.type)
372
- return env.Null();
348
+ return false;
373
349
  if (param.type->primitive == PrimitiveKind::Void) {
374
350
  ThrowError<Napi::TypeError>(env, "Type void cannot be used as a parameter");
375
- return env.Null();
351
+ return false;
376
352
  }
377
353
 
378
354
  if (func->parameters.len >= MaxParameters) {
379
355
  ThrowError<Napi::TypeError>(env, "Functions cannot have more than %1 parameters", MaxParameters);
380
- return env.Null();
356
+ return false;
381
357
  }
382
358
  if ((param.directions & 2) && ++func->out_parameters >= MaxOutParameters) {
383
359
  ThrowError<Napi::TypeError>(env, "Functions cannot have more than out %1 parameters", MaxOutParameters);
384
- return env.Null();
360
+ return false;
385
361
  }
386
362
 
387
363
  param.offset = j;
@@ -389,6 +365,40 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
389
365
  func->parameters.Append(param);
390
366
  }
391
367
 
368
+ return true;
369
+ }
370
+
371
+ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConvention convention)
372
+ {
373
+ Napi::Env env = info.Env();
374
+ InstanceData *instance = env.GetInstanceData<InstanceData>();
375
+ LibraryHolder *lib = (LibraryHolder *)info.Data();
376
+
377
+ FunctionInfo *func = new FunctionInfo();
378
+ RG_DEFER_N(func_guard) { delete func; };
379
+
380
+ func->lib = lib->Ref();
381
+ func->convention = convention;
382
+
383
+ if (info.Length() >= 3) {
384
+ if (!ParseClassicFunction(env, info[0u].As<Napi::String>(), info[1u], info[2u].As<Napi::Array>(), func))
385
+ return env.Null();
386
+ } else if (info.Length() >= 1) {
387
+ PrototypeParser parser(env);
388
+
389
+ if (!parser.Parse(info[0u].As<Napi::String>(), func))
390
+ return env.Null();
391
+ } else {
392
+ ThrowError<Napi::TypeError>(env, "Expected 1 or 3 arguments, not %1", info.Length());
393
+ return env.Null();
394
+ }
395
+
396
+ if (func->convention != CallConvention::Cdecl && func->variadic) {
397
+ LogError("Call convention '%1' does not support variadic functions, ignoring",
398
+ CallConventionNames[(int)func->convention]);
399
+ func->convention = CallConvention::Cdecl;
400
+ }
401
+
392
402
  if (!AnalyseFunction(instance, func))
393
403
  return env.Null();
394
404
  if (func->variadic) {
@@ -397,11 +407,18 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
397
407
  }
398
408
 
399
409
  #ifdef _WIN32
400
- if (func->decorated_name) {
401
- func->func = (void *)GetProcAddress((HMODULE)lib->module, func->decorated_name);
402
- }
403
- if (!func->func) {
404
- func->func = (void *)GetProcAddress((HMODULE)lib->module, func->name);
410
+ if (info[0].IsString()) {
411
+ if (func->decorated_name) {
412
+ func->func = (void *)GetProcAddress((HMODULE)lib->module, func->decorated_name);
413
+ }
414
+ if (!func->func) {
415
+ func->func = (void *)GetProcAddress((HMODULE)lib->module, func->name);
416
+ }
417
+ } else {
418
+ uint16_t ordinal = (uint16_t)info[0].As<Napi::Number>().Uint32Value();
419
+
420
+ func->decorated_name = nullptr;
421
+ func->func = (void *)GetProcAddress((HMODULE)lib->module, (LPCSTR)ordinal);
405
422
  }
406
423
  #else
407
424
  if (func->decorated_name) {
@@ -417,7 +434,7 @@ static Napi::Value FindLibraryFunction(const Napi::CallbackInfo &info, CallConve
417
434
  }
418
435
 
419
436
  Napi::Function::Callback call = func->variadic ? TranslateVariadicCall : TranslateNormalCall;
420
- Napi::Function wrapper = Napi::Function::New(env, call, name.c_str(), (void *)func);
437
+ Napi::Function wrapper = Napi::Function::New(env, call, func->name, (void *)func);
421
438
  wrapper.AddFinalizer([](Napi::Env, FunctionInfo *func) { delete func; }, func);
422
439
  func_guard.Disable();
423
440
 
@@ -481,17 +498,18 @@ static Napi::Value LoadSharedLibrary(const Napi::CallbackInfo &info)
481
498
 
482
499
  Napi::Object obj = Napi::Object::New(env);
483
500
 
484
- #define ADD_CONVENTION(Name, Value, Variadic) \
501
+ #define ADD_CONVENTION(Name, Value) \
485
502
  do { \
486
- const auto wrapper = [](const Napi::CallbackInfo &info) { return FindLibraryFunction(info, (Value), (Variadic)); }; \
503
+ const auto wrapper = [](const Napi::CallbackInfo &info) { return FindLibraryFunction(info, (Value)); }; \
487
504
  Napi::Function func = Napi::Function::New(env, wrapper, (Name), (void *)lib->Ref()); \
488
505
  func.AddFinalizer([](Napi::Env, LibraryHolder *lib) { lib->Unref(); }, lib); \
489
506
  obj.Set((Name), func); \
490
507
  } while (false)
491
508
 
492
- ADD_CONVENTION("cdecl", CallConvention::Default, true);
493
- ADD_CONVENTION("stdcall", CallConvention::Stdcall, false);
494
- ADD_CONVENTION("fastcall", CallConvention::Fastcall, false);
509
+ ADD_CONVENTION("func", CallConvention::Cdecl);
510
+ ADD_CONVENTION("cdecl", CallConvention::Cdecl);
511
+ ADD_CONVENTION("stdcall", CallConvention::Stdcall);
512
+ ADD_CONVENTION("fastcall", CallConvention::Fastcall);
495
513
 
496
514
  #undef ADD_CONVENTION
497
515
 
package/src/ffi.hh CHANGED
@@ -100,12 +100,12 @@ struct LibraryHolder {
100
100
  };
101
101
 
102
102
  enum class CallConvention {
103
- Default,
103
+ Cdecl,
104
104
  Stdcall,
105
105
  Fastcall
106
106
  };
107
107
  static const char *const CallConventionNames[] = {
108
- "Default",
108
+ "Cdecl",
109
109
  "Stdcall",
110
110
  "Fastcall"
111
111
  };
package/src/parser.cc ADDED
@@ -0,0 +1,246 @@
1
+ // This program is free software: you can redistribute it and/or modify
2
+ // it under the terms of the GNU Affero General Public License as published by
3
+ // the Free Software Foundation, either version 3 of the License, or
4
+ // (at your option) any later version.
5
+ //
6
+ // This program is distributed in the hope that it will be useful,
7
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
+ // GNU Affero General Public License for more details.
10
+ //
11
+ // You should have received a copy of the GNU Affero General Public License
12
+ // along with this program. If not, see https://www.gnu.org/licenses/.
13
+
14
+ #include "vendor/libcc/libcc.hh"
15
+ #include "ffi.hh"
16
+ #include "parser.hh"
17
+
18
+ #include <napi.h>
19
+
20
+ namespace RG {
21
+
22
+ bool PrototypeParser::Parse(Napi::String proto, FunctionInfo *func)
23
+ {
24
+ if (!proto.IsString()) {
25
+ ThrowError<Napi::TypeError>(env, "Unexpected %1 value for prototype, expected string", GetValueType(instance, proto));
26
+ return false;
27
+ }
28
+
29
+ tokens.Clear();
30
+ offset = 0;
31
+ valid = true;
32
+
33
+ Tokenize(std::string(proto).c_str());
34
+
35
+ func->ret.type = ParseType();
36
+ if (Match("__cdecl")) {
37
+ func->convention = CallConvention::Cdecl;
38
+ } else if (Match("__stdcall")) {
39
+ func->convention = CallConvention::Stdcall;
40
+ } else if (Match("__fastcall")) {
41
+ func->convention = CallConvention::Fastcall;
42
+ }
43
+ func->name = ParseIdentifier();
44
+
45
+ Consume("(");
46
+ if (offset < tokens.len && tokens[offset] != ")") {
47
+ for (;;) {
48
+ ParameterInfo param = {};
49
+
50
+ if (Match("...")) {
51
+ func->variadic = true;
52
+ break;
53
+ }
54
+
55
+ if (Match("_In_")) {
56
+ param.directions = 1;
57
+ } else if (Match("_Out_")) {
58
+ param.directions = 2;
59
+ } else if (Match("_Inout_")) {
60
+ param.directions = 3;
61
+ } else {
62
+ param.directions = 1;
63
+ }
64
+
65
+ param.type = ParseType();
66
+ if (param.type->primitive == PrimitiveKind::Void) {
67
+ MarkError("Type void cannot be used as a parameter");
68
+ return false;
69
+ }
70
+
71
+ if ((param.directions & 2) && (param.type->primitive != PrimitiveKind::Pointer ||
72
+ param.type->ref->primitive != PrimitiveKind::Record)) {
73
+ MarkError("Only object pointers can be used as out parameters (for now)");
74
+ return false;
75
+ }
76
+
77
+ offset += (offset < tokens.len && IsIdentifier(tokens[offset]));
78
+
79
+ if (func->parameters.len >= MaxParameters) {
80
+ MarkError("Functions cannot have more than %1 parameters", MaxParameters);
81
+ return false;
82
+ }
83
+ if ((param.directions & 2) && ++func->out_parameters >= MaxOutParameters) {
84
+ MarkError("Functions cannot have more than out %1 parameters", MaxOutParameters);
85
+ return false;
86
+ }
87
+
88
+ param.offset = func->parameters.len;
89
+
90
+ func->parameters.Append(param);
91
+
92
+ if (offset >= tokens.len || tokens[offset] != ",")
93
+ break;
94
+ offset++;
95
+ }
96
+ }
97
+ Consume(")");
98
+
99
+ Match(";");
100
+ if (offset < tokens.len) {
101
+ MarkError("Unexpected token '%1' after prototype", tokens[offset]);
102
+ }
103
+
104
+ return valid;
105
+ }
106
+
107
+ void PrototypeParser::Tokenize(const char *str)
108
+ {
109
+ for (Size i = 0; str[i]; i++) {
110
+ char c = str[i];
111
+
112
+ if (IsAsciiWhite(c)) {
113
+ continue;
114
+ } else if (IsAsciiAlpha(c) || c == '_') {
115
+ Size j = i;
116
+ while (str[++j] && (IsAsciiAlphaOrDigit(str[j]) || str[j] == '_'));
117
+
118
+ Span<const char> tok = MakeSpan(str + i, j - i);
119
+ tokens.Append(tok);
120
+
121
+ i = j - 1;
122
+ } else if (c == '.' && str[i + 1] == '.' && str[i + 2] == '.') {
123
+ tokens.Append("...");
124
+ i += 2;
125
+ } else {
126
+ Span<const char> tok = MakeSpan(str + i, 1);
127
+ tokens.Append(tok);
128
+ }
129
+ }
130
+ }
131
+
132
+ const TypeInfo *PrototypeParser::ParseType()
133
+ {
134
+ HeapArray<char> buf(&instance->str_alloc);
135
+
136
+ Size indirect = 0;
137
+
138
+ Size start = offset;
139
+ while (offset < tokens.len && IsIdentifier(tokens[offset])) {
140
+ Span<const char> tok = tokens[offset++];
141
+
142
+ if (tok != "const") {
143
+ buf.Append(tok);
144
+ buf.Append(' ');
145
+ }
146
+ }
147
+ if (offset == start) {
148
+ if (offset < tokens.len) {
149
+ MarkError("Unexpected token '%1', expected identifier", tokens[offset]);
150
+ } else {
151
+ MarkError("Unexpected end of prototype, expected identifier");
152
+ }
153
+ return instance->types_map.FindValue("void", nullptr);
154
+ }
155
+ while (offset < tokens.len && tokens[offset] == "*") {
156
+ offset++;
157
+ indirect++;
158
+ }
159
+ buf.ptr[--buf.len] = 0;
160
+
161
+ if (TestStr(buf, "char") && indirect) {
162
+ buf.RemoveFrom(0);
163
+ Fmt(&buf, "string");
164
+
165
+ indirect--;
166
+ }
167
+
168
+ while (buf.len) {
169
+ const TypeInfo *type = instance->types_map.FindValue(buf.ptr, nullptr);
170
+
171
+ if (type) {
172
+ for (Size i = 0; i < indirect; i++) {
173
+ type = GetPointerType(instance, type);
174
+ RG_ASSERT(type);
175
+ }
176
+ return type;
177
+ }
178
+
179
+ // Truncate last token
180
+ {
181
+ Span<const char> remain;
182
+ SplitStrReverse(buf, ' ', &remain);
183
+ buf.len = remain.len;
184
+ buf.ptr[buf.len] = 0;
185
+ }
186
+
187
+ if (indirect) {
188
+ offset -= indirect;
189
+ indirect = 0;
190
+ }
191
+ offset--;
192
+ }
193
+
194
+ MarkError("Unknown type '%1'", tokens[start]);
195
+ return instance->types_map.FindValue("void", nullptr);
196
+ }
197
+
198
+ const char *PrototypeParser::ParseIdentifier()
199
+ {
200
+ if (offset >= tokens.len) {
201
+ MarkError("Unexpected end of prototype, expected identifier");
202
+ return "";
203
+ }
204
+ if (!IsIdentifier(tokens[offset])) {
205
+ MarkError("Unexpected token '%1', expected identifier", tokens[offset]);
206
+ return "";
207
+ }
208
+
209
+ Span<const char> tok = tokens[offset++];
210
+ const char *ident = DuplicateString(tok, &instance->str_alloc).ptr;
211
+
212
+ return ident;
213
+ }
214
+
215
+ bool PrototypeParser::Consume(const char *expect)
216
+ {
217
+ if (offset >= tokens.len) {
218
+ MarkError("Unexpected end of prototype, expected '%1'", expect);
219
+ return false;
220
+ }
221
+ if (tokens[offset] != expect) {
222
+ MarkError("Unexpected token '%1', expected '%2'", tokens[offset], expect);
223
+ return false;
224
+ }
225
+
226
+ offset++;
227
+ return true;
228
+ }
229
+
230
+ bool PrototypeParser::Match(const char *expect)
231
+ {
232
+ if (offset < tokens.len && tokens[offset] == expect) {
233
+ offset++;
234
+ return true;
235
+ } else {
236
+ return false;
237
+ }
238
+ }
239
+
240
+ bool PrototypeParser::IsIdentifier(Span<const char> tok) const
241
+ {
242
+ RG_ASSERT(tok.len);
243
+ return IsAsciiAlpha(tok[0]) || tok[0] == '_';
244
+ }
245
+
246
+ }