@@ -254,6 +254,21 @@ static int32_t getUniqueId()
254
254
__block BOOL resolveWasCalled = NO ;
255
255
__block BOOL rejectWasCalled = NO ;
256
256
257
+ RCTBlockGuard *blockGuard;
258
+ if (RCTTurboModulePromisesBlockGuardEnabled ()) {
259
+ blockGuard = [[RCTBlockGuard alloc ] initWithCleanup: ^() {
260
+ auto strongResolveWrapper = weakResolveWrapper.lock ();
261
+ if (strongResolveWrapper) {
262
+ strongResolveWrapper->destroy ();
263
+ }
264
+
265
+ auto strongRejectWrapper = weakRejectWrapper.lock ();
266
+ if (strongRejectWrapper) {
267
+ strongRejectWrapper->destroy ();
268
+ }
269
+ }];
270
+ }
271
+
257
272
RCTPromiseResolveBlock resolveBlock = ^(id result) {
258
273
if (rejectWasCalled) {
259
274
RCTLogError (@" %s : Tried to resolve a promise after it's already been rejected." , moduleMethod.c_str ());
@@ -271,7 +286,7 @@ static int32_t getUniqueId()
271
286
return ;
272
287
}
273
288
274
- strongResolveWrapper->jsInvoker ().invokeAsync ([weakResolveWrapper, weakRejectWrapper, result]() {
289
+ strongResolveWrapper->jsInvoker ().invokeAsync ([weakResolveWrapper, weakRejectWrapper, result, blockGuard ]() {
275
290
auto strongResolveWrapper2 = weakResolveWrapper.lock ();
276
291
auto strongRejectWrapper2 = weakRejectWrapper.lock ();
277
292
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
@@ -284,6 +299,7 @@ static int32_t getUniqueId()
284
299
285
300
strongResolveWrapper2->destroy ();
286
301
strongRejectWrapper2->destroy ();
302
+ (void )blockGuard;
287
303
});
288
304
289
305
resolveWasCalled = YES ;
@@ -307,7 +323,7 @@ static int32_t getUniqueId()
307
323
}
308
324
309
325
NSDictionary *jsError = RCTJSErrorFromCodeMessageAndNSError (code, message, error);
310
- strongRejectWrapper->jsInvoker ().invokeAsync ([weakResolveWrapper, weakRejectWrapper, jsError]() {
326
+ strongRejectWrapper->jsInvoker ().invokeAsync ([weakResolveWrapper, weakRejectWrapper, jsError, blockGuard ]() {
311
327
auto strongResolveWrapper2 = weakResolveWrapper.lock ();
312
328
auto strongRejectWrapper2 = weakRejectWrapper.lock ();
313
329
if (!strongResolveWrapper2 || !strongRejectWrapper2) {
@@ -320,6 +336,7 @@ static int32_t getUniqueId()
320
336
321
337
strongResolveWrapper2->destroy ();
322
338
strongRejectWrapper2->destroy ();
339
+ (void )blockGuard;
323
340
});
324
341
325
342
rejectWasCalled = YES ;
0 commit comments