@@ -62,14 +62,14 @@ void napi_env__::InvokeFinalizerFromGC(v8impl::RefTracker* finalizer) {
6262 EnqueueFinalizer (finalizer);
6363 } else {
6464 // The experimental code calls finalizers immediately to release native
65- // objects as soon as possible, but it suspends use of JS from finalizer.
66- // If JS calls are needed, then the finalizer code must call
67- // node_api_post_finalizer.
65+ // objects as soon as possible. In that state any code that may affect GC
66+ // state causes a fatal error. To work around this issue the finalizer code
67+ // must call node_api_post_finalizer.
6868 if (last_error.error_code == napi_ok && last_exception.IsEmpty ()) {
69- bool saved_suspend_call_into_js = suspend_call_into_js;
70- suspend_call_into_js = true ;
69+ auto restore_state = node::OnScopeLeave (
70+ [this , saved = in_gc_finalizer] { in_gc_finalizer = saved; });
71+ in_gc_finalizer = true ;
7172 finalizer->Finalize ();
72- suspend_call_into_js = saved_suspend_call_into_js;
7373 } else {
7474 // The finalizers can be run in the middle of JS or C++ code.
7575 // That code may be in an error state. In that case use the asynchronous
@@ -93,6 +93,7 @@ napi_status NewString(napi_env env,
9393 CHECK_ARG (env, result);
9494 RETURN_STATUS_IF_FALSE (
9595 env, (length == NAPI_AUTO_LENGTH) || length <= INT_MAX, napi_invalid_arg);
96+ env->CheckGCAccess ();
9697
9798 auto isolate = env->isolate ;
9899 auto str_maybe = string_maker (isolate);
@@ -1539,6 +1540,7 @@ napi_status NAPI_CDECL napi_get_prototype(napi_env env,
15391540napi_status NAPI_CDECL napi_create_object (napi_env env, napi_value* result) {
15401541 CHECK_ENV (env);
15411542 CHECK_ARG (env, result);
1543+ env->CheckGCAccess ();
15421544
15431545 *result = v8impl::JsValueFromV8LocalValue (v8::Object::New (env->isolate ));
15441546
@@ -1548,6 +1550,7 @@ napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) {
15481550napi_status NAPI_CDECL napi_create_array (napi_env env, napi_value* result) {
15491551 CHECK_ENV (env);
15501552 CHECK_ARG (env, result);
1553+ env->CheckGCAccess ();
15511554
15521555 *result = v8impl::JsValueFromV8LocalValue (v8::Array::New (env->isolate ));
15531556
@@ -1559,6 +1562,7 @@ napi_status NAPI_CDECL napi_create_array_with_length(napi_env env,
15591562 napi_value* result) {
15601563 CHECK_ENV (env);
15611564 CHECK_ARG (env, result);
1565+ env->CheckGCAccess ();
15621566
15631567 *result =
15641568 v8impl::JsValueFromV8LocalValue (v8::Array::New (env->isolate , length));
@@ -1659,6 +1663,7 @@ napi_status NAPI_CDECL napi_create_double(napi_env env,
16591663 napi_value* result) {
16601664 CHECK_ENV (env);
16611665 CHECK_ARG (env, result);
1666+ env->CheckGCAccess ();
16621667
16631668 *result =
16641669 v8impl::JsValueFromV8LocalValue (v8::Number::New (env->isolate , value));
@@ -1671,6 +1676,7 @@ napi_status NAPI_CDECL napi_create_int32(napi_env env,
16711676 napi_value* result) {
16721677 CHECK_ENV (env);
16731678 CHECK_ARG (env, result);
1679+ env->CheckGCAccess ();
16741680
16751681 *result =
16761682 v8impl::JsValueFromV8LocalValue (v8::Integer::New (env->isolate , value));
@@ -1683,6 +1689,7 @@ napi_status NAPI_CDECL napi_create_uint32(napi_env env,
16831689 napi_value* result) {
16841690 CHECK_ENV (env);
16851691 CHECK_ARG (env, result);
1692+ env->CheckGCAccess ();
16861693
16871694 *result = v8impl::JsValueFromV8LocalValue (
16881695 v8::Integer::NewFromUnsigned (env->isolate , value));
@@ -1695,6 +1702,7 @@ napi_status NAPI_CDECL napi_create_int64(napi_env env,
16951702 napi_value* result) {
16961703 CHECK_ENV (env);
16971704 CHECK_ARG (env, result);
1705+ env->CheckGCAccess ();
16981706
16991707 *result = v8impl::JsValueFromV8LocalValue (
17001708 v8::Number::New (env->isolate , static_cast <double >(value)));
@@ -1707,6 +1715,7 @@ napi_status NAPI_CDECL napi_create_bigint_int64(napi_env env,
17071715 napi_value* result) {
17081716 CHECK_ENV (env);
17091717 CHECK_ARG (env, result);
1718+ env->CheckGCAccess ();
17101719
17111720 *result =
17121721 v8impl::JsValueFromV8LocalValue (v8::BigInt::New (env->isolate , value));
@@ -1719,6 +1728,7 @@ napi_status NAPI_CDECL napi_create_bigint_uint64(napi_env env,
17191728 napi_value* result) {
17201729 CHECK_ENV (env);
17211730 CHECK_ARG (env, result);
1731+ env->CheckGCAccess ();
17221732
17231733 *result = v8impl::JsValueFromV8LocalValue (
17241734 v8::BigInt::NewFromUnsigned (env->isolate , value));
@@ -1734,6 +1744,7 @@ napi_status NAPI_CDECL napi_create_bigint_words(napi_env env,
17341744 NAPI_PREAMBLE (env);
17351745 CHECK_ARG (env, words);
17361746 CHECK_ARG (env, result);
1747+ env->CheckGCAccess ();
17371748
17381749 v8::Local<v8::Context> context = env->context ();
17391750
@@ -1753,6 +1764,7 @@ napi_status NAPI_CDECL napi_get_boolean(napi_env env,
17531764 napi_value* result) {
17541765 CHECK_ENV (env);
17551766 CHECK_ARG (env, result);
1767+ env->CheckGCAccess ();
17561768
17571769 v8::Isolate* isolate = env->isolate ;
17581770
@@ -1770,6 +1782,7 @@ napi_status NAPI_CDECL napi_create_symbol(napi_env env,
17701782 napi_value* result) {
17711783 CHECK_ENV (env);
17721784 CHECK_ARG (env, result);
1785+ env->CheckGCAccess ();
17731786
17741787 v8::Isolate* isolate = env->isolate ;
17751788
@@ -1792,6 +1805,7 @@ napi_status NAPI_CDECL node_api_symbol_for(napi_env env,
17921805 napi_value* result) {
17931806 CHECK_ENV (env);
17941807 CHECK_ARG (env, result);
1808+ env->CheckGCAccess ();
17951809
17961810 napi_value js_description_string;
17971811 STATUS_CALL (napi_create_string_utf8 (
@@ -1838,6 +1852,7 @@ napi_status NAPI_CDECL napi_create_error(napi_env env,
18381852 CHECK_ENV (env);
18391853 CHECK_ARG (env, msg);
18401854 CHECK_ARG (env, result);
1855+ env->CheckGCAccess ();
18411856
18421857 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue (msg);
18431858 RETURN_STATUS_IF_FALSE (env, message_value->IsString (), napi_string_expected);
@@ -1858,6 +1873,7 @@ napi_status NAPI_CDECL napi_create_type_error(napi_env env,
18581873 CHECK_ENV (env);
18591874 CHECK_ARG (env, msg);
18601875 CHECK_ARG (env, result);
1876+ env->CheckGCAccess ();
18611877
18621878 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue (msg);
18631879 RETURN_STATUS_IF_FALSE (env, message_value->IsString (), napi_string_expected);
@@ -1878,6 +1894,7 @@ napi_status NAPI_CDECL napi_create_range_error(napi_env env,
18781894 CHECK_ENV (env);
18791895 CHECK_ARG (env, msg);
18801896 CHECK_ARG (env, result);
1897+ env->CheckGCAccess ();
18811898
18821899 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue (msg);
18831900 RETURN_STATUS_IF_FALSE (env, message_value->IsString (), napi_string_expected);
@@ -1898,6 +1915,7 @@ napi_status NAPI_CDECL node_api_create_syntax_error(napi_env env,
18981915 CHECK_ENV (env);
18991916 CHECK_ARG (env, msg);
19001917 CHECK_ARG (env, result);
1918+ env->CheckGCAccess ();
19011919
19021920 v8::Local<v8::Value> message_value = v8impl::V8LocalValueFromJsValue (msg);
19031921 RETURN_STATUS_IF_FALSE (env, message_value->IsString (), napi_string_expected);
0 commit comments