Browse Source

fix: properly emit after hooks after exception (#26990)

Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 4 years ago
parent
commit
601af0b016
1 changed files with 11 additions and 7 deletions
  1. 11 7
      shell/common/node_bindings.cc

+ 11 - 7
shell/common/node_bindings.cc

@@ -176,14 +176,18 @@ void ErrorMessageListener(v8::Local<v8::Message> message,
   v8::Isolate* isolate = v8::Isolate::GetCurrent();
   node::Environment* env = node::Environment::GetCurrent(isolate);
 
-  // TODO(codebytere): properly emit the after() hooks now
-  // that the exception has been handled.
-  // See node/lib/internal/process/execution.js#L176-L180
-
-  // Ensure that the async id stack is properly cleared so the async
-  // hook stack does not become corrupted.
-
   if (env) {
+    // Emit the after() hooks now that the exception has been handled.
+    // Analogous to node/lib/internal/process/execution.js#L176-L180
+    if (env->async_hooks()->fields()[node::AsyncHooks::kAfter]) {
+      while (env->async_hooks()->fields()[node::AsyncHooks::kStackLength]) {
+        node::AsyncWrap::EmitAfter(env, env->execution_async_id());
+        env->async_hooks()->pop_async_context(env->execution_async_id());
+      }
+    }
+
+    // Ensure that the async id stack is properly cleared so the async
+    // hook stack does not become corrupted.
     env->async_hooks()->clear_async_id_stack();
   }
 }