@@ -926,7 +926,8 @@ const char* error_messages[] = {nullptr,
926
926
" Invalid handle scope usage" ,
927
927
" Invalid callback scope usage" ,
928
928
" Thread-safe function queue is full" ,
929
- " Thread-safe function handle is closing"
929
+ " Thread-safe function handle is closing" ,
930
+ " A bigint was expected" ,
930
931
};
931
932
932
933
static inline napi_status napi_clear_last_error (napi_env env) {
@@ -958,7 +959,7 @@ napi_status napi_get_last_error_info(napi_env env,
958
959
// We don't have a napi_status_last as this would result in an ABI
959
960
// change each time a message was added.
960
961
static_assert (
961
- node::arraysize (error_messages) == napi_closing + 1 ,
962
+ node::arraysize (error_messages) == napi_bigint_expected + 1 ,
962
963
" Count of error messages must match count of error values" );
963
964
CHECK_LE (env->last_error .error_code , napi_callback_scope_mismatch);
964
965
@@ -1713,6 +1714,58 @@ napi_status napi_create_int64(napi_env env,
1713
1714
return napi_clear_last_error (env);
1714
1715
}
1715
1716
1717
+ napi_status napi_create_bigint_int64 (napi_env env,
1718
+ int64_t value,
1719
+ napi_value* result) {
1720
+ CHECK_ENV (env);
1721
+ CHECK_ARG (env, result);
1722
+
1723
+ *result = v8impl::JsValueFromV8LocalValue (
1724
+ v8::BigInt::New (env->isolate , value));
1725
+
1726
+ return napi_clear_last_error (env);
1727
+ }
1728
+
1729
+ napi_status napi_create_bigint_uint64 (napi_env env,
1730
+ uint64_t value,
1731
+ napi_value* result) {
1732
+ CHECK_ENV (env);
1733
+ CHECK_ARG (env, result);
1734
+
1735
+ *result = v8impl::JsValueFromV8LocalValue (
1736
+ v8::BigInt::NewFromUnsigned (env->isolate , value));
1737
+
1738
+ return napi_clear_last_error (env);
1739
+ }
1740
+
1741
+ napi_status napi_create_bigint_words (napi_env env,
1742
+ int sign_bit,
1743
+ size_t word_count,
1744
+ const uint64_t * words,
1745
+ napi_value* result) {
1746
+ NAPI_PREAMBLE (env);
1747
+ CHECK_ARG (env, words);
1748
+ CHECK_ARG (env, result);
1749
+
1750
+ v8::Local<v8::Context> context = env->isolate ->GetCurrentContext ();
1751
+
1752
+ if (word_count > INT_MAX) {
1753
+ napi_throw_range_error (env, nullptr , " Maximum BigInt size exceeded" );
1754
+ return napi_set_last_error (env, napi_pending_exception);
1755
+ }
1756
+
1757
+ v8::MaybeLocal<v8::BigInt> b = v8::BigInt::NewFromWords (
1758
+ context, sign_bit, word_count, words);
1759
+
1760
+ if (try_catch.HasCaught ()) {
1761
+ return napi_set_last_error (env, napi_pending_exception);
1762
+ } else {
1763
+ CHECK_MAYBE_EMPTY (env, b, napi_generic_failure);
1764
+ *result = v8impl::JsValueFromV8LocalValue (b.ToLocalChecked ());
1765
+ return napi_clear_last_error (env);
1766
+ }
1767
+ }
1768
+
1716
1769
napi_status napi_get_boolean (napi_env env, bool value, napi_value* result) {
1717
1770
CHECK_ENV (env);
1718
1771
CHECK_ARG (env, result);
@@ -1878,6 +1931,8 @@ napi_status napi_typeof(napi_env env,
1878
1931
1879
1932
if (v->IsNumber ()) {
1880
1933
*result = napi_number;
1934
+ } else if (v->IsBigInt ()) {
1935
+ *result = napi_bigint;
1881
1936
} else if (v->IsString ()) {
1882
1937
*result = napi_string;
1883
1938
} else if (v->IsFunction ()) {
@@ -2201,6 +2256,72 @@ napi_status napi_get_value_int64(napi_env env,
2201
2256
return napi_clear_last_error (env);
2202
2257
}
2203
2258
2259
+ napi_status napi_get_value_bigint_int64 (napi_env env,
2260
+ napi_value value,
2261
+ int64_t * result,
2262
+ bool * lossless) {
2263
+ CHECK_ENV (env);
2264
+ CHECK_ARG (env, value);
2265
+ CHECK_ARG (env, result);
2266
+ CHECK_ARG (env, lossless);
2267
+
2268
+ v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue (value);
2269
+
2270
+ RETURN_STATUS_IF_FALSE (env, val->IsBigInt (), napi_bigint_expected);
2271
+
2272
+ *result = val.As <v8::BigInt>()->Int64Value (lossless);
2273
+
2274
+ return napi_clear_last_error (env);
2275
+ }
2276
+
2277
+ napi_status napi_get_value_bigint_uint64 (napi_env env,
2278
+ napi_value value,
2279
+ uint64_t * result,
2280
+ bool * lossless) {
2281
+ CHECK_ENV (env);
2282
+ CHECK_ARG (env, value);
2283
+ CHECK_ARG (env, result);
2284
+ CHECK_ARG (env, lossless);
2285
+
2286
+ v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue (value);
2287
+
2288
+ RETURN_STATUS_IF_FALSE (env, val->IsBigInt (), napi_bigint_expected);
2289
+
2290
+ *result = val.As <v8::BigInt>()->Uint64Value (lossless);
2291
+
2292
+ return napi_clear_last_error (env);
2293
+ }
2294
+
2295
+ napi_status napi_get_value_bigint_words (napi_env env,
2296
+ napi_value value,
2297
+ int * sign_bit,
2298
+ size_t * word_count,
2299
+ uint64_t * words) {
2300
+ CHECK_ENV (env);
2301
+ CHECK_ARG (env, value);
2302
+ CHECK_ARG (env, word_count);
2303
+
2304
+ v8::Local<v8::Value> val = v8impl::V8LocalValueFromJsValue (value);
2305
+
2306
+ RETURN_STATUS_IF_FALSE (env, val->IsBigInt (), napi_bigint_expected);
2307
+
2308
+ v8::Local<v8::BigInt> big = val.As <v8::BigInt>();
2309
+
2310
+ int word_count_int = *word_count;
2311
+
2312
+ if (sign_bit == nullptr && words == nullptr ) {
2313
+ word_count_int = big->WordCount ();
2314
+ } else {
2315
+ CHECK_ARG (env, sign_bit);
2316
+ CHECK_ARG (env, words);
2317
+ big->ToWordsArray (sign_bit, &word_count_int, words);
2318
+ }
2319
+
2320
+ *word_count = word_count_int;
2321
+
2322
+ return napi_clear_last_error (env);
2323
+ }
2324
+
2204
2325
napi_status napi_get_value_bool (napi_env env, napi_value value, bool * result) {
2205
2326
// Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw
2206
2327
// JS exceptions.
@@ -3139,6 +3260,14 @@ napi_status napi_create_typedarray(napi_env env,
3139
3260
CREATE_TYPED_ARRAY (
3140
3261
env, Float64Array, 8 , buffer, byte_offset, length, typedArray);
3141
3262
break ;
3263
+ case napi_bigint64_array:
3264
+ CREATE_TYPED_ARRAY (
3265
+ env, BigInt64Array, 8 , buffer, byte_offset, length, typedArray);
3266
+ break ;
3267
+ case napi_biguint64_array:
3268
+ CREATE_TYPED_ARRAY (
3269
+ env, BigUint64Array, 8 , buffer, byte_offset, length, typedArray);
3270
+ break ;
3142
3271
default :
3143
3272
return napi_set_last_error (env, napi_invalid_arg);
3144
3273
}
@@ -3181,6 +3310,10 @@ napi_status napi_get_typedarray_info(napi_env env,
3181
3310
*type = napi_float32_array;
3182
3311
} else if (value->IsFloat64Array ()) {
3183
3312
*type = napi_float64_array;
3313
+ } else if (value->IsBigInt64Array ()) {
3314
+ *type = napi_bigint64_array;
3315
+ } else if (value->IsBigUint64Array ()) {
3316
+ *type = napi_biguint64_array;
3184
3317
}
3185
3318
}
3186
3319
0 commit comments