@@ -926,7 +926,8 @@ const char* error_messages[] = {nullptr,
926926 " Invalid handle scope usage" ,
927927 " Invalid callback scope usage" ,
928928 " 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" ,
930931};
931932
932933static inline napi_status napi_clear_last_error (napi_env env) {
@@ -958,7 +959,7 @@ napi_status napi_get_last_error_info(napi_env env,
958959 // We don't have a napi_status_last as this would result in an ABI
959960 // change each time a message was added.
960961 static_assert (
961- node::arraysize (error_messages) == napi_closing + 1 ,
962+ node::arraysize (error_messages) == napi_bigint_expected + 1 ,
962963 " Count of error messages must match count of error values" );
963964 CHECK_LE (env->last_error .error_code , napi_callback_scope_mismatch);
964965
@@ -1713,6 +1714,58 @@ napi_status napi_create_int64(napi_env env,
17131714 return napi_clear_last_error (env);
17141715}
17151716
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+
17161769napi_status napi_get_boolean (napi_env env, bool value, napi_value* result) {
17171770 CHECK_ENV (env);
17181771 CHECK_ARG (env, result);
@@ -1878,6 +1931,8 @@ napi_status napi_typeof(napi_env env,
18781931
18791932 if (v->IsNumber ()) {
18801933 *result = napi_number;
1934+ } else if (v->IsBigInt ()) {
1935+ *result = napi_bigint;
18811936 } else if (v->IsString ()) {
18821937 *result = napi_string;
18831938 } else if (v->IsFunction ()) {
@@ -2201,6 +2256,72 @@ napi_status napi_get_value_int64(napi_env env,
22012256 return napi_clear_last_error (env);
22022257}
22032258
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+
22042325napi_status napi_get_value_bool (napi_env env, napi_value value, bool * result) {
22052326 // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw
22062327 // JS exceptions.
@@ -3139,6 +3260,14 @@ napi_status napi_create_typedarray(napi_env env,
31393260 CREATE_TYPED_ARRAY (
31403261 env, Float64Array, 8 , buffer, byte_offset, length, typedArray);
31413262 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 ;
31423271 default :
31433272 return napi_set_last_error (env, napi_invalid_arg);
31443273 }
@@ -3181,6 +3310,10 @@ napi_status napi_get_typedarray_info(napi_env env,
31813310 *type = napi_float32_array;
31823311 } else if (value->IsFloat64Array ()) {
31833312 *type = napi_float64_array;
3313+ } else if (value->IsBigInt64Array ()) {
3314+ *type = napi_bigint64_array;
3315+ } else if (value->IsBigUint64Array ()) {
3316+ *type = napi_biguint64_array;
31843317 }
31853318 }
31863319
0 commit comments