| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/common/mac/objc_zombie.h" | 5 #import "chrome/common/mac/objc_zombie.h" |
| 6 | 6 |
| 7 #include <AvailabilityMacros.h> | 7 #include <AvailabilityMacros.h> |
| 8 | 8 |
| 9 #include <execinfo.h> | 9 #include <execinfo.h> |
| 10 #import <objc/runtime.h> | 10 #import <objc/runtime.h> |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 Class wasa = object_getClass(self); | 109 Class wasa = object_getClass(self); |
| 110 const size_t size = class_getInstanceSize(wasa); | 110 const size_t size = class_getInstanceSize(wasa); |
| 111 | 111 |
| 112 // Destroy the instance by calling C++ destructors and clearing it | 112 // Destroy the instance by calling C++ destructors and clearing it |
| 113 // to something unlikely to work well if someone references it. | 113 // to something unlikely to work well if someone references it. |
| 114 // NOTE(shess): |object_dispose()| will call this again when the | 114 // NOTE(shess): |object_dispose()| will call this again when the |
| 115 // zombie falls off the treadmill! But by then |isa| will be a | 115 // zombie falls off the treadmill! But by then |isa| will be a |
| 116 // class without C++ destructors or associative references, so it | 116 // class without C++ destructors or associative references, so it |
| 117 // won't hurt anything. | 117 // won't hurt anything. |
| 118 objc_destructInstance(self); | 118 objc_destructInstance(self); |
| 119 // TODO(shess): Temporarily disable clearing the object to debug | |
| 120 // http://crbug.com/154483 | |
| 121 #if 0 | |
| 122 memset(self, '!', size); | 119 memset(self, '!', size); |
| 123 #endif | |
| 124 | 120 |
| 125 // If the instance is big enough, make it into a fat zombie and have | 121 // If the instance is big enough, make it into a fat zombie and have |
| 126 // it remember the old |isa|. Otherwise make it a regular zombie. | 122 // it remember the old |isa|. Otherwise make it a regular zombie. |
| 127 // Setting |isa| rather than using |object_setClass()| because that | 123 // Setting |isa| rather than using |object_setClass()| because that |
| 128 // function is implemented with a memory barrier. The runtime's | 124 // function is implemented with a memory barrier. The runtime's |
| 129 // |_internal_object_dispose()| (in objc-class.m) does this, so it | 125 // |_internal_object_dispose()| (in objc-class.m) does this, so it |
| 130 // should be safe (messaging free'd objects shouldn't be expected to | 126 // should be safe (messaging free'd objects shouldn't be expected to |
| 131 // be thread-safe in the first place). | 127 // be thread-safe in the first place). |
| 132 #pragma clang diagnostic push // clang warns about direct access to isa. | 128 #pragma clang diagnostic push // clang warns about direct access to isa. |
| 133 #pragma clang diagnostic ignored "-Wdeprecated-objc-isa-usage" | 129 #pragma clang diagnostic ignored "-Wdeprecated-objc-isa-usage" |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 if (oldZombies) { | 428 if (oldZombies) { |
| 433 for (size_t i = 0; i < oldCount; ++i) { | 429 for (size_t i = 0; i < oldCount; ++i) { |
| 434 if (oldZombies[i].object) | 430 if (oldZombies[i].object) |
| 435 object_dispose(oldZombies[i].object); | 431 object_dispose(oldZombies[i].object); |
| 436 } | 432 } |
| 437 free(oldZombies); | 433 free(oldZombies); |
| 438 } | 434 } |
| 439 } | 435 } |
| 440 | 436 |
| 441 } // namespace ObjcEvilDoers | 437 } // namespace ObjcEvilDoers |
| OLD | NEW |