Author: mlytwyn
Date: Tue Sep 13 23:55:49 2016
New Revision: 40077
URL: http://svn.gna.org/viewcvs/gnustep?rev=40077&view=rev
Log:
Merges with base trunk revision 40072
Modified:
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSAutoreleasePool.h
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSEnumerator.h
libs/base/branches/gnustep_testplant_branch/Source/GSFastEnumeration.h
libs/base/branches/gnustep_testplant_branch/Source/NSAutoreleasePool.m
libs/base/branches/gnustep_testplant_branch/Source/NSEnumerator.m
Modified:
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSAutoreleasePool.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSAutoreleasePool.h?rev=40077&r1=40076&r2=40077&view=diff
==============================================================================
---
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSAutoreleasePool.h
(original)
+++
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSAutoreleasePool.h
Tue Sep 13 23:55:49 2016
@@ -307,7 +307,7 @@
* Default value is maxint.
* </p>
*/
-+ (void) setPoolCountThreshhold: (unsigned)c;
++ (void) setPoolCountThreshold: (unsigned)c;
/**
* Return the number of objects in this pool.
Modified:
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSEnumerator.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSEnumerator.h?rev=40077&r1=40076&r2=40077&view=diff
==============================================================================
---
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSEnumerator.h
(original)
+++
libs/base/branches/gnustep_testplant_branch/Headers/Foundation/NSEnumerator.h
Tue Sep 13 23:55:49 2016
@@ -1,4 +1,4 @@
-/*
+/*
NSEnumerator.h
Copyright (C) 1998 Free Software Foundation, Inc.
@@ -12,7 +12,7 @@
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
-
+
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
@@ -30,11 +30,14 @@
#import <Foundation/NSObject.h>
+
#if defined(__cplusplus)
extern "C" {
#endif
-typedef struct
+@class GS_GENERIC_CLASS(NSArray, ElementT);
+
+typedef struct
{
unsigned long state;
__unsafe_unretained id *itemsPtr;
@@ -43,14 +46,14 @@
} NSFastEnumerationState;
@protocol NSFastEnumeration
-- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state
+- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state
objects: (__unsafe_unretained id[])stackbuf
count: (NSUInteger)len;
@end
-@interface NSEnumerator : NSObject <NSFastEnumeration>
-- (NSArray *) allObjects;
-- (id) nextObject;
+@interface GS_GENERIC_CLASS(NSEnumerator, IterT) : NSObject <NSFastEnumeration>
+- (GS_GENERIC_CLASS(NSArray, IterT) *) allObjects;
+- (GS_GENERIC_TYPE(IterT)) nextObject;
@end
#if defined(__cplusplus)
Modified: libs/base/branches/gnustep_testplant_branch/Source/GSFastEnumeration.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Source/GSFastEnumeration.h?rev=40077&r1=40076&r2=40077&view=diff
==============================================================================
--- libs/base/branches/gnustep_testplant_branch/Source/GSFastEnumeration.h
(original)
+++ libs/base/branches/gnustep_testplant_branch/Source/GSFastEnumeration.h
Tue Sep 13 23:55:49 2016
@@ -1,38 +1,39 @@
#ifdef __clang__
#define FOR_IN(type, var, collection) \
- for (type var in collection)\
- {
+ for (type var in collection)\
+ {
#define END_FOR_IN(collection) }
#else
void objc_enumerationMutation(id);
#define FOR_IN(type, var, c) \
do\
{\
- type var;\
- NSFastEnumerationState gs_##c##_enumState = { 0 };\
- id gs_##c##_items[16];\
- unsigned long gs_##c##_limit = \
- [c countByEnumeratingWithState: &gs_##c##_enumState \
- objects: gs_##c##_items \
- count: 16];\
- if (gs_##c##_limit)\
- {\
- unsigned long gs_startMutations =
*gs_##c##_enumState.mutationsPtr;\
- do {\
- unsigned long gs_##c##counter = 0;\
- do {\
- if (gs_startMutations !=
*gs_##c##_enumState.mutationsPtr)\
- {\
- objc_enumerationMutation(c);\
- }\
- var =
gs_##c##_enumState.itemsPtr[gs_##c##counter++];\
+ type var;\
+ NSFastEnumerationState gs_##c##_enumState = { 0 };\
+ id gs_##c##_items[16];\
+ unsigned long gs_##c##_limit = \
+ [c countByEnumeratingWithState: &gs_##c##_enumState \
+ objects: gs_##c##_items \
+ count: 16];\
+ if (gs_##c##_limit)\
+ {\
+ unsigned long gs_startMutations = *gs_##c##_enumState.mutationsPtr;\
+ do {\
+ unsigned long gs_##c##counter = 0;\
+ do {\
+ if (gs_startMutations != *gs_##c##_enumState.mutationsPtr)\
+ {\
+ objc_enumerationMutation(c);\
+ }\
+ var = gs_##c##_enumState.itemsPtr[gs_##c##counter++];\
#define END_FOR_IN(c) \
- } while (gs_##c##counter < gs_##c##_limit);\
- } while ((gs_##c##_limit = [c countByEnumeratingWithState:
&gs_##c##_enumState\
- objects:
gs_##c##_items\
- count:
16]));\
- }\
+ } while (gs_##c##counter < gs_##c##_limit);\
+ } while ((gs_##c##_limit \
+ = [c countByEnumeratingWithState: &gs_##c##_enumState\
+ objects: gs_##c##_items\
+ count: 16]));\
+ }\
} while(0);
#endif
Modified: libs/base/branches/gnustep_testplant_branch/Source/NSAutoreleasePool.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Source/NSAutoreleasePool.m?rev=40077&r1=40076&r2=40077&view=diff
==============================================================================
--- libs/base/branches/gnustep_testplant_branch/Source/NSAutoreleasePool.m
(original)
+++ libs/base/branches/gnustep_testplant_branch/Source/NSAutoreleasePool.m
Tue Sep 13 23:55:49 2016
@@ -30,7 +30,6 @@
#define EXPOSE_NSAutoreleasePool_IVARS 1
#define EXPOSE_NSThread_IVARS 1
#import "Foundation/NSAutoreleasePool.h"
-#import "Foundation/NSGarbageCollector.h"
#import "Foundation/NSException.h"
#import "Foundation/NSThread.h"
@@ -42,183 +41,8 @@
# endif
#endif
-#if GS_WITH_GC || __OBJC_GC__
-
-#if __OBJC_GC__
-@interface GSAutoreleasePool : NSAutoreleasePool @end
-#endif
-
-@implementation NSAutoreleasePool
-
-static NSAutoreleasePool *pool = nil;
-
-#if GS_WITH_GC
-+ (void) initialize
-{
- pool = NSAllocateObject(self, 0, NSDefaultMallocZone());
- return;
-}
-
-+ (id) allocWithZone: (NSZone*)zone
-{
- return pool;
-}
-
-+ (id) new
-{
- return pool;
-}
-#endif
-#ifdef __OBJC_GC__
-
-static Class PoolClass;
-
-+ (void) initialize
-{
- if ([NSGarbageCollector defaultCollector])
- {
- pool = NSAllocateObject(self, 0, NSDefaultMallocZone());
- }
- else
- {
- PoolClass = [GSAutoreleasePool class];
- }
- return;
-}
-
-+ (id) allocWithZone: (NSZone*)zone
-{
- if (nil == pool)
- {
- return NSAllocateObject(PoolClass, 0, 0);
- }
- return pool;
-}
-
-+ (id) new
-{
- if (nil == pool)
- {
- return [NSAllocateObject(PoolClass, 0, 0) init];
- }
- return pool;
-}
-#endif
-
-- (id) init
-{
- return self;
-}
-
-- (unsigned) autoreleaseCount
-{
- return 0;
-}
-
-- (unsigned) autoreleaseCountForObject: (id)anObject
-{
- return 0;
-}
-
-+ (unsigned) autoreleaseCountForObject: (id)anObject
-{
- return 0;
-}
-
-+ (id) currentPool
-{
- return pool;
-}
-
-+ (void) addObject: (id)anObj
-{
- return;
-}
-
-- (void) addObject: (id)anObj
-{
- return;
-}
-
-- (void) drain
-{
- static NSGarbageCollector *collector = nil;
- static SEL sel;
- static IMP imp;
-
- if (collector == nil)
- {
- collector = [NSGarbageCollector defaultCollector];
- sel = @selector(collectIfNeeded);
- imp = [collector methodForSelector: sel];
- }
- (*imp)(collector, sel);
-}
-
-- (id) retain
-{
- [NSException raise: NSGenericException
- format: @"Don't call `-retain' on a NSAutoreleasePool"];
- return self;
-}
-
-- (oneway void) release
-{
- return;
-}
-
-- (void) dealloc
-{
- [NSException raise: NSGenericException
- format: @"dealloc should not be called in garbage collected mode"];
- GSNOSUPERDEALLOC;
- return;
-}
-
-- (void) emptyPool
-{
- return;
-}
-
-- (id) autorelease
-{
- [NSException raise: NSGenericException
- format: @"Don't call `-autorelease' on a NSAutoreleasePool"];
- return self;
-}
-
-+ (void) _endThread: (NSThread*)thread
-{
- return;
-}
-
-+ (void) enableRelease: (BOOL)enable
-{
- return;
-}
-
-+ (void) freeCache
-{
- return;
-}
-
-+ (void) setPoolCountThreshhold: (unsigned)c
-{
- return;
-}
-
-+ (void) setPoolNumberThreshhold: (unsigned)c
-{
- return;
-}
-
-@end
-
-#endif
-
-
-
-#if !GS_WITH_GC
+
+
/* When this is `NO', autoreleased objects are never actually recorded
in an NSAutoreleasePool, and are not sent a `release' message.
@@ -226,12 +50,12 @@
static BOOL autorelease_enabled = YES;
/* When the _released_count of a pool gets over this value, we raise
- an exception. This can be adjusted with +setPoolCountThreshhold */
-static unsigned pool_count_warning_threshhold = UINT_MAX;
+ an exception. This can be adjusted with +setPoolCountThreshold */
+static unsigned pool_count_warning_threshold = UINT_MAX-1;
/* When the number of pools in a thread gets over this value, we raise
- an exception. This can be adjusted with +setPoolNumberThreshhold */
-static unsigned pool_number_warning_threshhold = 10000;
+ an exception. This can be adjusted with +setPoolNumberThreshold */
+static unsigned pool_number_warning_threshold = 10000;
/* The size of the first _released array. */
#define BEGINNING_POOL_SIZE 32
@@ -302,11 +126,7 @@
}
-#if __OBJC_GC__
-@implementation GSAutoreleasePool
-#else
@implementation NSAutoreleasePool
-#endif
+ (void) initialize
{
@@ -319,9 +139,22 @@
+ (id) allocWithZone: (NSZone*)zone
{
struct autorelease_thread_vars *tv = ARP_THREAD_VARS;
+
if (tv->pool_cache_count)
- return pop_pool_from_cache (tv);
-
+ {
+ NSAutoreleasePool *p = pop_pool_from_cache (tv);
+
+ /* When we cache a 'deallocated' pool, we set its _released_count to
+ * UINT_MAX, so when we rtrieve it fromm the cache we must increment
+ * it to start with a count of zero.
+ */
+ if (++(p->_released_count) != 0)
+ {
+ [NSException raise: NSInternalInconsistencyException
+ format: @"NSAutoreleasePool corrupted pool in cache"];
+ }
+ return p;
+ }
return NSAllocateObject (self, 0, zone);
}
@@ -350,6 +183,7 @@
{
struct autorelease_thread_vars *tv = ARP_THREAD_VARS;
unsigned level = 0;
+
_parent = tv->current_pool;
if (_parent)
{
@@ -363,7 +197,7 @@
_parent->_child = self;
}
tv->current_pool = self;
- if (level > pool_number_warning_threshhold)
+ if (level > pool_number_warning_threshold)
{
[NSException raise: NSGenericException
format: @"Too many (%u) autorelease pools ... leaking them?", level];
@@ -462,7 +296,7 @@
_parent->_child = self;
}
tv->current_pool = self;
- if (level > pool_number_warning_threshhold)
+ if (level > pool_number_warning_threshold)
{
[NSException raise: NSGenericException
format: @"Too many (%u) autorelease pools ... leaking them?", level];
@@ -554,9 +388,11 @@
if (!autorelease_enabled)
return;
- if (_released_count >= pool_count_warning_threshhold)
- [NSException raise: NSGenericException
- format: @"AutoreleasePool count threshhold exceeded."];
+ if (_released_count >= pool_count_warning_threshold)
+ {
+ [NSException raise: NSGenericException
+ format: @"AutoreleasePool count threshold exceeded."];
+ }
/* Get a new array for the list, if the current one is full. */
while (_released->count == _released->size)
@@ -726,7 +562,14 @@
{
struct autorelease_thread_vars *tv = ARP_THREAD_VARS;
+ if (UINT_MAX == _released_count)
+ {
+ [NSException raise: NSInternalInconsistencyException
+ format: @"NSAutoreleasePool -dealloc of deallocated pool"];
+ }
+
[self emptyPool];
+ NSAssert(0 == _released_count, NSInternalInconsistencyException);
/* Remove self from the linked list of pools in use.
* We already know that we have deallocated any child (in -emptyPool),
@@ -744,6 +587,12 @@
_parent = nil;
}
+ /* Mark pool as cached so that any attempt to add an object to use it
+ * or to deallocate it again will raise an exception.
+ * We reset to zero when we get i out of the cache as a new allocation.
+ */
+ _released_count = UINT_MAX;
+
/* Don't deallocate ourself, just save us for later use. */
push_pool_to_cache (tv, self);
GSNOSUPERDEALLOC;
@@ -812,15 +661,16 @@
free_pool_cache(ARP_THREAD_VARS);
}
-+ (void) setPoolCountThreshhold: (unsigned)c
-{
- pool_count_warning_threshhold = c;
-}
-
-+ (void) setPoolNumberThreshhold: (unsigned)c
-{
- pool_number_warning_threshhold = c;
++ (void) setPoolCountThreshold: (unsigned)c
+{
+ if (c >= UINT_MAX) c = UINT_MAX - 1;
+ pool_count_warning_threshold = c;
+}
+
++ (void) setPoolNumberThreshold: (unsigned)c
+{
+ pool_number_warning_threshold = c;
}
@end
-#endif // !GS_WITH_GC
+
Modified: libs/base/branches/gnustep_testplant_branch/Source/NSEnumerator.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/branches/gnustep_testplant_branch/Source/NSEnumerator.m?rev=40077&r1=40076&r2=40077&view=diff
==============================================================================
--- libs/base/branches/gnustep_testplant_branch/Source/NSEnumerator.m
(original)
+++ libs/base/branches/gnustep_testplant_branch/Source/NSEnumerator.m Tue Sep
13 23:55:49 2016
@@ -104,7 +104,6 @@
*/
void objc_enumerationMutation(id obj)
{
- [NSException raise: NSGenericException
- format: @"Collection %@ was mutated while being
enumerated",
- obj];
+ [NSException raise: NSGenericException
+ format: @"Collection %@ was mutated while being enumerated", obj];
}
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs