diff options
author | Shelley Vohr <shelley.vohr@gmail.com> | 2019-10-25 21:14:36 -0700 |
---|---|---|
committer | Shelley Vohr <shelley.vohr@gmail.com> | 2019-11-01 10:22:37 -0700 |
commit | fc02cf586a4b146195a5f09a21fb34269657c484 (patch) | |
tree | ae6c1bc391aa720b4ad7bb765dc219d6ecfcc15f /src/api | |
parent | 75dc8938a40100a53323ed87159a1ab2f149ceca (diff) | |
download | android-node-v8-fc02cf586a4b146195a5f09a21fb34269657c484.tar.gz android-node-v8-fc02cf586a4b146195a5f09a21fb34269657c484.tar.bz2 android-node-v8-fc02cf586a4b146195a5f09a21fb34269657c484.zip |
src: expose granular SetIsolateUpForNode
This PR exposes a new embedder-focused API: SetIsolateUpForNode.
It maintains previous behavior for the single-param version of
SetIsolateUpForNode and changes no defaults, but was designed to be
flexible by allowing for embedders to conditionally override all
callbacks and flags set by the previous two-param version of
SetIsolateUpForNode.
PR-URL: https://github.com/nodejs/node/pull/30150
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Diffstat (limited to 'src/api')
-rw-r--r-- | src/api/environment.cc | 74 |
1 files changed, 47 insertions, 27 deletions
diff --git a/src/api/environment.cc b/src/api/environment.cc index e6a87d5a93..846e4a873d 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -196,36 +196,56 @@ void SetIsolateCreateParamsForNode(Isolate::CreateParams* params) { } } -void SetIsolateUpForNode(v8::Isolate* isolate, IsolateSettingCategories cat) { - switch (cat) { - case IsolateSettingCategories::kErrorHandlers: - isolate->AddMessageListenerWithErrorLevel( - errors::PerIsolateMessageListener, - Isolate::MessageErrorLevel::kMessageError | - Isolate::MessageErrorLevel::kMessageWarning); - isolate->SetAbortOnUncaughtExceptionCallback( - ShouldAbortOnUncaughtException); - isolate->SetFatalErrorHandler(OnFatalError); - isolate->SetPrepareStackTraceCallback(PrepareStackTraceCallback); - break; - case IsolateSettingCategories::kMisc: - isolate->SetMicrotasksPolicy(MicrotasksPolicy::kExplicit); - isolate->SetAllowWasmCodeGenerationCallback( - AllowWasmCodeGenerationCallback); - isolate->SetPromiseRejectCallback(task_queue::PromiseRejectCallback); - isolate->SetHostCleanupFinalizationGroupCallback( - HostCleanupFinalizationGroupCallback); - v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate); - break; - default: - UNREACHABLE(); - break; - } +void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) { + if (s.flags & MESSAGE_LISTENER_WITH_ERROR_LEVEL) + isolate->AddMessageListenerWithErrorLevel( + errors::PerIsolateMessageListener, + Isolate::MessageErrorLevel::kMessageError | + Isolate::MessageErrorLevel::kMessageWarning); + + auto* abort_callback = s.should_abort_on_uncaught_exception_callback ? + s.should_abort_on_uncaught_exception_callback : + ShouldAbortOnUncaughtException; + isolate->SetAbortOnUncaughtExceptionCallback(abort_callback); + + auto* fatal_error_cb = s.fatal_error_callback ? + s.fatal_error_callback : OnFatalError; + isolate->SetFatalErrorHandler(fatal_error_cb); + + auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ? + s.prepare_stack_trace_callback : PrepareStackTraceCallback; + isolate->SetPrepareStackTraceCallback(prepare_stack_trace_cb); +} + +void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s) { + isolate->SetMicrotasksPolicy(s.policy); + + auto* allow_wasm_codegen_cb = s.allow_wasm_code_generation_callback ? + s.allow_wasm_code_generation_callback : AllowWasmCodeGenerationCallback; + isolate->SetAllowWasmCodeGenerationCallback(allow_wasm_codegen_cb); + + auto* promise_reject_cb = s.promise_reject_callback ? + s.promise_reject_callback : task_queue::PromiseRejectCallback; + isolate->SetPromiseRejectCallback(promise_reject_cb); + + auto* host_cleanup_cb = s.host_cleanup_finalization_group_callback ? + s.host_cleanup_finalization_group_callback : + HostCleanupFinalizationGroupCallback; + isolate->SetHostCleanupFinalizationGroupCallback(host_cleanup_cb); + + if (s.flags & DETAILED_SOURCE_POSITIONS_FOR_PROFILING) + v8::CpuProfiler::UseDetailedSourcePositionsForProfiling(isolate); +} + +void SetIsolateUpForNode(v8::Isolate* isolate, + const IsolateSettings& settings) { + SetIsolateErrorHandlers(isolate, settings); + SetIsolateMiscHandlers(isolate, settings); } void SetIsolateUpForNode(v8::Isolate* isolate) { - SetIsolateUpForNode(isolate, IsolateSettingCategories::kErrorHandlers); - SetIsolateUpForNode(isolate, IsolateSettingCategories::kMisc); + IsolateSettings settings; + SetIsolateUpForNode(isolate, settings); } Isolate* NewIsolate(ArrayBufferAllocator* allocator, uv_loop_t* event_loop) { |