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.
- package/CMakeLists.txt +2 -1
- package/README.md +16 -13
- package/package.json +5 -4
- package/src/call_arm32.cc +6 -2
- package/src/call_arm64.cc +6 -2
- package/src/call_x64_sysv.cc +6 -2
- package/src/call_x64_win.cc +6 -2
- package/src/call_x86.cc +7 -3
- package/src/ffi.cc +77 -59
- package/src/ffi.hh +2 -2
- package/src/parser.cc +246 -0
- package/src/parser.hh +63 -0
- package/src/util.cc +23 -0
- package/src/util.hh +3 -0
- package/test/registry/machines.json +70 -0
- package/test/test.js +116 -7
- package/test/tests/misc.js +16 -16
- package/test/tests/raylib.js +8 -8
- package/test/tests/sqlite.js +9 -9
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
- package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
- package/vendor/node-addon-api/appveyor.yml +37 -0
- package/vendor/node-addon-api/benchmark/README.md +47 -0
- package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
- package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
- package/vendor/node-addon-api/benchmark/function_args.js +60 -0
- package/vendor/node-addon-api/benchmark/index.js +34 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
- package/vendor/node-addon-api/doc/addon.md +163 -0
- package/vendor/node-addon-api/doc/array.md +81 -0
- package/vendor/node-addon-api/doc/array_buffer.md +155 -0
- package/vendor/node-addon-api/doc/async_context.md +86 -0
- package/vendor/node-addon-api/doc/async_operations.md +31 -0
- package/vendor/node-addon-api/doc/async_worker.md +427 -0
- package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
- package/vendor/node-addon-api/doc/bigint.md +97 -0
- package/vendor/node-addon-api/doc/boolean.md +68 -0
- package/vendor/node-addon-api/doc/buffer.md +150 -0
- package/vendor/node-addon-api/doc/callback_scope.md +54 -0
- package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
- package/vendor/node-addon-api/doc/checker-tool.md +32 -0
- package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
- package/vendor/node-addon-api/doc/cmake-js.md +68 -0
- package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
- package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
- package/vendor/node-addon-api/doc/dataview.md +248 -0
- package/vendor/node-addon-api/doc/date.md +68 -0
- package/vendor/node-addon-api/doc/env.md +196 -0
- package/vendor/node-addon-api/doc/error.md +120 -0
- package/vendor/node-addon-api/doc/error_handling.md +254 -0
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
- package/vendor/node-addon-api/doc/external.md +63 -0
- package/vendor/node-addon-api/doc/function.md +402 -0
- package/vendor/node-addon-api/doc/function_reference.md +238 -0
- package/vendor/node-addon-api/doc/generator.md +13 -0
- package/vendor/node-addon-api/doc/handle_scope.md +63 -0
- package/vendor/node-addon-api/doc/hierarchy.md +91 -0
- package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
- package/vendor/node-addon-api/doc/maybe.md +76 -0
- package/vendor/node-addon-api/doc/memory_management.md +27 -0
- package/vendor/node-addon-api/doc/name.md +29 -0
- package/vendor/node-addon-api/doc/node-gyp.md +82 -0
- package/vendor/node-addon-api/doc/number.md +163 -0
- package/vendor/node-addon-api/doc/object.md +411 -0
- package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
- package/vendor/node-addon-api/doc/object_reference.md +117 -0
- package/vendor/node-addon-api/doc/object_wrap.md +588 -0
- package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
- package/vendor/node-addon-api/doc/promises.md +79 -0
- package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
- package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
- package/vendor/node-addon-api/doc/range_error.md +59 -0
- package/vendor/node-addon-api/doc/reference.md +113 -0
- package/vendor/node-addon-api/doc/setup.md +110 -0
- package/vendor/node-addon-api/doc/string.md +93 -0
- package/vendor/node-addon-api/doc/symbol.md +61 -0
- package/vendor/node-addon-api/doc/threadsafe.md +121 -0
- package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
- package/vendor/node-addon-api/doc/type_error.md +59 -0
- package/vendor/node-addon-api/doc/typed_array.md +78 -0
- package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
- package/vendor/node-addon-api/doc/value.md +340 -0
- package/vendor/node-addon-api/doc/version_management.md +43 -0
- package/vendor/node-addon-api/package.json +415 -0
- package/vendor/node-addon-api/test/README.md +91 -0
- package/vendor/node-addon-api/test/addon.cc +36 -0
- package/vendor/node-addon-api/test/addon.js +11 -0
- package/vendor/node-addon-api/test/addon_build/index.js +49 -0
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
- package/vendor/node-addon-api/test/addon_data.cc +99 -0
- package/vendor/node-addon-api/test/addon_data.js +46 -0
- package/vendor/node-addon-api/test/array_buffer.cc +243 -0
- package/vendor/node-addon-api/test/array_buffer.js +69 -0
- package/vendor/node-addon-api/test/async_context.cc +36 -0
- package/vendor/node-addon-api/test/async_context.js +122 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
- package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
- package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
- package/vendor/node-addon-api/test/async_worker.cc +106 -0
- package/vendor/node-addon-api/test/async_worker.js +179 -0
- package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
- package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
- package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
- package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
- package/vendor/node-addon-api/test/basic_types/array.js +35 -0
- package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
- package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
- package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
- package/vendor/node-addon-api/test/basic_types/number.js +114 -0
- package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
- package/vendor/node-addon-api/test/basic_types/value.js +133 -0
- package/vendor/node-addon-api/test/bigint.cc +91 -0
- package/vendor/node-addon-api/test/bigint.js +53 -0
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
- package/vendor/node-addon-api/test/binding.cc +173 -0
- package/vendor/node-addon-api/test/binding.gyp +124 -0
- package/vendor/node-addon-api/test/buffer.cc +183 -0
- package/vendor/node-addon-api/test/buffer.js +69 -0
- package/vendor/node-addon-api/test/callbackscope.cc +22 -0
- package/vendor/node-addon-api/test/callbackscope.js +49 -0
- package/vendor/node-addon-api/test/common/index.js +114 -0
- package/vendor/node-addon-api/test/common/test_helper.h +71 -0
- package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
- package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
- package/vendor/node-addon-api/test/date.cc +44 -0
- package/vendor/node-addon-api/test/date.js +18 -0
- package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
- package/vendor/node-addon-api/test/env_cleanup.js +56 -0
- package/vendor/node-addon-api/test/error.cc +287 -0
- package/vendor/node-addon-api/test/error.js +81 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
- package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
- package/vendor/node-addon-api/test/external.cc +81 -0
- package/vendor/node-addon-api/test/external.js +88 -0
- package/vendor/node-addon-api/test/function.cc +324 -0
- package/vendor/node-addon-api/test/function.js +133 -0
- package/vendor/node-addon-api/test/function_reference.cc +202 -0
- package/vendor/node-addon-api/test/function_reference.js +157 -0
- package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
- package/vendor/node-addon-api/test/handlescope.cc +60 -0
- package/vendor/node-addon-api/test/handlescope.js +14 -0
- package/vendor/node-addon-api/test/index.js +159 -0
- package/vendor/node-addon-api/test/maybe/check.cc +23 -0
- package/vendor/node-addon-api/test/maybe/index.js +38 -0
- package/vendor/node-addon-api/test/memory_management.cc +17 -0
- package/vendor/node-addon-api/test/memory_management.js +9 -0
- package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
- package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
- package/vendor/node-addon-api/test/name.cc +108 -0
- package/vendor/node-addon-api/test/name.js +59 -0
- package/vendor/node-addon-api/test/napi_child.js +14 -0
- package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
- package/vendor/node-addon-api/test/object/delete_property.js +41 -0
- package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
- package/vendor/node-addon-api/test/object/finalizer.js +28 -0
- package/vendor/node-addon-api/test/object/get_property.cc +34 -0
- package/vendor/node-addon-api/test/object/get_property.js +40 -0
- package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
- package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
- package/vendor/node-addon-api/test/object/has_property.cc +38 -0
- package/vendor/node-addon-api/test/object/has_property.js +37 -0
- package/vendor/node-addon-api/test/object/object.cc +350 -0
- package/vendor/node-addon-api/test/object/object.js +217 -0
- package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
- package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
- package/vendor/node-addon-api/test/object/set_property.cc +45 -0
- package/vendor/node-addon-api/test/object/set_property.js +30 -0
- package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
- package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
- package/vendor/node-addon-api/test/object_reference.cc +219 -0
- package/vendor/node-addon-api/test/object_reference.js +259 -0
- package/vendor/node-addon-api/test/objectwrap.cc +268 -0
- package/vendor/node-addon-api/test/objectwrap.js +284 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
- package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
- package/vendor/node-addon-api/test/promise.cc +29 -0
- package/vendor/node-addon-api/test/promise.js +18 -0
- package/vendor/node-addon-api/test/reference.cc +24 -0
- package/vendor/node-addon-api/test/reference.js +14 -0
- package/vendor/node-addon-api/test/run_script.cc +56 -0
- package/vendor/node-addon-api/test/run_script.js +45 -0
- package/vendor/node-addon-api/test/symbol.cc +79 -0
- package/vendor/node-addon-api/test/symbol.js +73 -0
- package/vendor/node-addon-api/test/testUtil.js +54 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
- package/vendor/node-addon-api/test/thunking_manual.js +17 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
- package/vendor/node-addon-api/test/typedarray.cc +216 -0
- package/vendor/node-addon-api/test/typedarray.js +69 -0
- package/vendor/node-addon-api/test/version_management.cc +27 -0
- package/vendor/node-addon-api/test/version_management.js +31 -0
- package/vendor/node-addon-api/unit-test/README.md +28 -0
- package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
- package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
- package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
- package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
- package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
- package/vendor/node-addon-api/unit-test/setup.js +13 -0
- package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
- package/vendor/node-addon-api/unit-test/test.js +30 -0
- package/vendor/raylib/projects/VS2019/examples/audio_module_playing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/audio_multichannel_sound.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/audio_music_stream.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/audio_raw_stream.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/audio_sound_loading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_2d_camera.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_2d_camera_platformer.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_3d_camera_first_person.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_3d_camera_free.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_3d_camera_mode.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_3d_picking.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_basic_window.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_custom_logging.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_drop_files.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_gamepad.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_gestures.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_keys.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_mouse.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_mouse_wheel.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_input_multitouch.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_loading_thread.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_quat_conversion.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_random_values.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_scissor_test.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_split_screen.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_storage_values.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_vr_simulator.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_window_flags.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_window_letterbox.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/core_world_screen.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/easings_testbed.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/embedded_files_loading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_animation.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_billboard.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_box_collisions.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_cubicmap.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_first_person_maze.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_geometric_shapes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_heightmap.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_loading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_loading_gltf.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_loading_vox.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_mesh_generation.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_mesh_picking.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_orthographic_projection.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_rlgl_solar_system.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_skybox.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_waving_cubes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/models_yaw_pitch_roll.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/physics_demo.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/physics_friction.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/physics_movement.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/physics_restitution.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/physics_shatter.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/raudio_standalone.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/rlgl_standalone.vcxproj +391 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_basic_lighting.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_custom_uniform.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_eratosthenes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_fog.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_hot_reloading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_julia_set.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_mesh_instancing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_model_shader.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_multi_sample2d.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_palette_switch.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_postprocessing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_raymarching.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_shapes_textures.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_simple_mask.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_spotlight.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_texture_drawing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shaders_texture_waves.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_basic_shapes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_bouncing_ball.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_collision_area.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_colors_palette.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_draw_circle_sector.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_draw_rectangle_rounded.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_draw_ring.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_easings_ball_anim.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_easings_box_anim.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_easings_rectangle_array.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_following_eyes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_lines_bezier.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_logo_raylib.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_logo_raylib_anim.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/shapes_rectangle_scaling.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_font_filters.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_font_loading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_font_sdf.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_font_spritefont.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_format_text.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_input_box.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_raylib_fonts.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_rectangle_bounds.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_unicode.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/text_writing_anim.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_background_scrolling.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_blend_modes.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_bunnymark.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_draw_tiled.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_image_drawing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_image_generation.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_image_loading.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_image_processing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_image_text.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_logo_raylib.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_mouse_painting.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_npatch_drawing.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_particles_blending.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_raw_data.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_rectangle.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_sprite_button.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_sprite_explosion.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_srcrec_dstrec.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/examples/textures_to_image.vcxproj +387 -0
- package/vendor/raylib/projects/VS2019/raylib/raylib.vcxproj +341 -0
- package/vendor/raylib/projects/VS2019/raylib.sln +2274 -0
- package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj +226 -0
- package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.filters +10 -0
- package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/raylib_android.NativeActivity.vcxproj.user +4 -0
- 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
|
-
|
|
200
|
-
const
|
|
201
|
-
const
|
|
202
|
-
const
|
|
203
|
-
const
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
-
const
|
|
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.
|
|
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.
|
|
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 (
|
|
398
|
-
|
|
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 (
|
|
357
|
-
|
|
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);
|
package/src/call_x64_sysv.cc
CHANGED
|
@@ -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 (
|
|
327
|
-
|
|
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);
|
package/src/call_x64_win.cc
CHANGED
|
@@ -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 (
|
|
161
|
-
|
|
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::
|
|
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 (
|
|
205
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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::
|
|
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
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
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,
|
|
324
|
+
func->ret.type = ResolveType(instance, ret);
|
|
343
325
|
if (!func->ret.type)
|
|
344
|
-
return
|
|
345
|
-
if (!
|
|
346
|
-
ThrowError<Napi::TypeError>(env, "Unexpected %1 value for parameters of '%2', expected an array", GetValueType(instance,
|
|
347
|
-
return
|
|
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], ¶m.directions);
|
|
371
347
|
if (!param.type)
|
|
372
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
func->func
|
|
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
|
|
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
|
|
501
|
+
#define ADD_CONVENTION(Name, Value) \
|
|
485
502
|
do { \
|
|
486
|
-
const auto wrapper = [](const Napi::CallbackInfo &info) { return FindLibraryFunction(info, (Value)
|
|
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("
|
|
493
|
-
ADD_CONVENTION("
|
|
494
|
-
ADD_CONVENTION("
|
|
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
|
-
|
|
103
|
+
Cdecl,
|
|
104
104
|
Stdcall,
|
|
105
105
|
Fastcall
|
|
106
106
|
};
|
|
107
107
|
static const char *const CallConventionNames[] = {
|
|
108
|
-
"
|
|
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
|
+
}
|