|
309 | 309 | return retain(self, @selector(retain));
|
310 | 310 | }
|
311 | 311 | if ([self retainCount] == 1) {
|
312 |
| - auto innerCache = isolateWrapper.GetCache(); |
313 |
| - auto it = innerCache->Instances.find(self); |
314 |
| - if (it != innerCache->Instances.end()) { |
315 |
| - v8::Locker locker(isolate); |
316 |
| - Isolate::Scope isolate_scope(isolate); |
317 |
| - HandleScope handle_scope(isolate); |
318 |
| - Local<Value> value = it->second->Get(isolate); |
319 |
| - BaseDataWrapper* wrapper = tns::GetValue(isolate, value); |
320 |
| - if (wrapper != nullptr && wrapper->Type() == WrapperType::ObjCObject) { |
321 |
| - ObjCDataWrapper* objcWrapper = static_cast<ObjCDataWrapper*>(wrapper); |
322 |
| - objcWrapper->GcProtect(); |
| 312 | + auto runtime = Runtime::GetRuntime(isolate); |
| 313 | + auto runtimeLoop = runtime->RuntimeLoop(); |
| 314 | + void* weakSelf = (__bridge void*)self; |
| 315 | + auto gcProtect = ^() { |
| 316 | + auto innerCache = isolateWrapper.GetCache(); |
| 317 | + auto it = innerCache->Instances.find((id)weakSelf); |
| 318 | + if (it != innerCache->Instances.end()) { |
| 319 | + v8::Locker locker(isolate); |
| 320 | + Isolate::Scope isolate_scope(isolate); |
| 321 | + HandleScope handle_scope(isolate); |
| 322 | + Local<Value> value = it->second->Get(isolate); |
| 323 | + BaseDataWrapper* wrapper = tns::GetValue(isolate, value); |
| 324 | + if (wrapper != nullptr && wrapper->Type() == WrapperType::ObjCObject) { |
| 325 | + ObjCDataWrapper* objcWrapper = static_cast<ObjCDataWrapper*>(wrapper); |
| 326 | + objcWrapper->GcProtect(); |
| 327 | + } |
323 | 328 | }
|
| 329 | + }; |
| 330 | + if (CFRunLoopGetCurrent() != runtimeLoop) { |
| 331 | + tns::ExecuteOnRunLoop(runtimeLoop, gcProtect); |
| 332 | + } else { |
| 333 | + gcProtect(); |
324 | 334 | }
|
325 | 335 | }
|
326 | 336 |
|
|
337 | 347 | }
|
338 | 348 |
|
339 | 349 | if ([self retainCount] == 2) {
|
340 |
| - auto innerCache = isolateWrapper.GetCache(); |
341 |
| - auto it = innerCache->Instances.find(self); |
342 |
| - if (it != innerCache->Instances.end()) { |
343 |
| - v8::Locker locker(isolate); |
344 |
| - Isolate::Scope isolate_scope(isolate); |
345 |
| - HandleScope handle_scope(isolate); |
346 |
| - if (it->second != nullptr) { |
347 |
| - Local<Value> value = it->second->Get(isolate); |
348 |
| - BaseDataWrapper* wrapper = tns::GetValue(isolate, value); |
349 |
| - if (wrapper != nullptr && wrapper->Type() == WrapperType::ObjCObject) { |
350 |
| - ObjCDataWrapper* objcWrapper = static_cast<ObjCDataWrapper*>(wrapper); |
351 |
| - objcWrapper->GcUnprotect(); |
| 350 | + void* weakSelf = (__bridge void*)self; |
| 351 | + auto gcUnprotect = ^() { |
| 352 | + auto innerCache = isolateWrapper.GetCache(); |
| 353 | + auto it = innerCache->Instances.find((id)weakSelf); |
| 354 | + if (it != innerCache->Instances.end()) { |
| 355 | + v8::Locker locker(isolate); |
| 356 | + Isolate::Scope isolate_scope(isolate); |
| 357 | + HandleScope handle_scope(isolate); |
| 358 | + if (it->second != nullptr) { |
| 359 | + Local<Value> value = it->second->Get(isolate); |
| 360 | + BaseDataWrapper* wrapper = tns::GetValue(isolate, value); |
| 361 | + if (wrapper != nullptr && wrapper->Type() == WrapperType::ObjCObject) { |
| 362 | + ObjCDataWrapper* objcWrapper = static_cast<ObjCDataWrapper*>(wrapper); |
| 363 | + objcWrapper->GcUnprotect(); |
| 364 | + } |
| 365 | + } |
| 366 | + } |
| 367 | + }; |
| 368 | + auto runtime = Runtime::GetRuntime(isolate); |
| 369 | + auto runtimeLoop = runtime->RuntimeLoop(); |
| 370 | + if (CFRunLoopGetCurrent() != runtimeLoop) { |
| 371 | + tns::ExecuteOnRunLoop(runtimeLoop, gcUnprotect); |
| 372 | + } else { |
| 373 | + auto innerCache = isolateWrapper.GetCache(); |
| 374 | + auto it = innerCache->Instances.find(self); |
| 375 | + if (it != innerCache->Instances.end()) { |
| 376 | + v8::Locker locker(isolate); |
| 377 | + Isolate::Scope isolate_scope(isolate); |
| 378 | + HandleScope handle_scope(isolate); |
| 379 | + if (it->second != nullptr) { |
| 380 | + Local<Value> value = it->second->Get(isolate); |
| 381 | + BaseDataWrapper* wrapper = tns::GetValue(isolate, value); |
| 382 | + if (wrapper != nullptr && wrapper->Type() == WrapperType::ObjCObject) { |
| 383 | + ObjCDataWrapper* objcWrapper = static_cast<ObjCDataWrapper*>(wrapper); |
| 384 | + objcWrapper->GcUnprotect(); |
| 385 | + } |
352 | 386 | }
|
353 | 387 | }
|
354 | 388 | }
|
|
952 | 986 |
|
953 | 987 | unsigned long long ClassBuilder::classNameCounter_ = 0;
|
954 | 988 |
|
955 |
| -} |
| 989 | +} // namespace tns |
0 commit comments