aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/napi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r--src/bun.js/bindings/napi.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp
index 574224939..ecae69427 100644
--- a/src/bun.js/bindings/napi.cpp
+++ b/src/bun.js/bindings/napi.cpp
@@ -1568,6 +1568,48 @@ extern "C" napi_status napi_typeof(napi_env env, napi_value val,
return napi_generic_failure;
}
+extern "C" napi_status napi_get_value_bigint_words(napi_env env,
+ napi_value value,
+ int* sign_bit,
+ size_t* word_count,
+ uint64_t* words)
+{
+ Zig::GlobalObject* globalObject = toJS(env);
+
+ JSC::JSValue jsValue = toJS(value);
+ if (UNLIKELY(!jsValue.isBigInt()))
+ return napi_invalid_arg;
+
+ JSC::JSBigInt* bigInt = jsValue.asHeapBigInt();
+ if (UNLIKELY(!bigInt))
+ return napi_invalid_arg;
+
+ if (UNLIKELY(word_count == nullptr))
+ return napi_invalid_arg;
+
+ size_t available_words = *word_count;
+ *word_count = bigInt->length();
+
+ // If both sign_bit and words are nullptr, we're just querying the word count
+ // Return ok in this case
+ if (sign_bit == nullptr) {
+ // However, if one of them is nullptr, we have an invalid argument
+ if (UNLIKELY(words != nullptr))
+ return napi_invalid_arg;
+
+ return napi_ok;
+ } else if (UNLIKELY(words == nullptr))
+ return napi_invalid_arg; // If sign_bit is not nullptr, words must not be nullptr
+
+ *sign_bit = (int)bigInt->sign();
+
+ size_t len = *word_count;
+ for (size_t i = 0; i < available_words && i < len; i++)
+ words[i] = bigInt->digit(i);
+
+ return napi_ok;
+}
+
extern "C" napi_status napi_get_value_external(napi_env env, napi_value value,
void** result)
{