aboutsummaryrefslogtreecommitdiff
path: root/src/node.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-11-20 19:57:20 +0100
committerAnna Henningsen <anna@addaleax.net>2017-11-29 15:58:42 +0100
commit4503da8a3a3b0b71d950a63de729ce495965f6ea (patch)
tree66ad243cd90cea3df8fc11eb7cf29597ddd56eb3 /src/node.cc
parent04e3aa28bbcdf62f677dd314ad8c12556c18c15f (diff)
downloadandroid-node-v8-4503da8a3a3b0b71d950a63de729ce495965f6ea.tar.gz
android-node-v8-4503da8a3a3b0b71d950a63de729ce495965f6ea.tar.bz2
android-node-v8-4503da8a3a3b0b71d950a63de729ce495965f6ea.zip
process: add flag for uncaught exception abort
Introduce `process.shouldAbortOnUncaughtException` to control `--abort-on-uncaught-exception` behaviour, and implement some of the domains functionality on top of it. PR-URL: https://github.com/nodejs/node/pull/17159 Refs: https://github.com/nodejs/node/issues/17143 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Andreas Madsen <amwebdk@gmail.com>
Diffstat (limited to 'src/node.cc')
-rw-r--r--src/node.cc67
1 files changed, 9 insertions, 58 deletions
diff --git a/src/node.cc b/src/node.cc
index 6a14637494..c35fd612b4 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -779,66 +779,13 @@ void* ArrayBufferAllocator::Allocate(size_t size) {
namespace {
-bool DomainHasErrorHandler(const Environment* env,
- const Local<Object>& domain) {
- HandleScope scope(env->isolate());
-
- Local<Value> domain_event_listeners_v = domain->Get(env->events_string());
- if (!domain_event_listeners_v->IsObject())
- return false;
-
- Local<Object> domain_event_listeners_o =
- domain_event_listeners_v.As<Object>();
-
- Local<Value> domain_error_listeners_v =
- domain_event_listeners_o->Get(env->error_string());
-
- if (domain_error_listeners_v->IsFunction() ||
- (domain_error_listeners_v->IsArray() &&
- domain_error_listeners_v.As<Array>()->Length() > 0))
- return true;
-
- return false;
-}
-
-bool DomainsStackHasErrorHandler(const Environment* env) {
- HandleScope scope(env->isolate());
-
- if (!env->using_domains())
- return false;
-
- Local<Array> domains_stack_array = env->domains_stack_array().As<Array>();
- if (domains_stack_array->Length() == 0)
- return false;
-
- uint32_t domains_stack_length = domains_stack_array->Length();
- for (uint32_t i = domains_stack_length; i > 0; --i) {
- Local<Value> domain_v = domains_stack_array->Get(i - 1);
- if (!domain_v->IsObject())
- return false;
-
- Local<Object> domain = domain_v.As<Object>();
- if (DomainHasErrorHandler(env, domain))
- return true;
- }
-
- return false;
-}
-
-
bool ShouldAbortOnUncaughtException(Isolate* isolate) {
HandleScope scope(isolate);
-
Environment* env = Environment::GetCurrent(isolate);
- Local<Object> process_object = env->process_object();
- Local<String> emitting_top_level_domain_error_key =
- env->emitting_top_level_domain_error_string();
- bool isEmittingTopLevelDomainError =
- process_object->Get(emitting_top_level_domain_error_key)->BooleanValue();
-
- return isEmittingTopLevelDomainError || !DomainsStackHasErrorHandler(env);
+ return env->should_abort_on_uncaught_toggle()[0];
}
+
Local<Value> GetDomainProperty(Environment* env, Local<Object> object) {
Local<Value> domain_v =
object->GetPrivate(env->context(), env->domain_private_symbol())
@@ -888,9 +835,6 @@ void SetupDomainUse(const FunctionCallbackInfo<Value>& args) {
HandleScope scope(env->isolate());
- CHECK(args[0]->IsArray());
- env->set_domains_stack_array(args[0].As<Array>());
-
// Do a little housekeeping.
env->process_object()->Delete(
env->context(),
@@ -3161,6 +3105,13 @@ void SetupProcessObject(Environment* env,
scheduled_immediate_count,
env->scheduled_immediate_count().GetJSArray()).FromJust());
+ auto should_abort_on_uncaught_toggle =
+ FIXED_ONE_BYTE_STRING(env->isolate(), "_shouldAbortOnUncaughtToggle");
+ CHECK(process->Set(env->context(),
+ should_abort_on_uncaught_toggle,
+ env->should_abort_on_uncaught_toggle().GetJSArray())
+ .FromJust());
+
// -e, --eval
if (eval_string) {
READONLY_PROPERTY(process,