@@ -221,11 +221,46 @@ class TurboModuleImpl : public facebook::react::TurboModule {
221
221
VerifyElseCrash (argCount > 1 );
222
222
if (auto strongLongLivedObjectCollection = longLivedObjectCollection.lock ()) {
223
223
auto jsiRuntimeHolder = LongLivedJsiRuntime::CreateWeak (strongLongLivedObjectCollection, rt);
224
+ auto weakCallback1 = LongLivedJsiFunction::CreateWeak (
225
+ strongLongLivedObjectCollection, rt, args[argCount - 2 ].getObject (rt).getFunction (rt));
226
+ auto weakCallback2 = LongLivedJsiFunction::CreateWeak (
227
+ strongLongLivedObjectCollection, rt, args[argCount - 1 ].getObject (rt).getFunction (rt));
228
+
224
229
method (
225
230
winrt::make<JsiReader>(rt, args, argCount - 2 ),
226
231
winrt::make<JSDispatcherWriter>(jsDispatcher, jsiRuntimeHolder),
227
- MakeCallback (rt, strongLongLivedObjectCollection, args[argCount - 2 ]),
228
- MakeCallback (rt, strongLongLivedObjectCollection, args[argCount - 1 ]));
232
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](const IJSValueWriter &writer) noexcept {
233
+ writer.as <JSDispatcherWriter>()->WithResultArgs (
234
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](
235
+ facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
236
+ if (auto callback1 = weakCallback1.lock ()) {
237
+ callback1->Value ().call (rt, args, count);
238
+ callback1->allowRelease ();
239
+ }
240
+ if (auto callback2 = weakCallback2.lock ()) {
241
+ callback2->allowRelease ();
242
+ }
243
+ if (auto runtimeHolder = jsiRuntimeHolder.lock ()) {
244
+ runtimeHolder->allowRelease ();
245
+ }
246
+ });
247
+ },
248
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](const IJSValueWriter &writer) noexcept {
249
+ writer.as <JSDispatcherWriter>()->WithResultArgs (
250
+ [weakCallback1, weakCallback2, jsiRuntimeHolder](
251
+ facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
252
+ if (auto callback2 = weakCallback2.lock ()) {
253
+ callback2->Value ().call (rt, args, count);
254
+ callback2->allowRelease ();
255
+ }
256
+ if (auto callback1 = weakCallback1.lock ()) {
257
+ callback1->allowRelease ();
258
+ }
259
+ if (auto runtimeHolder = jsiRuntimeHolder.lock ()) {
260
+ runtimeHolder->allowRelease ();
261
+ }
262
+ });
263
+ });
229
264
}
230
265
return facebook::jsi::Value::undefined ();
231
266
});
@@ -247,49 +282,65 @@ class TurboModuleImpl : public facebook::react::TurboModule {
247
282
auto argWriter = winrt::make<JSDispatcherWriter>(jsDispatcher, jsiRuntimeHolder);
248
283
return facebook::react::createPromiseAsJSIValue (
249
284
rt,
250
- [method, argReader, argWriter, strongLongLivedObjectCollection](
285
+ [method, argReader, argWriter, strongLongLivedObjectCollection, jsiRuntimeHolder ](
251
286
facebook::jsi::Runtime &runtime, std::shared_ptr<facebook::react::Promise> promise) {
287
+ auto weakResolve = LongLivedJsiFunction::CreateWeak (
288
+ strongLongLivedObjectCollection, runtime, std::move (promise->resolve_ ));
289
+ auto weakReject = LongLivedJsiFunction::CreateWeak (
290
+ strongLongLivedObjectCollection, runtime, std::move (promise->reject_ ));
252
291
method (
253
292
argReader,
254
293
argWriter,
255
- [weakResolve = LongLivedJsiFunction::CreateWeak (
256
- strongLongLivedObjectCollection, runtime, std::move (promise->resolve_ ))](
257
- const IJSValueWriter &writer) {
258
- writer.as <JSDispatcherWriter>()->WithResultArgs ([weakResolve](
259
- facebook::jsi::Runtime &runtime,
260
- facebook::jsi::Value const *args,
261
- size_t argCount) {
262
- VerifyElseCrash (argCount == 1 );
263
- if (auto resolveHolder = weakResolve.lock ()) {
264
- resolveHolder->Value ().call (runtime, args[0 ]);
265
- }
266
- });
294
+ [weakResolve, weakReject, jsiRuntimeHolder](const IJSValueWriter &writer) {
295
+ writer.as <JSDispatcherWriter>()->WithResultArgs (
296
+ [weakResolve, weakReject, jsiRuntimeHolder](
297
+ facebook::jsi::Runtime &runtime,
298
+ facebook::jsi::Value const *args,
299
+ size_t argCount) {
300
+ VerifyElseCrash (argCount == 1 );
301
+ if (auto resolveHolder = weakResolve.lock ()) {
302
+ resolveHolder->Value ().call (runtime, args[0 ]);
303
+ resolveHolder->allowRelease ();
304
+ }
305
+ if (auto rejectHolder = weakReject.lock ()) {
306
+ rejectHolder->allowRelease ();
307
+ }
308
+ if (auto runtimeHolder = jsiRuntimeHolder.lock ()) {
309
+ runtimeHolder->allowRelease ();
310
+ }
311
+ });
267
312
},
268
- [weakReject = LongLivedJsiFunction::CreateWeak (
269
- strongLongLivedObjectCollection, runtime, std::move (promise->reject_ ))](
270
- const IJSValueWriter &writer) {
271
- writer.as <JSDispatcherWriter>()->WithResultArgs ([weakReject](
272
- facebook::jsi::Runtime &runtime,
273
- facebook::jsi::Value const *args,
274
- size_t argCount) {
275
- VerifyElseCrash (argCount == 1 );
276
- if (auto rejectHolder = weakReject.lock ()) {
277
- // To match the Android and iOS TurboModule behavior we create the Error object for
278
- // the Promise rejection the same way as in updateErrorWithErrorData method.
279
- // See react-native/Libraries/BatchedBridge/NativeModules.js for details.
280
- auto error = runtime.global ()
281
- .getPropertyAsFunction (runtime, " Error" )
282
- .callAsConstructor (runtime, {});
283
- auto &errorData = args[0 ];
284
- if (errorData.isObject ()) {
285
- runtime.global ()
286
- .getPropertyAsObject (runtime, " Object" )
287
- .getPropertyAsFunction (runtime, " assign" )
288
- .call (runtime, error, errorData.getObject (runtime));
289
- }
290
- rejectHolder->Value ().call (runtime, args[0 ]);
291
- }
292
- });
313
+ [weakResolve, weakReject, jsiRuntimeHolder](const IJSValueWriter &writer) {
314
+ writer.as <JSDispatcherWriter>()->WithResultArgs (
315
+ [weakResolve, weakReject, jsiRuntimeHolder](
316
+ facebook::jsi::Runtime &runtime,
317
+ facebook::jsi::Value const *args,
318
+ size_t argCount) {
319
+ VerifyElseCrash (argCount == 1 );
320
+ if (auto rejectHolder = weakReject.lock ()) {
321
+ // To match the Android and iOS TurboModule behavior we create the Error object
322
+ // for the Promise rejection the same way as in updateErrorWithErrorData method.
323
+ // See react-native/Libraries/BatchedBridge/NativeModules.js for details.
324
+ auto error = runtime.global ()
325
+ .getPropertyAsFunction (runtime, " Error" )
326
+ .callAsConstructor (runtime, {});
327
+ auto &errorData = args[0 ];
328
+ if (errorData.isObject ()) {
329
+ runtime.global ()
330
+ .getPropertyAsObject (runtime, " Object" )
331
+ .getPropertyAsFunction (runtime, " assign" )
332
+ .call (runtime, error, errorData.getObject (runtime));
333
+ }
334
+ rejectHolder->Value ().call (runtime, args[0 ]);
335
+ rejectHolder->allowRelease ();
336
+ }
337
+ if (auto resolveHolder = weakResolve.lock ()) {
338
+ resolveHolder->allowRelease ();
339
+ }
340
+ if (auto runtimeHolder = jsiRuntimeHolder.lock ()) {
341
+ runtimeHolder->allowRelease ();
342
+ }
343
+ });
293
344
});
294
345
});
295
346
}
@@ -347,6 +398,7 @@ class TurboModuleImpl : public facebook::react::TurboModule {
347
398
[weakCallback](facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t count) {
348
399
if (auto callback = weakCallback.lock ()) {
349
400
callback->Value ().call (rt, args, count);
401
+ callback->allowRelease ();
350
402
}
351
403
});
352
404
};
0 commit comments