// // ClassFileSystem.m // RuntimeFS // // Created by Bill Bumgarner on 1/9/08. // Copyright 2008 Bill Bumgarner. All rights reserved. // #import "ClassFileSystem.h" #import @implementation ClassFileSystem - (BOOL) scanClass: (Class) aClass { Class aClassSuperclass = class_getSuperclass(aClass); NSString *className = NSStringFromClass(aClass); NSMutableDictionary *classInformation = [classInformationByClassName objectForKey: className]; if (!classInformation) { classInformation = [NSMutableDictionary dictionaryWithObjectsAndKeys: className, @"ClassName", nil]; [classInformationByClassName setObject: classInformation forKey: className]; NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObjectsAndKeys: NSFileTypeDirectory, NSFileType, nil]; [classInformation setObject: attributes forKey: @"Attributes"]; } if (!aClassSuperclass) { return YES; } else { [self scanClass: aClassSuperclass]; NSString *superclassName = NSStringFromClass(aClassSuperclass); [classInformation setObject: superclassName forKey: @"SuperclassName"]; NSMutableDictionary *superclassInfoDict = [classInformationByClassName objectForKey: superclassName]; NSMutableSet *subclassSet = [superclassInfoDict objectForKey: @"SubclassNames"]; if (!subclassSet) { subclassSet = [NSMutableSet set]; [superclassInfoDict setObject: subclassSet forKey: @"SubclassNames"]; } [subclassSet addObject: className]; return NO; } } - (NSSet *) scanClassesInRuntime { int numClasses; Class * classes = NULL; classInformationByClassName = [NSMutableDictionary dictionary]; NSMutableSet *rootClassNames = [NSMutableSet set]; classes = NULL; numClasses = objc_getClassList(NULL, 0); if( numClasses > 0 ) { classes = malloc( sizeof(Class) * numClasses ); (void) objc_getClassList( classes, numClasses ); int i; for(i=0;i