diff options
author | 2022-12-16 00:40:08 -0800 | |
---|---|---|
committer | 2022-12-16 00:40:08 -0800 | |
commit | 01ed3045cb436085d7815bc089d4db21b4095b33 (patch) | |
tree | 3824d3fb7872abca6afd205746f7433b7def06e3 | |
parent | 6b3be4d821f89a5edef3308dad4d944f1a5e42d0 (diff) | |
download | bun-01ed3045cb436085d7815bc089d4db21b4095b33.tar.gz bun-01ed3045cb436085d7815bc089d4db21b4095b33.tar.zst bun-01ed3045cb436085d7815bc089d4db21b4095b33.zip |
[napi] Implement `napi_create_bigint_words`
warning: not tested
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 30 | ||||
-rw-r--r-- | src/napi/napi.zig | 1 | ||||
-rw-r--r-- | src/symbols.dyn | 13 | ||||
-rw-r--r-- | src/symbols.txt | 7 |
4 files changed, 42 insertions, 9 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 943f37688..96489f081 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -46,6 +46,7 @@ #include "JavaScriptCore/GetterSetter.h" #include "JavaScriptCore/JSSourceCode.h" #include "JavaScriptCore/JSNativeStdFunction.h" +#include "JavaScriptCore/BigIntObject.h" #include "../modules/ObjectModule.h" @@ -1507,4 +1508,33 @@ extern "C" napi_status napi_set_instance_data(napi_env env, globalObject->napiInstanceDataFinalizerHint = finalize_hint; return napi_ok; +} + +extern "C" napi_status napi_create_bigint_words(napi_env env, + int sign_bit, + size_t word_count, + const uint64_t* words, + napi_value* result) +{ + Zig::GlobalObject* globalObject = toJS(env); + JSC::VM& vm = globalObject->vm(); + auto* bigint = JSC::JSBigInt::tryCreateWithLength(vm, word_count); + if (UNLIKELY(!bigint)) { + return napi_generic_failure; + } + + // TODO: verify sign bit is consistent + bigint->setSign(sign_bit); + + if (words != nullptr) { + const uint64_t* word = words; + // TODO: add fast path that uses memcpy here instead of setDigit + // we need to add this to JSC. V8 has this optimization + for (size_t i = 0; i < word_count; i++) { + bigint->setDigit(i, *word++); + } + } + + *result = toNapi(bigint); + return napi_ok; }
\ No newline at end of file diff --git a/src/napi/napi.zig b/src/napi/napi.zig index 0f868fe43..bcbbaf417 100644 --- a/src/napi/napi.zig +++ b/src/napi/napi.zig @@ -1510,6 +1510,7 @@ pub fn fixDeadCodeElimination() void { std.mem.doNotOptimizeAway(&napi_get_value_external); std.mem.doNotOptimizeAway(&napi_get_instance_data); std.mem.doNotOptimizeAway(&napi_set_instance_data); + std.mem.doNotOptimizeAway(&napi_create_bigint_words); std.mem.doNotOptimizeAway(&@import("../bun.js/node/buffer.zig").BufferVectorized.fill); } diff --git a/src/symbols.dyn b/src/symbols.dyn index 9eeed901e..e0b4b2489 100644 --- a/src/symbols.dyn +++ b/src/symbols.dyn @@ -12,18 +12,20 @@ _napi_coerce_to_number; _napi_coerce_to_object; _napi_coerce_to_string; - _napi_create_array_with_length; _napi_create_array; + _napi_create_array_with_length; _napi_create_arraybuffer; _napi_create_async_work; _napi_create_bigint_int64; _napi_create_bigint_uint64; - _napi_create_buffer_copy; + _napi_create_bigint_words; _napi_create_buffer; + _napi_create_buffer_copy; _napi_create_dataview; _napi_create_date; _napi_create_double; _napi_create_error; + _napi_create_external; _napi_create_external_arraybuffer; _napi_create_external_buffer; _napi_create_function; @@ -76,6 +78,7 @@ _napi_get_value_bigint_uint64; _napi_get_value_bool; _napi_get_value_double; + _napi_get_value_external; _napi_get_value_int32; _napi_get_value_int64; _napi_get_value_string_latin1; @@ -111,21 +114,19 @@ _napi_release_threadsafe_function; _napi_remove_async_cleanup_hook; _napi_remove_env_cleanup_hook; + _napi_remove_wrap; _napi_resolve_deferred; _napi_run_script; _napi_set_element; _napi_set_named_property; _napi_set_property; _napi_strict_equals; + _napi_throw; _napi_throw_error; _napi_throw_range_error; _napi_throw_type_error; - _napi_throw; _napi_typeof; _napi_unref_threadsafe_function; _napi_unwrap; _napi_wrap; - _napi_remove_wrap; - _napi_create_external; - _napi_get_value_external; };
\ No newline at end of file diff --git a/src/symbols.txt b/src/symbols.txt index e88483515..24ae8ee38 100644 --- a/src/symbols.txt +++ b/src/symbols.txt @@ -17,12 +17,14 @@ _napi_create_arraybuffer _napi_create_async_work _napi_create_bigint_int64 _napi_create_bigint_uint64 +_napi_create_bigint_words _napi_create_buffer _napi_create_buffer_copy _napi_create_dataview _napi_create_date _napi_create_double _napi_create_error +_napi_create_external _napi_create_external_arraybuffer _napi_create_external_buffer _napi_create_function @@ -75,6 +77,7 @@ _napi_get_value_bigint_int64 _napi_get_value_bigint_uint64 _napi_get_value_bool _napi_get_value_double +_napi_get_value_external _napi_get_value_int32 _napi_get_value_int64 _napi_get_value_string_latin1 @@ -110,6 +113,7 @@ _napi_reject_deferred _napi_release_threadsafe_function _napi_remove_async_cleanup_hook _napi_remove_env_cleanup_hook +_napi_remove_wrap _napi_resolve_deferred _napi_run_script _napi_set_element @@ -124,6 +128,3 @@ _napi_typeof _napi_unref_threadsafe_function _napi_unwrap _napi_wrap -_napi_remove_wrap -_napi_create_external -_napi_get_value_external |