| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/cocoa/objc_zombie.h" | 5 #import "chrome/browser/cocoa/objc_zombie.h" |
| 6 | 6 |
| 7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
| 8 #include <mach-o/dyld.h> | 8 #include <mach-o/dyld.h> |
| 9 #include <mach-o/nlist.h> | 9 #include <mach-o/nlist.h> |
| 10 | 10 |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 | 268 |
| 269 BOOL ZombieEnable(BOOL zombieAllObjects, | 269 BOOL ZombieEnable(BOOL zombieAllObjects, |
| 270 size_t zombieCount) { | 270 size_t zombieCount) { |
| 271 // Only allow enable/disable on the main thread, just to keep things | 271 // Only allow enable/disable on the main thread, just to keep things |
| 272 // simple. | 272 // simple. |
| 273 CHECK([NSThread isMainThread]); | 273 CHECK([NSThread isMainThread]); |
| 274 | 274 |
| 275 if (!ZombieInit()) | 275 if (!ZombieInit()) |
| 276 return NO; | 276 return NO; |
| 277 | 277 |
| 278 if (zombieCount < 0) | |
| 279 return NO; | |
| 280 | |
| 281 g_zombieAllObjects = zombieAllObjects; | 278 g_zombieAllObjects = zombieAllObjects; |
| 282 | 279 |
| 283 // Replace the implementation of -[NSObject dealloc]. | 280 // Replace the implementation of -[NSObject dealloc]. |
| 284 Method m = class_getInstanceMethod([NSObject class], @selector(dealloc)); | 281 Method m = class_getInstanceMethod([NSObject class], @selector(dealloc)); |
| 285 if (!m) | 282 if (!m) |
| 286 return NO; | 283 return NO; |
| 287 | 284 |
| 288 const IMP prevDeallocIMP = method_setImplementation(m, (IMP)ZombieDealloc); | 285 const IMP prevDeallocIMP = method_setImplementation(m, (IMP)ZombieDealloc); |
| 289 DCHECK(prevDeallocIMP == g_originalDeallocIMP || | 286 DCHECK(prevDeallocIMP == g_originalDeallocIMP || |
| 290 prevDeallocIMP == (IMP)ZombieDealloc); | 287 prevDeallocIMP == (IMP)ZombieDealloc); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 if (oldZombies) { | 372 if (oldZombies) { |
| 376 for (size_t i = 0; i < oldCount; ++i) { | 373 for (size_t i = 0; i < oldCount; ++i) { |
| 377 if (oldZombies[i].object) | 374 if (oldZombies[i].object) |
| 378 free(oldZombies[i].object); | 375 free(oldZombies[i].object); |
| 379 } | 376 } |
| 380 free(oldZombies); | 377 free(oldZombies); |
| 381 } | 378 } |
| 382 } | 379 } |
| 383 | 380 |
| 384 } // namespace ObjcEvilDoers | 381 } // namespace ObjcEvilDoers |
| OLD | NEW |