From b574c2546ef96d48d25bdd06b23f306fffdb8230 Mon Sep 17 00:00:00 2001 From: mccallum Date: Fri, 4 Aug 1995 20:52:07 +0000 Subject: [PATCH] ([NSObject -autorelease], [NSObject -release]): Add double_release checking. ([NSObject +enableDoubleReleaseCheck:]): New method. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@529 72102866-910b-0410-8b05-ffd578937521 --- Source/NSObject.m | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Source/NSObject.m b/Source/NSObject.m index 967642b94..93ad98651 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -49,6 +49,10 @@ static coll_cache_ptr retain_counts = NULL; /* The Class responsible for handling autorelease's */ static id autorelease_class = nil; +/* When this is `YES', every call to release/autorelease, checks to make sure + isn't being set up to release itself too many times. */ +static BOOL double_release_check_enabled = NO; + BOOL NSShouldRetainWithZone(NSObject *anObject, NSZone *requestedZone) { if (!requestedZone || [anObject zone] == requestedZone) @@ -282,6 +286,15 @@ BOOL NSDecrementExtraRefCountWasZero(id anObject) - autorelease { + if (double_release_check_enabled) + { + unsigned release_count; + unsigned retain_count = [self retainCount]; + release_count = [autorelease_class autoreleaseCountForObject:self]; + if (release_count > retain_count) + [self error:"Autorelease would release object too many times."]; + } + [autorelease_class addObject:self]; return self; } @@ -352,6 +365,15 @@ BOOL NSDecrementExtraRefCountWasZero(id anObject) - (oneway void) release { + if (double_release_check_enabled) + { + unsigned release_count; + unsigned retain_count = [self retainCount]; + release_count = [autorelease_class autoreleaseCountForObject:self]; + if (release_count > retain_count) + [self error:"Release would release object too many times."]; + } + if (NSDecrementExtraRefCountWasZero(self)) [self dealloc]; return; @@ -545,6 +567,11 @@ BOOL NSDecrementExtraRefCountWasZero(id anObject) return autorelease_class; } ++ (void) enableDoubleReleaseCheck: (BOOL)enable +{ + double_release_check_enabled = enable; +} + - (int)compare:anotherObject; { if ([self isEqual:anotherObject])