mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
More GC updates
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@4958 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
18f87db0c7
commit
78e6f68250
5 changed files with 125 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
|||
Wed Sep 29 15:33:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||
|
||||
* Source/NSObject.m: More GC updates
|
||||
* Source/NSZone.m: ditto
|
||||
* Source/mframe.m: ditto
|
||||
* Source/objc-gnu2next.m: ditto
|
||||
|
||||
Tue Sep 28 20:54:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
|
||||
|
||||
* Source/NSArray.m: Tidy for GC stuff
|
||||
|
|
|
@ -272,6 +272,9 @@ NSExtraRefCount (id anObject)
|
|||
*/
|
||||
#if GS_WITH_GC
|
||||
|
||||
#include <gc.h>
|
||||
#include <gc_typed.h>
|
||||
|
||||
inline NSZone *
|
||||
fastZone(NSObject *object)
|
||||
{
|
||||
|
@ -294,8 +297,26 @@ NSAllocateObject(Class aClass, unsigned extraBytes, NSZone *zone)
|
|||
id new = nil;
|
||||
int size = aClass->instance_size + extraBytes;
|
||||
|
||||
if (CLS_ISCLASS(aClass))
|
||||
new = NSZoneMalloc(zone, size);
|
||||
NSCAssert((CLS_ISCLASS(aClass)), @"Bad class for new object");
|
||||
if (zone == GSAtomicMallocZone())
|
||||
{
|
||||
new = NSZoneMalloc(zone, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
GC_descr gc_type = aClass->gc_object_type;
|
||||
|
||||
if (gc_type == 0)
|
||||
{
|
||||
new = NSZoneMalloc(zone, size);
|
||||
NSLog(@"No garbage collection information for '%s'", aClass->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
new = GC_CALLOC_EXPLICTLY_TYPED(1, size, gc_type);
|
||||
}
|
||||
}
|
||||
|
||||
if (new != nil)
|
||||
{
|
||||
memset(new, 0, size);
|
||||
|
|
|
@ -1758,6 +1758,8 @@ NSZoneStats (NSZone *zone)
|
|||
|
||||
#else
|
||||
|
||||
#include <gc.h>
|
||||
|
||||
/*
|
||||
* Dummy zones used with garbage collection.
|
||||
* The 'atomic' zone is for memory that will be assumed not to contain
|
||||
|
@ -1775,5 +1777,89 @@ static NSZone atomic_zone =
|
|||
};
|
||||
NSZone* __nszone_private_hidden_atomic_zone = &atomic_zone;
|
||||
|
||||
NSZone* NSCreateZone (size_t start, size_t gran, BOOL canFree)
|
||||
{ return __nszone_private_hidden_default_zone; }
|
||||
|
||||
NSZone* NSDefaultMallocZone (void)
|
||||
{ return __nszone_private_hidden_default_zone; }
|
||||
|
||||
NSZone* GSAtomicMallocZone (void)
|
||||
{ return __nszone_private_hidden_atomic_zone; }
|
||||
|
||||
NSZone* NSZoneFromPointer (void *ptr)
|
||||
{ return __nszone_private_hidden_default_zone; }
|
||||
|
||||
void* NSZoneMalloc (NSZone *zone, size_t size)
|
||||
{
|
||||
void *ptr;
|
||||
|
||||
if (zone == GSAtomicMallocZone())
|
||||
ptr = (void*)GC_MALLOC_ATOMIC(size);
|
||||
else
|
||||
ptr = (void*)GC_MALLOC(size);
|
||||
|
||||
if (ptr == 0)
|
||||
ptr = GSOutOfMemory(size, YES);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* NSZoneCalloc (NSZone *zone, size_t elems, size_t bytes)
|
||||
{
|
||||
size_t size = elems * bytes;
|
||||
void *ptr;
|
||||
|
||||
if (zone == __nszone_private_hidden_atomic_zone)
|
||||
ptr = (void*)GC_MALLOC_ATOMIC(size);
|
||||
else
|
||||
ptr = (void*)GC_MALLOC(size);
|
||||
|
||||
if (ptr == 0)
|
||||
ptr = GSOutOfMemory(size, NO);
|
||||
memset(ptr, '\0', size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* NSZoneRealloc (NSZone *zone, void *ptr, size_t size)
|
||||
{
|
||||
ptr = GC_REALLOC(ptr, size);
|
||||
if (ptr == 0)
|
||||
GSOutOfMemory(size, NO);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void NSRecycleZone (NSZone *zone)
|
||||
{
|
||||
}
|
||||
|
||||
void NSZoneFree (NSZone *zone, void *ptr)
|
||||
{
|
||||
GC_FREE(ptr);
|
||||
}
|
||||
|
||||
void NSSetZoneName (NSZone *zone, NSString *name)
|
||||
{
|
||||
}
|
||||
|
||||
NSString* NSZoneName (NSZone *zone)
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
void* NSZoneMallocAtomic (NSZone *zone, size_t size)
|
||||
{
|
||||
return NSZoneMalloc(GSAtomicMallocZone(), size);
|
||||
}
|
||||
|
||||
BOOL NSZoneCheck (NSZone *zone)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
struct NSZoneStats NSZoneStats (NSZone *zone)
|
||||
{
|
||||
struct NSZoneStats stats = { 0 };
|
||||
return stats;
|
||||
}
|
||||
|
||||
#endif /* GS_WITH_GC */
|
||||
|
||||
|
|
|
@ -218,6 +218,9 @@ mframe_next_arg(const char *typePtr, NSArgumentInfo *info)
|
|||
case _C_BYREF: info->qual |= _F_BYREF; break;
|
||||
#endif
|
||||
case _C_ONEWAY: info->qual |= _F_ONEWAY; break;
|
||||
#ifdef _C_GCINVISIBLE
|
||||
case _C_GCINVISIBLE: info->qual |= _F_GCINVISIBLE; break;
|
||||
#endif
|
||||
default: flag = NO;
|
||||
}
|
||||
if (flag)
|
||||
|
|
|
@ -304,6 +304,9 @@ objc_skip_type_qualifiers (const char* type)
|
|||
|| *type == _C_BYCOPY
|
||||
#ifdef _C_BYREF
|
||||
|| *type == _C_BYREF
|
||||
#endif
|
||||
#ifdef _C_GCINVISIBLE
|
||||
|| *type == _C_GCINVISIBLE
|
||||
#endif
|
||||
|| *type == _C_ONEWAY)
|
||||
{
|
||||
|
@ -431,6 +434,9 @@ objc_get_type_qualifiers (const char* type)
|
|||
case _C_BYREF: res |= _F_BYREF; break;
|
||||
#endif
|
||||
case _C_ONEWAY: res |= _F_ONEWAY; break;
|
||||
#ifdef _C_GCINVISIBLE
|
||||
case _C_GCINVISIBLE: res |= _F_GCINVISIBLE; break;
|
||||
#endif
|
||||
default: flag = NO;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue