diff --git a/lib/.eslintrc.yaml b/lib/.eslintrc.yaml index 2b77dce6967d7b..f49918dc46ce3f 100644 --- a/lib/.eslintrc.yaml +++ b/lib/.eslintrc.yaml @@ -23,8 +23,6 @@ rules: message: Use an error exported by the internal/errors module. - selector: CallExpression[callee.object.name='Error'][callee.property.name='captureStackTrace'] message: Please use `require('internal/errors').hideStackFrames()` instead. - - selector: AssignmentExpression:matches([left.name='prepareStackTrace'], [left.property.name='prepareStackTrace']) - message: Use 'overrideStackTrace' from 'lib/internal/errors.js' instead of 'Error.prepareStackTrace'. - selector: ThrowStatement > NewExpression[callee.name=/^ERR_[A-Z_]+$/] > ObjectExpression:first-child:not(:has([key.name='message']):has([key.name='code']):has([key.name='syscall'])) message: The context passed into SystemError constructor must have .code, .syscall and .message. no-restricted-globals: diff --git a/lib/assert.js b/lib/assert.js index b7d7a3da01d520..233b4bd419c859 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -65,6 +65,7 @@ const { openSync, closeSync, readSync } = require('fs'); const { inspect } = require('internal/util/inspect'); const { isPromise, isRegExp } = require('internal/util/types'); const { EOL } = require('internal/constants'); +const { getEmbedderOptions } = require('internal/options'); const { BuiltinModule } = require('internal/bootstrap/realm'); const { isError, deprecate } = require('internal/util'); @@ -293,8 +294,16 @@ function getErrMessage(message, fn) { ErrorCaptureStackTrace(err, fn); if (errorStackTraceLimitIsWritable) Error.stackTraceLimit = tmpLimit; - overrideStackTrace.set(err, (_, stack) => stack); - const call = err.stack[0]; + let call; + if (getEmbedderOptions().hasPrepareStackTraceCallback) { + overrideStackTrace.set(err, (_, stack) => stack); + call = err.stack[0]; + } else { + const tmpPrepare = Error.prepareStackTrace; + Error.prepareStackTrace = (_, stack) => stack; + call = err.stack[0]; + Error.prepareStackTrace = tmpPrepare; + } const filename = call.getFileName(); const line = call.getLineNumber() - 1; diff --git a/src/api/environment.cc b/src/api/environment.cc index 6a6164b6d29443..b02355b402edb7 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -269,6 +269,9 @@ void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) { auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ? s.prepare_stack_trace_callback : PrepareStackTraceCallback; isolate->SetPrepareStackTraceCallback(prepare_stack_trace_cb); + } else { + auto env = Environment::GetCurrent(isolate); + env->set_prepare_stack_trace_callback(Local()); } } diff --git a/src/node_options.cc b/src/node_options.cc index f9dc78abffa48c..83892fa10cf01c 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -1233,6 +1233,13 @@ void GetEmbedderOptions(const FunctionCallbackInfo& args) { Local context = env->context(); Local ret = Object::New(isolate); + if (ret->Set(context, + FIXED_ONE_BYTE_STRING( + env->isolate(), "hasPrepareStackTraceCallback"), + Boolean::New(isolate, + !env->prepare_stack_trace_callback().IsEmpty())) + .IsNothing()) return; + if (ret->Set(context, FIXED_ONE_BYTE_STRING(env->isolate(), "shouldNotRegisterESMLoader"), Boolean::New(isolate, env->should_not_register_esm_loader()))