summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorShelley Vohr <shelley.vohr@gmail.com>2019-10-25 21:14:36 -0700
committerShelley Vohr <shelley.vohr@gmail.com>2019-11-01 10:22:37 -0700
commitfc02cf586a4b146195a5f09a21fb34269657c484 (patch)
treeae6c1bc391aa720b4ad7bb765dc219d6ecfcc15f /src/api
parent75dc8938a40100a53323ed87159a1ab2f149ceca (diff)
downloadandroid-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.cc74
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) {