diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-11-20 19:57:20 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-11-29 15:58:42 +0100 |
commit | 4503da8a3a3b0b71d950a63de729ce495965f6ea (patch) | |
tree | 66ad243cd90cea3df8fc11eb7cf29597ddd56eb3 /src/node.cc | |
parent | 04e3aa28bbcdf62f677dd314ad8c12556c18c15f (diff) | |
download | android-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.cc | 67 |
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, |