12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: deepak1556 <[email protected]>
- Date: Tue, 26 Dec 2023 02:10:42 +0900
- Subject: fix: capture embedder exceptions before entering V8
- Upstrem bug: https://github.com/nodejs/node-v8/issues/274
- The patch only addresses the callsites that triggered failing DCHECKS
- in the nodejs test suite. Need to be followed-up with upstream
- on the broader change as there maybe other callsites.
- diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc
- index be02d4aaa04685cbd6a9ecfe082e38f179129ab5..277748a30bd97ae816d9ba1f2d73851a29b81010 100644
- --- a/src/handle_wrap.cc
- +++ b/src/handle_wrap.cc
- @@ -148,6 +148,9 @@ void HandleWrap::OnClose(uv_handle_t* handle) {
- wrap->OnClose();
- wrap->handle_wrap_queue_.Remove();
-
- + if (env->isolate()->IsExecutionTerminating())
- + return;
- +
- if (!wrap->persistent().IsEmpty() &&
- wrap->object()->Has(env->context(), env->handle_onclose_symbol())
- .FromMaybe(false)) {
- diff --git a/src/node_contextify.cc b/src/node_contextify.cc
- index 8951cd378a9025f58fada47cf96f686d14639f95..6456d87d4202c013aafe071adbac06852b3ae2c1 100644
- --- a/src/node_contextify.cc
- +++ b/src/node_contextify.cc
- @@ -487,6 +487,7 @@ bool ContextifyContext::IsStillInitializing(const ContextifyContext* ctx) {
- void ContextifyContext::PropertyGetterCallback(
- Local<Name> property,
- const PropertyCallbackInfo<Value>& args) {
- + Environment* env = Environment::GetCurrent(args);
- ContextifyContext* ctx = ContextifyContext::Get(args);
-
- // Still initializing
- @@ -494,6 +495,8 @@ void ContextifyContext::PropertyGetterCallback(
-
- Local<Context> context = ctx->context();
- Local<Object> sandbox = ctx->sandbox();
- +
- + TryCatchScope try_catch(env);
- MaybeLocal<Value> maybe_rv =
- sandbox->GetRealNamedProperty(context, property);
- if (maybe_rv.IsEmpty()) {
- @@ -503,6 +506,11 @@ void ContextifyContext::PropertyGetterCallback(
-
- Local<Value> rv;
- if (maybe_rv.ToLocal(&rv)) {
- + if (try_catch.HasCaught() &&
- + !try_catch.HasTerminated()) {
- + try_catch.ReThrow();
- + }
- +
- if (rv == sandbox)
- rv = ctx->global_proxy();
-
- diff --git a/src/node_messaging.cc b/src/node_messaging.cc
- index e7d2bfbafef13f04a73dcbefe7d6e90b37b904d1..31b870c5f003b62b848c00d6032ed98eb829778d 100644
- --- a/src/node_messaging.cc
- +++ b/src/node_messaging.cc
- @@ -907,7 +907,7 @@ Maybe<bool> MessagePort::PostMessage(Environment* env,
- const TransferList& transfer_v) {
- Isolate* isolate = env->isolate();
- Local<Object> obj = object(isolate);
- -
- + TryCatchScope try_catch(env);
- std::shared_ptr<Message> msg = std::make_shared<Message>();
-
- // Per spec, we need to both check if transfer list has the source port, and
- @@ -915,6 +915,10 @@ Maybe<bool> MessagePort::PostMessage(Environment* env,
-
- Maybe<bool> serialization_maybe =
- msg->Serialize(env, context, message_v, transfer_v, obj);
- + if (try_catch.HasCaught() &&
- + !try_catch.HasTerminated()) {
- + try_catch.ReThrow();
- + }
- if (data_ == nullptr) {
- return serialization_maybe;
- }
|