2004-10-17 Matt Rice <ratmice@yahoo.com

* Source/objc-load.m (objc_load_module): resolve class links under GNU
        runtime
        * Headers/Additions/GNUstepBase/GSObjCRuntime.h
        * Source/Additions/GSObjCRuntime.m
        (GSObjCAllSubclassesOfClass,GSObjCDirectSubclassesOfClass):
        New functions.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@20234 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Matt Rice 2004-10-17 23:22:41 +00:00
parent bc5194f45f
commit 95954a9914
4 changed files with 69 additions and 1 deletions

View file

@ -1,3 +1,12 @@
2004-10-17 Matt Rice <ratmice@yahoo.com
* Source/objc-load.m (objc_load_module): resolve class links under GNU
runtime
* Headers/Additions/GNUstepBase/GSObjCRuntime.h
* Source/Additions/GSObjCRuntime.m
(GSObjCAllSubclassesOfClass,GSObjCDirectSubclassesOfClass):
New functions.
2004-10-05 Georg Fleischmann
* Source/NSCalendarDate.m [-initWithString:] Revert to previous

View file

@ -715,6 +715,12 @@ GSSetValue(NSObject *self, NSString *key, id val, SEL sel,
unsigned size,
int offset) GS_ATTRIB_DEPRECATED;
GS_EXPORT NSArray *
GSObjCAllSubclassesOfClass(Class cls);
GS_EXPORT NSArray *
GSObjCDirectSubclassesOfClass(Class cls);
/** ## deprecated ##
*/
GS_STATIC_INLINE const char*

View file

@ -2124,6 +2124,57 @@ GSObjCSetValue(NSObject *self, NSString *key, id val, SEL sel,
}
/** Returns an autoreleased array of subclasses of Class cls, including
* subclasses of subclasses. */
NSArray *GSObjCAllSubclassesOfClass(Class cls)
{
if (!cls)
{
return nil;
}
else
{
Class aClass;
NSMutableArray *result = [[NSMutableArray alloc] init];
#ifdef GNU_RUNTIME
for (aClass = cls->subclass_list; aClass; aClass=aClass->sibling_class)
{
[result addObject:aClass];
[result addObjectsFromArray: GSObjCAllSubclassesOfClass(aClass)];
}
#else
#warning not implemented for the NeXT_RUNTIME
#endif
return AUTORELEASE(result);
}
}
/** Returns an autoreleased array containing subclasses directly descendent of
* Class cls. */
NSArray *GSObjCDirectSubclassesOfClass(Class cls)
{
if (!cls)
{
return nil;
}
else
{
NSMutableArray *result=[[NSMutableArray alloc] init];
Class aClass;
#ifdef GNU_RUNTIME
for (aClass = cls->subclass_list;aClass;aClass=aClass->sibling_class)
{
[result addObject:aClass];
}
#else
#warning not implemented for the NeXT_RUNTIME
#endif
return AUTORELEASE(result);
}
}
void *
GSAutoreleasedBuffer(unsigned size)
{

View file

@ -152,6 +152,7 @@ objc_load_module (const char *filename,
#else
typedef void (*void_fn)();
dl_handle_t handle;
void __objc_resolve_class_links(void);
#if !defined(__ELF__) && !defined(CON_AUTOLOAD)
void_fn *ctor_list;
int i;
@ -218,10 +219,11 @@ objc_load_module (const char *filename,
}
#endif /* not __ELF__ */
__objc_resolve_class_links(); /* fill in subclass_list and sibling_class */
_objc_load_callback = 0;
_objc_load_load_callback = 0;
return 0;
#endif
#endif /* not NeXT_RUNTIME */
}
long