diff options
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 42 |
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) { |