From b55fd5d1673f8aa4bb9375dbf4127c367021a41c Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 25 Jun 2024 04:52:45 -0700 Subject: [PATCH 1/2] Match convertRawProp error handling in iterator-based props parsing Differential Revision: D59000397 --- .../react/renderer/core/PropsMacros.h | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/PropsMacros.h b/packages/react-native/ReactCommon/react/renderer/core/PropsMacros.h index c3c352526b6c..55fe5224dd08 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/PropsMacros.h +++ b/packages/react-native/ReactCommon/react/renderer/core/PropsMacros.h @@ -110,15 +110,19 @@ struct, blockStart, prefix "BlockStart" suffix, rawValue) // Rebuild a type that contains multiple fields from a single field value -#define REBUILD_FIELD_SWITCH_CASE( \ - defaults, rawValue, property, field, fieldName) \ - case CONSTEXPR_RAW_PROPS_KEY_HASH(fieldName): { \ - if ((rawValue).hasValue()) { \ - decltype((defaults).field) res; \ - fromRawValue(context, rawValue, res); \ - (property).field = res; \ - } else { \ - (property).field = (defaults).field; \ - } \ - return; \ +#define REBUILD_FIELD_SWITCH_CASE( \ + defaults, rawValue, property, field, fieldName) \ + case CONSTEXPR_RAW_PROPS_KEY_HASH(fieldName): { \ + if ((rawValue).hasValue()) [[likely]] { \ + try { \ + fromRawValue(context, rawValue, (property).field); \ + } catch (const std::exception& e) { \ + LOG(ERROR) << "Error while converting prop '" << fieldName \ + << "': " << e.what(); \ + (property).field = (defaults).field; \ + } \ + } else { \ + (property).field = (defaults).field; \ + } \ + return; \ } From 9734bfe870d5e7e4497540b129434962c425180e Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 25 Jun 2024 07:45:30 -0700 Subject: [PATCH 2/2] Fix crash on reload when useImmediateExecutorInAndroidBridgeless is enabled (#45162) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/45162 Previously we would crash in ReactInstance#callFunctionOnModule (P1443291303) when reloading (due to the onHostPause call) because we removed a source of synchronization by using the immediate executor. Workaround it by making sure we always null out references to `mReactInstance` before we actually start destroying it. Changelog: [Internal] Differential Revision: D59002404 --- .../facebook/react/runtime/ReactHostImpl.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index 8bc96e4e67ab..6cd670582bbd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -1416,6 +1416,9 @@ private Task getOrCreateReloadTask(String reason) { final ReactContext reactContext = mBridgelessReactContextRef.getNullable(); if (reactContext != null) { + log(method, "Resetting ReactContext ref"); + mBridgelessReactContextRef.reset(); + log(method, "Destroying ReactContext"); reactContext.destroy(); } @@ -1439,20 +1442,17 @@ private Task getOrCreateReloadTask(String reason) { raiseSoftException( method, "Skipping ReactInstance.destroy(): ReactInstance null"); } else { + log(method, "Resetting ReactInstance ptr"); + mReactInstance = null; + log(method, "Destroying ReactInstance"); reactInstance.destroy(); } - log(method, "Resetting ReactContext ref"); - mBridgelessReactContextRef.reset(); - - log(method, "Resetting ReactInstance task ref"); + log(method, "Resetting createReactInstance task ref"); mCreateReactInstanceTaskRef.reset(); - log(method, "Resetting ReactInstance ptr"); - mReactInstance = null; - - log(method, "Resetting preload task ref"); + log(method, "Resetting start task ref"); mStartTask = null; // Kickstart a new ReactInstance create @@ -1462,7 +1462,7 @@ private Task getOrCreateReloadTask(String reason) { .continueWithTask( task -> { final ReactInstance reactInstance = - reactInstanceTaskUnwrapper.unwrap(task, "7: Restarting surfaces"); + reactInstanceTaskUnwrapper.unwrap(task, "6: Restarting surfaces"); if (reactInstance == null) { raiseSoftException(method, "Skipping surface restart: ReactInstance null");