react-native-tvos 0.74.2-0 → 0.74.5-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/Libraries/AppDelegate/RCTAppDelegate.mm +4 -1
  2. package/Libraries/AppDelegate/RCTRootViewFactory.h +8 -0
  3. package/Libraries/AppDelegate/RCTRootViewFactory.mm +11 -3
  4. package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +2 -2
  5. package/Libraries/Blob/React-RCTBlob.podspec +1 -1
  6. package/Libraries/Components/Pressable/Pressable.js +2 -2
  7. package/Libraries/Core/ReactNativeVersion.js +1 -1
  8. package/Libraries/Image/RCTImageLoader.mm +2 -6
  9. package/Libraries/Image/React-RCTImage.podspec +1 -1
  10. package/Libraries/LinkingIOS/React-RCTLinking.podspec +1 -1
  11. package/Libraries/NativeAnimation/React-RCTAnimation.podspec +1 -1
  12. package/Libraries/Network/RCTNetworkTask.mm +4 -3
  13. package/Libraries/Network/React-RCTNetwork.podspec +1 -1
  14. package/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +1 -1
  15. package/Libraries/Settings/React-RCTSettings.podspec +1 -1
  16. package/Libraries/Text/React-RCTText.podspec +1 -1
  17. package/Libraries/Text/TextInput/Multiline/RCTUITextView.mm +6 -0
  18. package/Libraries/Text/TextInput/RCTBackedTextInputViewProtocol.h +1 -0
  19. package/Libraries/Text/TextInput/RCTBaseTextInputView.mm +0 -13
  20. package/Libraries/Text/TextInput/Singleline/RCTUITextField.mm +5 -0
  21. package/Libraries/TypeSafety/RCTTypeSafety.podspec +1 -1
  22. package/Libraries/Vibration/React-RCTVibration.podspec +1 -1
  23. package/README.md +2 -0
  24. package/React/Base/RCTVersion.m +1 -1
  25. package/React/CoreModules/React-CoreModules.podspec +1 -1
  26. package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +10 -5
  27. package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +4 -0
  28. package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +3 -2
  29. package/React/React-RCTFabric.podspec +1 -1
  30. package/React/Views/RCTComponentData.m +11 -3
  31. package/React/Views/ScrollView/RCTScrollView.m +4 -4
  32. package/React-Core.podspec +1 -1
  33. package/ReactAndroid/api/ReactAndroid.api +0 -9
  34. package/ReactAndroid/gradle.properties +1 -1
  35. package/ReactAndroid/publish.gradle +56 -39
  36. package/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +2 -4
  37. package/ReactAndroid/src/main/java/com/facebook/react/common/build/ReactBuildConfig.java +23 -0
  38. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java +5 -2
  39. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/ReactAndroidHWInputDeviceHelper.java +20 -0
  40. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +1 -1
  41. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +3 -1
  42. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactSurfaceView.java +5 -0
  43. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactAccessibilityDelegate.java +9 -0
  44. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputKeyPressEvent.java +1 -1
  45. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +0 -5
  46. package/ReactApple/Libraries/RCTFoundation/RCTDeprecation/RCTDeprecation.podspec +1 -1
  47. package/ReactCommon/React-Fabric.podspec +1 -1
  48. package/ReactCommon/React-FabricImage.podspec +1 -1
  49. package/ReactCommon/React-Mapbuffer.podspec +1 -1
  50. package/ReactCommon/React-nativeconfig.podspec +1 -1
  51. package/ReactCommon/React-rncore.podspec +1 -1
  52. package/ReactCommon/ReactCommon.podspec +1 -1
  53. package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -1
  54. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  55. package/ReactCommon/hermes/React-hermes.podspec +1 -1
  56. package/ReactCommon/hermes/executor/React-jsitracing.podspec +1 -1
  57. package/ReactCommon/jsc/JSCRuntime.cpp +30 -2
  58. package/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +1 -1
  59. package/ReactCommon/jsi/jsi/decorator.h +7 -0
  60. package/ReactCommon/jsi/jsi/jsi.h +7 -0
  61. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +1 -1
  62. package/ReactCommon/jsinspector-modern/React-jsinspector.podspec +1 -1
  63. package/ReactCommon/react/debug/React-debug.podspec +1 -1
  64. package/ReactCommon/react/featureflags/React-featureflags.podspec +1 -1
  65. package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +53 -10
  66. package/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +1 -1
  67. package/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec +1 -1
  68. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +4 -3
  69. package/ReactCommon/react/renderer/debug/React-rendererdebug.podspec +1 -1
  70. package/ReactCommon/react/renderer/graphics/React-graphics.podspec +1 -1
  71. package/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec +1 -1
  72. package/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +1 -1
  73. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +0 -1
  74. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp +3 -3
  75. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp +28 -28
  76. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h +3 -3
  77. package/ReactCommon/react/renderer/runtimescheduler/Task.cpp +9 -7
  78. package/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp +46 -0
  79. package/ReactCommon/react/runtime/React-RuntimeCore.podspec +1 -1
  80. package/ReactCommon/react/runtime/React-RuntimeHermes.podspec +1 -1
  81. package/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +1 -1
  82. package/ReactCommon/react/utils/React-utils.podspec +1 -1
  83. package/ReactCommon/reactperflogger/React-perflogger.podspec +1 -1
  84. package/package.json +13 -13
  85. package/scripts/cocoapods/helpers.rb +4 -0
  86. package/scripts/cocoapods/new_architecture.rb +10 -23
  87. package/scripts/cocoapods/privacy_manifest_utils.rb +11 -5
  88. package/scripts/cocoapods/utils.rb +12 -1
  89. package/scripts/codegen/generate-artifacts-executor.js +1 -1
  90. package/scripts/react_native_pods.rb +4 -0
  91. package/scripts/react_native_pods_utils/script_phases.sh +1 -1
  92. package/sdks/.hermesversion +1 -1
  93. package/sdks/hermes-engine/hermes-engine.podspec +2 -1
  94. package/sdks/hermes-engine/utils/build-apple-framework.sh +11 -14
  95. package/sdks/hermes-engine/utils/build-hermes-xcode.sh +11 -5
  96. package/sdks/hermes-engine/utils/build-ios-framework.sh +17 -8
  97. package/sdks/hermes-engine/utils/create-dummy-hermes-xcframework.sh +1 -1
  98. package/sdks/hermesc/osx-bin/hermes +0 -0
  99. package/sdks/hermesc/osx-bin/hermesc +0 -0
  100. package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
  101. package/template/package.json +6 -6
  102. package/third-party-podspecs/RCT-Folly.podspec +1 -1
  103. package/third-party-podspecs/fmt.podspec +1 -1
  104. package/types/public/ReactNativeTVTypes.d.ts +4 -0
  105. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputEvent.java +0 -70
  106. package/ReactCommon/react/renderer/runtimescheduler/ErrorUtils.h +0 -34
@@ -86,6 +86,38 @@ struct JNIArgs {
86
86
  std::vector<jobject> globalRefs_;
87
87
  };
88
88
 
89
+ jsi::Value createJSRuntimeError(
90
+ jsi::Runtime& runtime,
91
+ const std::string& message) {
92
+ return runtime.global()
93
+ .getPropertyAsFunction(runtime, "Error")
94
+ .call(runtime, message);
95
+ }
96
+
97
+ jsi::Value createRejectionError(jsi::Runtime& rt, const folly::dynamic& args) {
98
+ react_native_assert(
99
+ args.size() == 1 && "promise reject should has only one argument");
100
+
101
+ auto value = jsi::valueFromDynamic(rt, args[0]);
102
+ react_native_assert(value.isObject() && "promise reject should return a map");
103
+
104
+ const jsi::Object& valueAsObject = value.asObject(rt);
105
+
106
+ auto messageProperty = valueAsObject.getProperty(rt, "message");
107
+ auto jsError =
108
+ createJSRuntimeError(rt, messageProperty.asString(rt).utf8(rt));
109
+
110
+ auto jsErrorAsObject = jsError.asObject(rt);
111
+ auto propertyNames = valueAsObject.getPropertyNames(rt);
112
+ for (size_t i = 0; i < propertyNames.size(rt); ++i) {
113
+ auto propertyName = jsi::PropNameID::forString(
114
+ rt, propertyNames.getValueAtIndex(rt, i).asString(rt));
115
+ jsErrorAsObject.setProperty(
116
+ rt, propertyName, valueAsObject.getProperty(rt, propertyName));
117
+ }
118
+ return jsError;
119
+ }
120
+
89
121
  auto createJavaCallback(
90
122
  jsi::Runtime& rt,
91
123
  jsi::Function&& function,
@@ -98,7 +130,6 @@ auto createJavaCallback(
98
130
  LOG(FATAL) << "Callback arg cannot be called more than once";
99
131
  return;
100
132
  }
101
-
102
133
  callback->call([args = std::move(args)](
103
134
  jsi::Runtime& rt, jsi::Function& jsFunction) {
104
135
  std::vector<jsi::Value> jsArgs;
@@ -112,6 +143,26 @@ auto createJavaCallback(
112
143
  });
113
144
  }
114
145
 
146
+ auto createJavaRejectCallback(
147
+ jsi::Runtime& rt,
148
+ jsi::Function&& function,
149
+ std::shared_ptr<CallInvoker> jsInvoker) {
150
+ std::optional<AsyncCallback<>> callback(
151
+ {rt, std::move(function), std::move(jsInvoker)});
152
+ return JCxxCallbackImpl::newObjectCxxArgs(
153
+ [callback = std::move(callback)](folly::dynamic args) mutable {
154
+ if (!callback) {
155
+ LOG(FATAL) << "Callback arg cannot be called more than once";
156
+ return;
157
+ }
158
+ callback->call([args = std::move(args)](
159
+ jsi::Runtime& rt, jsi::Function& jsFunction) {
160
+ jsFunction.call(rt, createRejectionError(rt, args));
161
+ });
162
+ callback = std::nullopt;
163
+ });
164
+ }
165
+
115
166
  struct JPromiseImpl : public jni::JavaClass<JPromiseImpl> {
116
167
  constexpr static auto kJavaDescriptor =
117
168
  "Lcom/facebook/react/bridge/PromiseImpl;";
@@ -407,14 +458,6 @@ jsi::Value convertFromJMapToValue(JNIEnv* env, jsi::Runtime& rt, jobject arg) {
407
458
  return jsi::valueFromDynamic(rt, result->cthis()->consume());
408
459
  }
409
460
 
410
- jsi::Value createJSRuntimeError(
411
- jsi::Runtime& runtime,
412
- const std::string& message) {
413
- return runtime.global()
414
- .getPropertyAsFunction(runtime, "Error")
415
- .call(runtime, message);
416
- }
417
-
418
461
  /**
419
462
  * Creates JSError with current JS runtime stack and Throwable stack trace.
420
463
  */
@@ -855,7 +898,7 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
855
898
  runtime,
856
899
  args[0].getObject(runtime).getFunction(runtime),
857
900
  jsInvoker_);
858
- auto reject = createJavaCallback(
901
+ auto reject = createJavaRejectCallback(
859
902
  runtime,
860
903
  args[1].getObject(runtime).getFunction(runtime),
861
904
  jsInvoker_);
@@ -36,7 +36,7 @@ Pod::Spec.new do |s|
36
36
  s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
37
37
  s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/fmt/include\" \"$(PODS_ROOT)/Headers/Private/React-Core\"",
38
38
  "USE_HEADERMAP" => "YES",
39
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
39
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
40
40
  "GCC_WARN_PEDANTIC" => "YES" }
41
41
  if ENV['USE_FRAMEWORKS']
42
42
  s.header_mappings_dir = './'
@@ -47,7 +47,7 @@ Pod::Spec.new do |s|
47
47
  s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
48
48
  s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => header_search_paths,
49
49
  "USE_HEADERMAP" => "YES",
50
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
50
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
51
51
  "GCC_WARN_PEDANTIC" => "YES" }
52
52
  if ENV['USE_FRAMEWORKS']
53
53
  s.header_mappings_dir = './'
@@ -125,9 +125,10 @@ static const std::shared_ptr<void> constructCoordinator(
125
125
  bridgeModuleDecorator = unwrapManagedObject(optionalModuleDecorator.value());
126
126
  }
127
127
 
128
- RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:viewManagerClass
129
- bridge:bridge
130
- eventDispatcher:eventDispatcher];
128
+ RCTComponentData *componentData =
129
+ [[RCTComponentData alloc] initWithManagerClass:viewManagerClass
130
+ bridge:bridge != nil ? bridge : (RCTBridge *)bridgeProxy
131
+ eventDispatcher:eventDispatcher];
131
132
  return wrapManagedObject([[RCTLegacyViewManagerInteropCoordinator alloc]
132
133
  initWithComponentData:componentData
133
134
  bridge:bridge
@@ -45,7 +45,7 @@ Pod::Spec.new do |s|
45
45
  s.header_dir = "react/renderer/debug"
46
46
  s.exclude_files = "tests"
47
47
  s.pod_target_xcconfig = {
48
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
48
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
49
49
  "HEADER_SEARCH_PATHS" => header_search_paths.join(' '),
50
50
  "DEFINES_MODULE" => "YES"
51
51
  }
@@ -57,7 +57,7 @@ Pod::Spec.new do |s|
57
57
  s.pod_target_xcconfig = { "USE_HEADERMAP" => "NO",
58
58
  "HEADER_SEARCH_PATHS" => header_search_paths.join(" "),
59
59
  "DEFINES_MODULE" => "YES",
60
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20" }
60
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard() }
61
61
 
62
62
  s.dependency "glog"
63
63
  s.dependency "RCT-Folly/Fabric", folly_version
@@ -50,7 +50,7 @@ Pod::Spec.new do |s|
50
50
  s.pod_target_xcconfig = {
51
51
  "USE_HEADERMAP" => "NO",
52
52
  "HEADER_SEARCH_PATHS" => header_search_paths,
53
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
53
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
54
54
  "DEFINES_MODULE" => "YES",
55
55
  }
56
56
 
@@ -43,7 +43,7 @@ Pod::Spec.new do |s|
43
43
  s.header_dir = "react/renderer/runtimescheduler"
44
44
  s.exclude_files = "tests"
45
45
  s.pod_target_xcconfig = {
46
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
46
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
47
47
  "HEADER_SEARCH_PATHS" => header_search_paths.join(' ')}
48
48
 
49
49
  if ENV['USE_FRAMEWORKS']
@@ -13,7 +13,6 @@
13
13
  #include <react/featureflags/ReactNativeFeatureFlags.h>
14
14
  #include <react/renderer/debug/SystraceSection.h>
15
15
  #include <utility>
16
- #include "ErrorUtils.h"
17
16
 
18
17
  namespace facebook::react {
19
18
 
@@ -8,9 +8,9 @@
8
8
  #include "RuntimeScheduler_Legacy.h"
9
9
  #include "SchedulerPriorityUtils.h"
10
10
 
11
+ #include <cxxreact/ErrorUtils.h>
11
12
  #include <react/renderer/debug/SystraceSection.h>
12
13
  #include <utility>
13
- #include "ErrorUtils.h"
14
14
 
15
15
  namespace facebook::react {
16
16
 
@@ -136,7 +136,7 @@ void RuntimeScheduler_Legacy::callExpiredTasks(jsi::Runtime& runtime) {
136
136
  executeTask(runtime, topPriorityTask, didUserCallbackTimeout);
137
137
  }
138
138
  } catch (jsi::JSError& error) {
139
- handleFatalError(runtime, error);
139
+ handleJSError(runtime, error, true);
140
140
  }
141
141
 
142
142
  currentPriority_ = previousPriority;
@@ -182,7 +182,7 @@ void RuntimeScheduler_Legacy::startWorkLoop(jsi::Runtime& runtime) {
182
182
  executeTask(runtime, topPriorityTask, didUserCallbackTimeout);
183
183
  }
184
184
  } catch (jsi::JSError& error) {
185
- handleFatalError(runtime, error);
185
+ handleJSError(runtime, error, true);
186
186
  }
187
187
 
188
188
  currentPriority_ = previousPriority;
@@ -12,7 +12,6 @@
12
12
  #include <react/featureflags/ReactNativeFeatureFlags.h>
13
13
  #include <react/renderer/debug/SystraceSection.h>
14
14
  #include <utility>
15
- #include "ErrorUtils.h"
16
15
 
17
16
  namespace facebook::react {
18
17
 
@@ -104,7 +103,7 @@ bool RuntimeScheduler_Modern::getShouldYield() const noexcept {
104
103
  std::shared_lock lock(schedulingMutex_);
105
104
 
106
105
  return syncTaskRequests_ > 0 ||
107
- (!taskQueue_.empty() && taskQueue_.top() != currentTask_);
106
+ (!taskQueue_.empty() && taskQueue_.top().get() != currentTask_);
108
107
  }
109
108
 
110
109
  bool RuntimeScheduler_Modern::getIsSynchronous() const noexcept {
@@ -144,9 +143,8 @@ void RuntimeScheduler_Modern::executeNowOnTheSameThread(
144
143
  auto priority = SchedulerPriority::ImmediatePriority;
145
144
  auto expirationTime =
146
145
  currentTime + timeoutForSchedulerPriority(priority);
147
- auto task = std::make_shared<Task>(
148
- priority, std::move(callback), expirationTime);
149
146
 
147
+ auto task = Task{priority, std::move(callback), expirationTime};
150
148
  executeTask(runtime, task, currentTime);
151
149
 
152
150
  isSynchronous_ = false;
@@ -231,21 +229,17 @@ void RuntimeScheduler_Modern::startWorkLoop(
231
229
 
232
230
  auto previousPriority = currentPriority_;
233
231
 
234
- try {
235
- while (syncTaskRequests_ == 0) {
236
- auto currentTime = now_();
237
- auto topPriorityTask = selectTask(currentTime, onlyExpired);
232
+ while (syncTaskRequests_ == 0) {
233
+ auto currentTime = now_();
234
+ auto topPriorityTask = selectTask(currentTime, onlyExpired);
238
235
 
239
- if (!topPriorityTask) {
240
- // No pending work to do.
241
- // Events will restart the loop when necessary.
242
- break;
243
- }
244
-
245
- executeTask(runtime, topPriorityTask, currentTime);
236
+ if (!topPriorityTask) {
237
+ // No pending work to do.
238
+ // Events will restart the loop when necessary.
239
+ break;
246
240
  }
247
- } catch (jsi::JSError& error) {
248
- handleFatalError(runtime, error);
241
+
242
+ executeTask(runtime, *topPriorityTask, currentTime);
249
243
  }
250
244
 
251
245
  currentPriority_ = previousPriority;
@@ -280,19 +274,19 @@ std::shared_ptr<Task> RuntimeScheduler_Modern::selectTask(
280
274
 
281
275
  void RuntimeScheduler_Modern::executeTask(
282
276
  jsi::Runtime& runtime,
283
- const std::shared_ptr<Task>& task,
277
+ Task& task,
284
278
  RuntimeSchedulerTimePoint currentTime) {
285
- auto didUserCallbackTimeout = task->expirationTime <= currentTime;
279
+ auto didUserCallbackTimeout = task.expirationTime <= currentTime;
286
280
 
287
281
  SystraceSection s(
288
282
  "RuntimeScheduler::executeTask",
289
283
  "priority",
290
- serialize(task->priority),
284
+ serialize(task.priority),
291
285
  "didUserCallbackTimeout",
292
286
  didUserCallbackTimeout);
293
287
 
294
- currentTask_ = task;
295
- currentPriority_ = task->priority;
288
+ currentTask_ = &task;
289
+ currentPriority_ = task.priority;
296
290
 
297
291
  executeMacrotask(runtime, task, didUserCallbackTimeout);
298
292
 
@@ -305,6 +299,8 @@ void RuntimeScheduler_Modern::executeTask(
305
299
  // "Update the rendering" step.
306
300
  updateRendering();
307
301
  }
302
+
303
+ currentTask_ = nullptr;
308
304
  }
309
305
 
310
306
  /**
@@ -326,16 +322,20 @@ void RuntimeScheduler_Modern::updateRendering() {
326
322
 
327
323
  void RuntimeScheduler_Modern::executeMacrotask(
328
324
  jsi::Runtime& runtime,
329
- std::shared_ptr<Task> task,
325
+ Task& task,
330
326
  bool didUserCallbackTimeout) const {
331
327
  SystraceSection s("RuntimeScheduler::executeMacrotask");
332
328
 
333
- auto result = task->execute(runtime, didUserCallbackTimeout);
329
+ try {
330
+ auto result = task.execute(runtime, didUserCallbackTimeout);
334
331
 
335
- if (result.isObject() && result.getObject(runtime).isFunction(runtime)) {
336
- // If the task returned a continuation callback, we re-assign it to the task
337
- // and keep the task in the queue.
338
- task->callback = result.getObject(runtime).getFunction(runtime);
332
+ if (result.isObject() && result.getObject(runtime).isFunction(runtime)) {
333
+ // If the task returned a continuation callback, we re-assign it to the
334
+ // task and keep the task in the queue.
335
+ task.callback = result.getObject(runtime).getFunction(runtime);
336
+ }
337
+ } catch (jsi::JSError& error) {
338
+ handleJSError(runtime, error, true);
339
339
  }
340
340
  }
341
341
 
@@ -139,7 +139,7 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase {
139
139
  TaskPriorityComparer>
140
140
  taskQueue_;
141
141
 
142
- std::shared_ptr<Task> currentTask_;
142
+ Task* currentTask_{};
143
143
 
144
144
  /**
145
145
  * This protects the access to `taskQueue_` and `isWorkLoopScheduled_`.
@@ -168,12 +168,12 @@ class RuntimeScheduler_Modern final : public RuntimeSchedulerBase {
168
168
  */
169
169
  void executeTask(
170
170
  jsi::Runtime& runtime,
171
- const std::shared_ptr<Task>& task,
171
+ Task& task,
172
172
  RuntimeSchedulerTimePoint currentTime);
173
173
 
174
174
  void executeMacrotask(
175
175
  jsi::Runtime& runtime,
176
- std::shared_ptr<Task> task,
176
+ Task& task,
177
177
  bool didUserCallbackTimeout) const;
178
178
 
179
179
  void updateRendering();
@@ -32,20 +32,22 @@ jsi::Value Task::execute(jsi::Runtime& runtime, bool didUserCallbackTimeout) {
32
32
  return result;
33
33
  }
34
34
 
35
- auto& cbVal = callback.value();
35
+ // We get the value of the callback and reset it immediately to avoid it being
36
+ // called more than once (including when the callback throws).
37
+ auto originalCallback = std::move(*callback);
38
+ callback.reset();
36
39
 
37
- if (cbVal.index() == 0) {
40
+ if (originalCallback.index() == 0) {
38
41
  // Callback in JavaScript is expecting a single bool parameter.
39
42
  // React team plans to remove it in the future when a scheduler bug on web
40
43
  // is resolved.
41
- result =
42
- std::get<jsi::Function>(cbVal).call(runtime, {didUserCallbackTimeout});
44
+ result = std::get<jsi::Function>(originalCallback)
45
+ .call(runtime, {didUserCallbackTimeout});
43
46
  } else {
44
47
  // Calling a raw callback
45
- std::get<RawCallback>(cbVal)(runtime);
48
+ std::get<RawCallback>(originalCallback)(runtime);
46
49
  }
47
- // Destroying callback to prevent calling it twice.
48
- callback.reset();
50
+
49
51
  return result;
50
52
  }
51
53
 
@@ -1021,6 +1021,52 @@ TEST_P(RuntimeSchedulerTest, modernTwoThreadsRequestAccessToTheRuntime) {
1021
1021
  EXPECT_EQ(stubQueue_->size(), 0);
1022
1022
  }
1023
1023
 
1024
+ TEST_P(RuntimeSchedulerTest, errorInTaskShouldNotStopMicrotasks) {
1025
+ // Only for modern runtime scheduler
1026
+ if (!GetParam()) {
1027
+ return;
1028
+ }
1029
+
1030
+ auto microtaskRan = false;
1031
+ auto taskRan = false;
1032
+
1033
+ auto callback = createHostFunctionFromLambda([&](bool /* unused */) {
1034
+ taskRan = true;
1035
+
1036
+ auto microtaskCallback = jsi::Function::createFromHostFunction(
1037
+ *runtime_,
1038
+ jsi::PropNameID::forUtf8(*runtime_, "microtask1"),
1039
+ 3,
1040
+ [&](jsi::Runtime& /*unused*/,
1041
+ const jsi::Value& /*unused*/,
1042
+ const jsi::Value* /*arguments*/,
1043
+ size_t /*unused*/) -> jsi::Value {
1044
+ microtaskRan = true;
1045
+ return jsi::Value::undefined();
1046
+ });
1047
+
1048
+ runtime_->queueMicrotask(microtaskCallback);
1049
+
1050
+ throw jsi::JSError(*runtime_, "Test error");
1051
+
1052
+ return jsi::Value::undefined();
1053
+ });
1054
+
1055
+ runtimeScheduler_->scheduleTask(
1056
+ SchedulerPriority::NormalPriority, std::move(callback));
1057
+
1058
+ EXPECT_EQ(taskRan, false);
1059
+ EXPECT_EQ(microtaskRan, false);
1060
+ EXPECT_EQ(stubQueue_->size(), 1);
1061
+
1062
+ stubQueue_->tick();
1063
+
1064
+ EXPECT_EQ(taskRan, 1);
1065
+ EXPECT_EQ(microtaskRan, 1);
1066
+ EXPECT_EQ(stubQueue_->size(), 0);
1067
+ EXPECT_EQ(stubErrorUtils_->getReportFatalCallCount(), 1);
1068
+ }
1069
+
1024
1070
  INSTANTIATE_TEST_SUITE_P(
1025
1071
  UseModernRuntimeScheduler,
1026
1072
  RuntimeSchedulerTest,
@@ -37,7 +37,7 @@ Pod::Spec.new do |s|
37
37
  s.header_dir = "react/runtime"
38
38
  s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/React-Core\" \"${PODS_TARGET_SRCROOT}/../..\"",
39
39
  "USE_HEADERMAP" => "YES",
40
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
40
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
41
41
  "GCC_WARN_PEDANTIC" => "YES" }
42
42
  s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
43
43
 
@@ -35,7 +35,7 @@ Pod::Spec.new do |s|
35
35
  s.header_dir = "react/runtime/hermes"
36
36
  s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"${PODS_TARGET_SRCROOT}/../..\" \"${PODS_TARGET_SRCROOT}/../../hermes/executor\" \"$(PODS_ROOT)/boost\"",
37
37
  "USE_HEADERMAP" => "YES",
38
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
38
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
39
39
  "GCC_WARN_PEDANTIC" => "YES" }
40
40
  s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
41
41
 
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
42
42
  s.header_dir = "ReactCommon"
43
43
  s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => header_search_paths,
44
44
  "USE_HEADERMAP" => "YES",
45
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
45
+ "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
46
46
  "GCC_WARN_PEDANTIC" => "YES" }
47
47
  s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
48
48
 
@@ -39,7 +39,7 @@ Pod::Spec.new do |s|
39
39
  s.compiler_flags = folly_compiler_flags
40
40
  s.header_dir = "react/utils"
41
41
  s.exclude_files = "tests"
42
- s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
42
+ s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(),
43
43
  "HEADER_SEARCH_PATHS" => header_search_paths.join(' '),
44
44
  "DEFINES_MODULE" => "YES" }
45
45
 
@@ -32,5 +32,5 @@ Pod::Spec.new do |s|
32
32
  s.source = source
33
33
  s.source_files = "**/*.{cpp,h}"
34
34
  s.header_dir = "reactperflogger"
35
- s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => "c++20" }
35
+ s.pod_target_xcconfig = { "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard() }
36
36
  end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-tvos",
3
- "version": "0.74.2-0",
3
+ "version": "0.74.5-0",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -108,16 +108,16 @@
108
108
  },
109
109
  "dependencies": {
110
110
  "@jest/create-cache-key-function": "^29.6.3",
111
- "@react-native-community/cli": "13.6.8",
112
- "@react-native-community/cli-platform-android": "13.6.8",
113
- "@react-native-community/cli-platform-ios": "13.6.8",
114
- "@react-native/assets-registry": "0.74.84",
115
- "@react-native/codegen": "0.74.84",
116
- "@react-native/community-cli-plugin": "0.74.84",
117
- "@react-native/gradle-plugin": "0.74.84",
118
- "@react-native/js-polyfills": "0.74.84",
119
- "@react-native/normalize-colors": "0.74.84",
120
- "@react-native-tvos/virtualized-lists": "0.74.2-0",
111
+ "@react-native-community/cli": "13.6.9",
112
+ "@react-native-community/cli-platform-android": "13.6.9",
113
+ "@react-native-community/cli-platform-ios": "13.6.9",
114
+ "@react-native/assets-registry": "0.74.87",
115
+ "@react-native/codegen": "0.74.87",
116
+ "@react-native/community-cli-plugin": "0.74.87",
117
+ "@react-native/gradle-plugin": "0.74.87",
118
+ "@react-native/js-polyfills": "0.74.87",
119
+ "@react-native/normalize-colors": "0.74.87",
120
+ "@react-native-tvos/virtualized-lists": "0.74.5-0",
121
121
  "abort-controller": "^3.0.0",
122
122
  "anser": "^1.4.9",
123
123
  "ansi-regex": "^5.0.0",
@@ -142,7 +142,7 @@
142
142
  "scheduler": "0.24.0-canary-efb381bbf-20230505",
143
143
  "stacktrace-parser": "^0.1.10",
144
144
  "whatwg-fetch": "^3.0.0",
145
- "ws": "^6.2.2",
145
+ "ws": "^6.2.3",
146
146
  "yargs": "^17.6.2"
147
147
  },
148
148
  "codegenConfig": {
@@ -164,6 +164,6 @@
164
164
  ]
165
165
  },
166
166
  "devDependencies": {
167
- "react-native-core": "npm:react-native@0.74.2"
167
+ "react-native-core": "npm:react-native@0.74.5"
168
168
  }
169
169
  }
@@ -51,5 +51,9 @@ module Helpers
51
51
  :compiler_flags => '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_CFG_NO_COROUTINES=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -Wno-comma -Wno-shorten-64-to-32'
52
52
  }
53
53
  end
54
+
55
+ def self.cxx_language_standard
56
+ return "c++20"
57
+ end
54
58
  end
55
59
  end
@@ -9,34 +9,21 @@ require_relative "./utils.rb"
9
9
  require_relative "./helpers.rb"
10
10
 
11
11
  class NewArchitectureHelper
12
- @@cplusplus_version = "c++20"
13
-
14
12
  @@NewArchWarningEmitted = false # Used not to spam warnings to the user.
15
13
 
16
14
  def self.set_clang_cxx_language_standard_if_needed(installer)
17
- language_standard = nil
18
-
19
- installer.pods_project.targets.each do |target|
20
- # The React-Core pod may have a suffix added by Cocoapods, so we test whether 'React-Core' is a substring, and do not require exact match
21
- if target.name.include? 'React-Core'
22
- language_standard = target.resolved_build_setting("CLANG_CXX_LANGUAGE_STANDARD", resolve_against_xcconfig: true).values[0]
23
- end
24
- end
15
+ projects = installer.aggregate_targets
16
+ .map{ |t| t.user_project }
17
+ .uniq{ |p| p.path }
25
18
 
26
- unless language_standard.nil?
27
- projects = installer.aggregate_targets
28
- .map{ |t| t.user_project }
29
- .uniq{ |p| p.path }
19
+ projects.each do |project|
20
+ Pod::UI.puts("Setting CLANG_CXX_LANGUAGE_STANDARD to #{ Helpers::Constants::cxx_language_standard } on #{ project.path }")
30
21
 
31
- projects.each do |project|
32
- Pod::UI.puts("Setting CLANG_CXX_LANGUAGE_STANDARD to #{ language_standard } on #{ project.path }")
33
-
34
- project.build_configurations.each do |config|
35
- config.build_settings["CLANG_CXX_LANGUAGE_STANDARD"] = language_standard
36
- end
37
-
38
- project.save()
22
+ project.build_configurations.each do |config|
23
+ config.build_settings["CLANG_CXX_LANGUAGE_STANDARD"] = Helpers::Constants::cxx_language_standard
39
24
  end
25
+
26
+ project.save()
40
27
  end
41
28
  end
42
29
 
@@ -103,7 +90,7 @@ class NewArchitectureHelper
103
90
  current_config["HEADER_SEARCH_PATHS"] = current_headers.empty? ?
104
91
  header_search_paths_string :
105
92
  "#{current_headers} #{header_search_paths_string}"
106
- current_config["CLANG_CXX_LANGUAGE_STANDARD"] = @@cplusplus_version
93
+ current_config["CLANG_CXX_LANGUAGE_STANDARD"] = Helpers::Constants::cxx_language_standard
107
94
 
108
95
 
109
96
  spec.dependency "React-Core"