Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/bun.js/bindings/napi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions src/napi/napi.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1504,6 +1504,7 @@ pub fn fixDeadCodeElimination() void {
std.mem.doNotOptimizeAway(&napi_create_bigint_uint64);
std.mem.doNotOptimizeAway(&napi_get_value_bigint_int64);
std.mem.doNotOptimizeAway(&napi_get_value_bigint_uint64);
std.mem.doNotOptimizeAway(&napi_get_value_bigint_words);
std.mem.doNotOptimizeAway(&napi_fatal_error);
std.mem.doNotOptimizeAway(&napi_fatal_exception);
std.mem.doNotOptimizeAway(&napi_create_buffer);
Expand Down
1 change: 1 addition & 0 deletions src/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ _napi_get_undefined
_napi_get_uv_event_loop
_napi_get_value_bigint_int64
_napi_get_value_bigint_uint64
_napi_get_value_bigint_words
_napi_get_value_bool
_napi_get_value_double
_napi_get_value_external
Expand Down