summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/callback_scope.cc2
-rw-r--r--src/env-inl.h4
-rw-r--r--src/env.h3
-rw-r--r--src/node.cc18
-rw-r--r--src/node_internals.h3
5 files changed, 16 insertions, 14 deletions
diff --git a/src/callback_scope.cc b/src/callback_scope.cc
index 7929fd67d7..eca405dfc1 100644
--- a/src/callback_scope.cc
+++ b/src/callback_scope.cc
@@ -87,7 +87,7 @@ void InternalCallbackScope::Close() {
AsyncWrap::EmitAfter(env_, async_context_.async_id);
}
- if (IsInnerMakeCallback()) {
+ if (env_->makecallback_depth() > 1) {
return;
}
diff --git a/src/env-inl.h b/src/env-inl.h
index c38e37f786..d65d7e7562 100644
--- a/src/env-inl.h
+++ b/src/env-inl.h
@@ -218,8 +218,8 @@ inline Environment::AsyncCallbackScope::~AsyncCallbackScope() {
env_->makecallback_cntr_--;
}
-inline bool Environment::AsyncCallbackScope::in_makecallback() const {
- return env_->makecallback_cntr_ > 1;
+inline size_t Environment::makecallback_depth() const {
+ return makecallback_cntr_;
}
inline Environment::ImmediateInfo::ImmediateInfo(v8::Isolate* isolate)
diff --git a/src/env.h b/src/env.h
index 87085bf946..7a4804cdd4 100644
--- a/src/env.h
+++ b/src/env.h
@@ -499,7 +499,6 @@ class Environment {
AsyncCallbackScope() = delete;
explicit AsyncCallbackScope(Environment* env);
~AsyncCallbackScope();
- inline bool in_makecallback() const;
private:
Environment* env_;
@@ -507,6 +506,8 @@ class Environment {
DISALLOW_COPY_AND_ASSIGN(AsyncCallbackScope);
};
+ inline size_t makecallback_depth() const;
+
class ImmediateInfo {
public:
inline AliasedBuffer<uint32_t, v8::Uint32Array>& fields();
diff --git a/src/node.cc b/src/node.cc
index a6bf512e04..c562403379 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -757,7 +757,7 @@ MaybeLocal<Value> InternalMakeCallback(Environment* env,
CHECK(!recv.IsEmpty());
InternalCallbackScope scope(env, recv, asyncContext);
if (scope.Failed()) {
- return Undefined(env->isolate());
+ return MaybeLocal<Value>();
}
Local<Function> domain_cb = env->domain_callback();
@@ -772,15 +772,13 @@ MaybeLocal<Value> InternalMakeCallback(Environment* env,
}
if (ret.IsEmpty()) {
- // NOTE: For backwards compatibility with public API we return Undefined()
- // if the top level call threw.
scope.MarkAsFailed();
- return scope.IsInnerMakeCallback() ? ret : Undefined(env->isolate());
+ return MaybeLocal<Value>();
}
scope.Close();
if (scope.Failed()) {
- return Undefined(env->isolate());
+ return MaybeLocal<Value>();
}
return ret;
@@ -832,8 +830,14 @@ MaybeLocal<Value> MakeCallback(Isolate* isolate,
// the two contexts need not be the same.
Environment* env = Environment::GetCurrent(callback->CreationContext());
Context::Scope context_scope(env->context());
- return InternalMakeCallback(env, recv, callback,
- argc, argv, asyncContext);
+ MaybeLocal<Value> ret = InternalMakeCallback(env, recv, callback,
+ argc, argv, asyncContext);
+ if (ret.IsEmpty() && env->makecallback_depth() == 0) {
+ // This is only for legacy compatiblity and we may want to look into
+ // removing/adjusting it.
+ return Undefined(env->isolate());
+ }
+ return ret;
}
diff --git a/src/node_internals.h b/src/node_internals.h
index 0594d00580..968d229f10 100644
--- a/src/node_internals.h
+++ b/src/node_internals.h
@@ -543,9 +543,6 @@ class InternalCallbackScope {
inline bool Failed() const { return failed_; }
inline void MarkAsFailed() { failed_ = true; }
- inline bool IsInnerMakeCallback() const {
- return callback_scope_.in_makecallback();
- }
private:
Environment* env_;