aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-16 00:40:08 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-12-16 00:40:08 -0800
commit01ed3045cb436085d7815bc089d4db21b4095b33 (patch)
tree3824d3fb7872abca6afd205746f7433b7def06e3
parent6b3be4d821f89a5edef3308dad4d944f1a5e42d0 (diff)
downloadbun-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.cpp30
-rw-r--r--src/napi/napi.zig1
-rw-r--r--src/symbols.dyn13
-rw-r--r--src/symbols.txt7
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