From a2939252803d5cd4b68340da08820174c30a53e6 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Wed, 11 Jun 2025 07:16:10 -0700 Subject: [PATCH] RN: Remove "js engine" Suffix from Error Stacks (#51913) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51913 Removes the non-standard "js engine" suffix from `Error` stack traces. Changelog: [General][Changed] - Errors will no longer have the "js engine" suffix. Reviewed By: robhogan Differential Revision: D76319439 fbshipit-source-id: e0d8e4f451df7010f48e3076bc244981bf590402 --- .../Libraries/Core/ExceptionsManager.js | 3 -- .../Core/__tests__/ExceptionsManager-test.js | 45 ------------------- .../jserrorhandler/JsErrorHandler.cpp | 7 +-- 3 files changed, 1 insertion(+), 54 deletions(-) diff --git a/packages/react-native/Libraries/Core/ExceptionsManager.js b/packages/react-native/Libraries/Core/ExceptionsManager.js index 429893ad690..bc1237e81a6 100644 --- a/packages/react-native/Libraries/Core/ExceptionsManager.js +++ b/packages/react-native/Libraries/Core/ExceptionsManager.js @@ -76,9 +76,6 @@ function reportException( message = namePrefix + message; } - message = - e.jsEngine == null ? message : `${message}, js engine: ${e.jsEngine}`; - // $FlowFixMe[unclear-type] const extraData: Object = { // $FlowFixMe[incompatible-use] we can't define a type with a Symbol-keyed field in flow diff --git a/packages/react-native/Libraries/Core/__tests__/ExceptionsManager-test.js b/packages/react-native/Libraries/Core/__tests__/ExceptionsManager-test.js index 75441310468..904e627e39e 100644 --- a/packages/react-native/Libraries/Core/__tests__/ExceptionsManager-test.js +++ b/packages/react-native/Libraries/Core/__tests__/ExceptionsManager-test.js @@ -175,51 +175,6 @@ function runExceptionsManagerTests() { expect(console.error).toBeCalledWith(formattedMessage); }); - test('adds the JS engine to the message', () => { - const error = new Error('Some error happened'); - // $FlowFixMe[prop-missing] - error.jsEngine = 'hermes'; - // Copy all the data we care about before any possible mutation. - const {message, jsEngine} = error; - - ReactFiberErrorDialog.showErrorDialog({ - ...capturedErrorDefaults, - error, - }); - - let exceptionData; - - if (__DEV__) { - expect(logBoxAddConsoleLog).not.toBeCalled(); - expect(nativeReportException).not.toBeCalled(); - expect(logBoxAddException).toBeCalledTimes(1); - exceptionData = logBoxAddException.mock.calls[0][0]; - } else { - expect(logBoxAddConsoleLog).not.toBeCalled(); - expect(logBoxAddException).not.toBeCalled(); - expect(nativeReportException).toBeCalledTimes(1); - exceptionData = nativeReportException.mock.calls[0][0]; - } - expect(exceptionData.message).toBe( - 'Error: ' + - message + - '\n\n' + - 'This error is located at:' + - capturedErrorDefaults.componentStack + - ', js engine: ' + - jsEngine, - ); - expect(console.error).toBeCalledWith( - 'Error: ' + - message + - '\n\n' + - 'This error is located at:' + - capturedErrorDefaults.componentStack + - ', js engine: ' + - jsEngine, - ); - }); - test('wraps string in an Error and sends to handleException', () => { const message = 'Some error happened'; diff --git a/packages/react-native/ReactCommon/jserrorhandler/JsErrorHandler.cpp b/packages/react-native/ReactCommon/jserrorhandler/JsErrorHandler.cpp index 5e64d48879e..bc630ca9625 100644 --- a/packages/react-native/ReactCommon/jserrorhandler/JsErrorHandler.cpp +++ b/packages/react-native/ReactCommon/jserrorhandler/JsErrorHandler.cpp @@ -276,12 +276,6 @@ void JsErrorHandler::handleErrorWithCppPipeline( message = *name + ": " + message; } - auto jsEngineValue = errorObj.getProperty(runtime, "jsEngine"); - - if (!isLooselyNull(jsEngineValue)) { - message += ", js engine: " + stringifyToCpp(runtime, jsEngineValue); - } - auto extraDataKey = jsi::PropNameID::forUtf8(runtime, "RN$ErrorExtraDataKey"); auto extraDataValue = errorObj.getProperty(runtime, extraDataKey); @@ -290,6 +284,7 @@ void JsErrorHandler::handleErrorWithCppPipeline( objectAssign(runtime, extraData, extraDataValue.asObject(runtime)); } + auto jsEngineValue = errorObj.getProperty(runtime, "jsEngine"); auto isDEV = isTruthy(runtime, runtime.global().getProperty(runtime, "__DEV__"));