note description: "Map Objective-C classes (including private ones) to Eiffel classes." date: "$Date$" revision: "$Revision$" class CLASSES_MAPPER create make feature {NONE} -- Initialization make -- Initialize `Current'. do create mapping.make (4096) end feature -- Access mapping: HASH_TABLE [STRING, POINTER] -- A (Objective-C Class Object) -> (Objective-C Class Name) mapping. feature -- Computation compute_mapping -- Compute `mapping'. local managed_pointer: MANAGED_POINTER c_mapping: POINTER count: INTEGER i: INTEGER class_object: POINTER string_pointer: POINTER c_string: C_STRING pointer_bytes: INTEGER do pointer_bytes := {PLATFORM}.pointer_bytes c_mapping := objc_get_mapping ($count) create managed_pointer.own_from_pointer (c_mapping, count * pointer_bytes) from i := 0 until i >= count loop class_object := managed_pointer.read_pointer (i * pointer_bytes) string_pointer := managed_pointer.read_pointer ((i + 1) * pointer_bytes) if string_pointer /= default_pointer then create c_string.make_shared_from_pointer (string_pointer) mapping.put (c_string.string, class_object) end i := i + 2 end end feature {NONE} -- Externals objc_get_mapping (out_count: POINTER): POINTER -- Build a (Objective-C Class Object) -> (Objective-C Class Name) mapping. -- Note that some Mac OS X frameworks declare cluster classes. Cluster classes -- are abstract classes that declare an interface to be implemented by private classes. -- When a cluster class is instantiated, the actual instance returned isn't an object -- of the type of the cluster class, but an instance of a private class. -- Example: -- NSString *aString = [[NSString alloc] initWithString:@"A String"] -- the actual type of "aString" in this case will be NSCFString. -- The mapping generated by this function takes care of all such cases. -- Concretely, for the example above, the mapping would be: -- (NSString class object) -> "NSString" -- (NSCFString class object) -> "NSString" -- I.e. private classes are mapped to the cluster class name they belong to. -- `out_count' must be a pointer to an integer. After execution of this function -- it will contain the total number of elements returned in the array. -- The array has the following format: -- [a_objc_class_object, a_objc_class_name, a_objc_class_object2, a_objc_class_name2, ...]. external "C inline use , " alias "[ int parsed_classes_count = 360; Class parsed_classes[parsed_classes_count]; // Initialization Example: parsed_classes[0] = objc_getClass("NSExample"); parsed_classes[0] = objc_getClass("NSObject"); parsed_classes[1] = objc_getClass("NSEnumerator"); parsed_classes[2] = objc_getClass("NSValue"); parsed_classes[3] = objc_getClass("NSNumber"); parsed_classes[4] = objc_getClass("NSArray"); parsed_classes[5] = objc_getClass("NSMutableArray"); parsed_classes[6] = objc_getClass("NSAutoreleasePool"); parsed_classes[7] = objc_getClass("NSBundle"); parsed_classes[8] = objc_getClass("NSDate"); parsed_classes[9] = objc_getClass("NSCalendar"); parsed_classes[10] = objc_getClass("NSDateComponents"); parsed_classes[11] = objc_getClass("NSString"); parsed_classes[12] = objc_getClass("NSMutableString"); parsed_classes[13] = objc_getClass("NSSimpleCString"); parsed_classes[14] = objc_getClass("NSConstantString"); parsed_classes[15] = objc_getClass("NSCharacterSet"); parsed_classes[16] = objc_getClass("NSMutableCharacterSet"); parsed_classes[17] = objc_getClass("NSCoder"); parsed_classes[18] = objc_getClass("NSData"); parsed_classes[19] = objc_getClass("NSMutableData"); parsed_classes[20] = objc_getClass("NSPurgeableData"); parsed_classes[21] = objc_getClass("NSFormatter"); parsed_classes[22] = objc_getClass("NSDateFormatter"); parsed_classes[23] = objc_getClass("NSScanner"); parsed_classes[24] = objc_getClass("NSDictionary"); parsed_classes[25] = objc_getClass("NSMutableDictionary"); parsed_classes[26] = objc_getClass("NSDecimalNumber"); parsed_classes[27] = objc_getClass("NSDecimalNumberHandler"); parsed_classes[28] = objc_getClass("NSError"); parsed_classes[29] = objc_getClass("NSException"); parsed_classes[30] = objc_getClass("NSAssertionHandler"); parsed_classes[31] = objc_getClass("NSFileHandle"); parsed_classes[32] = objc_getClass("NSPipe"); parsed_classes[33] = objc_getClass("NSFileManager"); parsed_classes[34] = objc_getClass("NSDirectoryEnumerator"); parsed_classes[35] = objc_getClass("NSIndexPath"); parsed_classes[36] = objc_getClass("NSIndexSet"); parsed_classes[37] = objc_getClass("NSMutableIndexSet"); parsed_classes[38] = objc_getClass("NSInvocation"); parsed_classes[39] = objc_getClass("NSSet"); parsed_classes[40] = objc_getClass("NSMutableSet"); parsed_classes[41] = objc_getClass("NSCountedSet"); parsed_classes[42] = objc_getClass("NSPropertyListSerialization"); parsed_classes[43] = objc_getClass("NSKeyedArchiver"); parsed_classes[44] = objc_getClass("NSKeyedUnarchiver"); parsed_classes[45] = objc_getClass("NSLocale"); parsed_classes[46] = objc_getClass("NSLock"); parsed_classes[47] = objc_getClass("NSConditionLock"); parsed_classes[48] = objc_getClass("NSRecursiveLock"); parsed_classes[49] = objc_getClass("NSCondition"); parsed_classes[50] = objc_getClass("NSMethodSignature"); parsed_classes[51] = objc_getClass("NSNotification"); parsed_classes[52] = objc_getClass("NSNotificationCenter"); parsed_classes[53] = objc_getClass("NSNotificationQueue"); parsed_classes[54] = objc_getClass("NSNull"); parsed_classes[55] = objc_getClass("NSNumberFormatter"); parsed_classes[56] = objc_getClass("NSPort"); parsed_classes[57] = objc_getClass("NSMachPort"); parsed_classes[58] = objc_getClass("NSMessagePort"); parsed_classes[59] = objc_getClass("NSSocketPort"); parsed_classes[60] = objc_getClass("NSProcessInfo"); parsed_classes[61] = objc_getClass("NSProxy"); parsed_classes[62] = objc_getClass("NSRunLoop"); parsed_classes[63] = objc_getClass("NSSortDescriptor"); parsed_classes[64] = objc_getClass("NSStream"); parsed_classes[65] = objc_getClass("NSInputStream"); parsed_classes[66] = objc_getClass("NSOutputStream"); parsed_classes[67] = objc_getClass("NSThread"); parsed_classes[68] = objc_getClass("NSTimeZone"); parsed_classes[69] = objc_getClass("NSTimer"); parsed_classes[70] = objc_getClass("NSURLHandle"); parsed_classes[71] = objc_getClass("NSURL"); parsed_classes[72] = objc_getClass("NSUserDefaults"); parsed_classes[73] = objc_getClass("NSOperation"); parsed_classes[74] = objc_getClass("NSBlockOperation"); parsed_classes[75] = objc_getClass("NSInvocationOperation"); parsed_classes[76] = objc_getClass("NSOperationQueue"); parsed_classes[77] = objc_getClass("NSHTTPCookie"); parsed_classes[78] = objc_getClass("NSHTTPCookieStorage"); parsed_classes[79] = objc_getClass("NSNetService"); parsed_classes[80] = objc_getClass("NSNetServiceBrowser"); parsed_classes[81] = objc_getClass("NSURLAuthenticationChallenge"); parsed_classes[82] = objc_getClass("NSCachedURLResponse"); parsed_classes[83] = objc_getClass("NSURLCache"); parsed_classes[84] = objc_getClass("NSURLConnection"); parsed_classes[85] = objc_getClass("NSURLCredential"); parsed_classes[86] = objc_getClass("NSURLCredentialStorage"); parsed_classes[87] = objc_getClass("NSURLProtectionSpace"); parsed_classes[88] = objc_getClass("NSURLProtocol"); parsed_classes[89] = objc_getClass("NSURLRequest"); parsed_classes[90] = objc_getClass("NSMutableURLRequest"); parsed_classes[91] = objc_getClass("NSURLResponse"); parsed_classes[92] = objc_getClass("NSHTTPURLResponse"); parsed_classes[93] = objc_getClass("NSXMLParser"); parsed_classes[94] = objc_getClass("NSArchiver"); parsed_classes[95] = objc_getClass("NSUnarchiver"); parsed_classes[96] = objc_getClass("NSConnection"); parsed_classes[97] = objc_getClass("NSDistantObjectRequest"); parsed_classes[98] = objc_getClass("NSDistantObject"); parsed_classes[99] = objc_getClass("NSDistributedNotificationCenter"); parsed_classes[100] = objc_getClass("NSPortCoder"); parsed_classes[101] = objc_getClass("NSPortMessage"); parsed_classes[102] = objc_getClass("NSPortNameServer"); parsed_classes[103] = objc_getClass("NSMachBootstrapServer"); parsed_classes[104] = objc_getClass("NSMessagePortNameServer"); parsed_classes[105] = objc_getClass("NSSocketPortNameServer"); parsed_classes[106] = objc_getClass("NSProtocolChecker"); parsed_classes[107] = objc_getClass("NSTask"); parsed_classes[108] = objc_getClass("NSXMLNode"); parsed_classes[109] = objc_getClass("NSXMLDTD"); parsed_classes[110] = objc_getClass("NSXMLDTDNode"); parsed_classes[111] = objc_getClass("NSXMLDocument"); parsed_classes[112] = objc_getClass("NSXMLElement"); parsed_classes[113] = objc_getClass("NSAffineTransform"); parsed_classes[114] = objc_getClass("NSAppleEventDescriptor"); parsed_classes[115] = objc_getClass("NSAppleEventManager"); parsed_classes[116] = objc_getClass("NSAppleScript"); parsed_classes[117] = objc_getClass("NSAttributedString"); parsed_classes[118] = objc_getClass("NSMutableAttributedString"); parsed_classes[119] = objc_getClass("NSCache"); parsed_classes[120] = objc_getClass("NSCalendarDate"); parsed_classes[121] = objc_getClass("NSClassDescription"); parsed_classes[122] = objc_getClass("NSPredicate"); parsed_classes[123] = objc_getClass("NSComparisonPredicate"); parsed_classes[124] = objc_getClass("NSCompoundPredicate"); parsed_classes[125] = objc_getClass("NSDistributedLock"); parsed_classes[126] = objc_getClass("NSExpression"); parsed_classes[127] = objc_getClass("NSGarbageCollector"); parsed_classes[128] = objc_getClass("NSPointerFunctions"); parsed_classes[129] = objc_getClass("NSHashTable"); parsed_classes[130] = objc_getClass("NSHost"); parsed_classes[131] = objc_getClass("NSMapTable"); parsed_classes[132] = objc_getClass("NSMetadataQuery"); parsed_classes[133] = objc_getClass("NSMetadataItem"); parsed_classes[134] = objc_getClass("NSMetadataQueryAttributeValueTuple"); parsed_classes[135] = objc_getClass("NSMetadataQueryResultGroup"); parsed_classes[136] = objc_getClass("NSOrthography"); parsed_classes[137] = objc_getClass("NSPointerArray"); parsed_classes[138] = objc_getClass("NSScriptClassDescription"); parsed_classes[139] = objc_getClass("NSScriptCoercionHandler"); parsed_classes[140] = objc_getClass("NSScriptCommand"); parsed_classes[141] = objc_getClass("NSScriptCommandDescription"); parsed_classes[142] = objc_getClass("NSScriptExecutionContext"); parsed_classes[143] = objc_getClass("NSScriptObjectSpecifier"); parsed_classes[144] = objc_getClass("NSIndexSpecifier"); parsed_classes[145] = objc_getClass("NSMiddleSpecifier"); parsed_classes[146] = objc_getClass("NSNameSpecifier"); parsed_classes[147] = objc_getClass("NSPositionalSpecifier"); parsed_classes[148] = objc_getClass("NSPropertySpecifier"); parsed_classes[149] = objc_getClass("NSRandomSpecifier"); parsed_classes[150] = objc_getClass("NSRangeSpecifier"); parsed_classes[151] = objc_getClass("NSRelativeSpecifier"); parsed_classes[152] = objc_getClass("NSUniqueIDSpecifier"); parsed_classes[153] = objc_getClass("NSWhoseSpecifier"); parsed_classes[154] = objc_getClass("NSCloneCommand"); parsed_classes[155] = objc_getClass("NSCloseCommand"); parsed_classes[156] = objc_getClass("NSCountCommand"); parsed_classes[157] = objc_getClass("NSCreateCommand"); parsed_classes[158] = objc_getClass("NSDeleteCommand"); parsed_classes[159] = objc_getClass("NSExistsCommand"); parsed_classes[160] = objc_getClass("NSGetCommand"); parsed_classes[161] = objc_getClass("NSMoveCommand"); parsed_classes[162] = objc_getClass("NSQuitCommand"); parsed_classes[163] = objc_getClass("NSSetCommand"); parsed_classes[164] = objc_getClass("NSScriptSuiteRegistry"); parsed_classes[165] = objc_getClass("NSScriptWhoseTest"); parsed_classes[166] = objc_getClass("NSLogicalTest"); parsed_classes[167] = objc_getClass("NSSpecifierTest"); parsed_classes[168] = objc_getClass("NSTextCheckingResult"); parsed_classes[169] = objc_getClass("NSSpellServer"); parsed_classes[170] = objc_getClass("NSURLDownload"); parsed_classes[171] = objc_getClass("NSUndoManager"); parsed_classes[172] = objc_getClass("NSValueTransformer"); parsed_classes[173] = objc_getClass("NSGraphicsContext"); parsed_classes[174] = objc_getClass("NSResponder"); parsed_classes[175] = objc_getClass("NSAnimation"); parsed_classes[176] = objc_getClass("NSViewAnimation"); parsed_classes[177] = objc_getClass("NSView"); parsed_classes[178] = objc_getClass("NSText"); parsed_classes[179] = objc_getClass("NSTextTab"); parsed_classes[180] = objc_getClass("NSParagraphStyle"); parsed_classes[181] = objc_getClass("NSMutableParagraphStyle"); parsed_classes[182] = objc_getClass("NSWorkspace"); parsed_classes[183] = objc_getClass("NSRunningApplication"); parsed_classes[184] = objc_getClass("NSApplication"); parsed_classes[185] = objc_getClass("NSCell"); parsed_classes[186] = objc_getClass("NSActionCell"); parsed_classes[187] = objc_getClass("NSAlert"); parsed_classes[188] = objc_getClass("NSAnimationContext"); parsed_classes[189] = objc_getClass("NSBox"); parsed_classes[190] = objc_getClass("NSControl"); parsed_classes[191] = objc_getClass("NSButtonCell"); parsed_classes[192] = objc_getClass("NSButton"); parsed_classes[193] = objc_getClass("NSClipView"); parsed_classes[194] = objc_getClass("NSDockTile"); parsed_classes[195] = objc_getClass("NSFont"); parsed_classes[196] = objc_getClass("NSFontDescriptor"); parsed_classes[197] = objc_getClass("NSFontManager"); parsed_classes[198] = objc_getClass("NSWindow"); parsed_classes[199] = objc_getClass("NSPanel"); parsed_classes[200] = objc_getClass("NSFontPanel"); parsed_classes[201] = objc_getClass("NSMatrix"); parsed_classes[202] = objc_getClass("NSForm"); parsed_classes[203] = objc_getClass("NSFormCell"); parsed_classes[204] = objc_getClass("NSMenuItem"); parsed_classes[205] = objc_getClass("NSMenu"); parsed_classes[206] = objc_getClass("NSPasteboard"); parsed_classes[207] = objc_getClass("CIVector"); parsed_classes[208] = objc_getClass("CIColor"); parsed_classes[209] = objc_getClass("NSColor"); parsed_classes[210] = objc_getClass("NSColorSpace"); parsed_classes[211] = objc_getClass("NSImageRep"); parsed_classes[212] = objc_getClass("NSBitmapImageRep"); parsed_classes[213] = objc_getClass("NSViewController"); parsed_classes[214] = objc_getClass("NSBrowser"); parsed_classes[215] = objc_getClass("NSBrowserCell"); parsed_classes[216] = objc_getClass("NSCachedImageRep"); parsed_classes[217] = objc_getClass("CIImage"); parsed_classes[218] = objc_getClass("NSCIImageRep"); parsed_classes[219] = objc_getClass("NSColorList"); parsed_classes[220] = objc_getClass("NSColorPanel"); parsed_classes[221] = objc_getClass("NSColorPicker"); parsed_classes[222] = objc_getClass("NSColorWell"); parsed_classes[223] = objc_getClass("NSCursor"); parsed_classes[224] = objc_getClass("NSCustomImageRep"); parsed_classes[225] = objc_getClass("NSDocument"); parsed_classes[226] = objc_getClass("NSDocumentController"); parsed_classes[227] = objc_getClass("NSEPSImageRep"); parsed_classes[228] = objc_getClass("NSTouch"); parsed_classes[229] = objc_getClass("NSEvent"); parsed_classes[230] = objc_getClass("NSFileWrapper"); parsed_classes[231] = objc_getClass("NSHelpManager"); parsed_classes[232] = objc_getClass("NSGradient"); parsed_classes[233] = objc_getClass("NSImage"); parsed_classes[234] = objc_getClass("NSImageCell"); parsed_classes[235] = objc_getClass("NSImageView"); parsed_classes[236] = objc_getClass("NSNib"); parsed_classes[237] = objc_getClass("NSPrinter"); parsed_classes[238] = objc_getClass("NSSpeechRecognizer"); parsed_classes[239] = objc_getClass("NSSpeechSynthesizer"); parsed_classes[240] = objc_getClass("NSSpellChecker"); parsed_classes[241] = objc_getClass("NSSplitView"); parsed_classes[242] = objc_getClass("NSSavePanel"); parsed_classes[243] = objc_getClass("NSOpenPanel"); parsed_classes[244] = objc_getClass("NSPageLayout"); parsed_classes[245] = objc_getClass("NSPasteboardItem"); parsed_classes[246] = objc_getClass("NSMenuItemCell"); parsed_classes[247] = objc_getClass("NSPopUpButton"); parsed_classes[248] = objc_getClass("NSPrintInfo"); parsed_classes[249] = objc_getClass("NSPrintOperation"); parsed_classes[250] = objc_getClass("NSPrintPanel"); parsed_classes[251] = objc_getClass("NSScreen"); parsed_classes[252] = objc_getClass("NSScrollView"); parsed_classes[253] = objc_getClass("NSScroller"); parsed_classes[254] = objc_getClass("NSSegmentedControl"); parsed_classes[255] = objc_getClass("NSSegmentedCell"); parsed_classes[256] = objc_getClass("NSSliderCell"); parsed_classes[257] = objc_getClass("NSSlider"); parsed_classes[258] = objc_getClass("NSTextFieldCell"); parsed_classes[259] = objc_getClass("NSTextField"); parsed_classes[260] = objc_getClass("NSTextContainer"); parsed_classes[261] = objc_getClass("NSTokenFieldCell"); parsed_classes[262] = objc_getClass("NSTokenField"); parsed_classes[263] = objc_getClass("NSTrackingArea"); parsed_classes[264] = objc_getClass("NSWindowController"); parsed_classes[265] = objc_getClass("NSComboBox"); parsed_classes[266] = objc_getClass("NSComboBoxCell"); parsed_classes[267] = objc_getClass("NSTableColumn"); parsed_classes[268] = objc_getClass("NSTableHeaderCell"); parsed_classes[269] = objc_getClass("NSTableHeaderView"); parsed_classes[270] = objc_getClass("NSInputManager"); parsed_classes[271] = objc_getClass("NSTextAttachmentCell"); parsed_classes[272] = objc_getClass("NSTextAttachment"); parsed_classes[273] = objc_getClass("NSTextView"); parsed_classes[274] = objc_getClass("NSTableView"); parsed_classes[275] = objc_getClass("NSOutlineView"); parsed_classes[276] = objc_getClass("NSGlyphGenerator"); parsed_classes[277] = objc_getClass("NSLayoutManager"); parsed_classes[278] = objc_getClass("NSTextStorage"); parsed_classes[279] = objc_getClass("NSInputServer"); parsed_classes[280] = objc_getClass("NSRulerMarker"); parsed_classes[281] = objc_getClass("NSRulerView"); parsed_classes[282] = objc_getClass("NSSecureTextField"); parsed_classes[283] = objc_getClass("NSSecureTextFieldCell"); parsed_classes[284] = objc_getClass("NSProgressIndicator"); parsed_classes[285] = objc_getClass("NSTabView"); parsed_classes[286] = objc_getClass("NSTabViewItem"); parsed_classes[287] = objc_getClass("NSPopUpButtonCell"); parsed_classes[288] = objc_getClass("NSBezierPath"); parsed_classes[289] = objc_getClass("NSPICTImageRep"); parsed_classes[290] = objc_getClass("NSStatusBar"); parsed_classes[291] = objc_getClass("NSStatusItem"); parsed_classes[292] = objc_getClass("NSSound"); parsed_classes[293] = objc_getClass("NSMovie"); parsed_classes[294] = objc_getClass("NSPDFImageRep"); parsed_classes[295] = objc_getClass("NSDrawer"); parsed_classes[296] = objc_getClass("NSOpenGLPixelFormat"); parsed_classes[297] = objc_getClass("NSOpenGLPixelBuffer"); parsed_classes[298] = objc_getClass("NSOpenGLContext"); parsed_classes[299] = objc_getClass("CALayer"); parsed_classes[300] = objc_getClass("CAOpenGLLayer"); parsed_classes[301] = objc_getClass("NSOpenGLLayer"); parsed_classes[302] = objc_getClass("NSOpenGLView"); parsed_classes[303] = objc_getClass("NSToolbar"); parsed_classes[304] = objc_getClass("NSToolbarItem"); parsed_classes[305] = objc_getClass("NSToolbarItemGroup"); parsed_classes[306] = objc_getClass("NSStepper"); parsed_classes[307] = objc_getClass("NSStepperCell"); parsed_classes[308] = objc_getClass("NSGlyphInfo"); parsed_classes[309] = objc_getClass("NSShadow"); parsed_classes[310] = objc_getClass("NSTypesetter"); parsed_classes[311] = objc_getClass("NSATSTypesetter"); parsed_classes[312] = objc_getClass("NSSearchField"); parsed_classes[313] = objc_getClass("NSSearchFieldCell"); parsed_classes[314] = objc_getClass("NSController"); parsed_classes[315] = objc_getClass("NSObjectController"); parsed_classes[316] = objc_getClass("NSArrayController"); parsed_classes[317] = objc_getClass("NSDictionaryController"); parsed_classes[318] = objc_getClass("NSTreeNode"); parsed_classes[319] = objc_getClass("NSTreeController"); parsed_classes[320] = objc_getClass("NSUserDefaultsController"); parsed_classes[321] = objc_getClass("NSTextList"); parsed_classes[322] = objc_getClass("NSTextBlock"); parsed_classes[323] = objc_getClass("NSTextTableBlock"); parsed_classes[324] = objc_getClass("NSTextTable"); parsed_classes[325] = objc_getClass("NSDatePickerCell"); parsed_classes[326] = objc_getClass("NSDatePicker"); parsed_classes[327] = objc_getClass("NSLevelIndicatorCell"); parsed_classes[328] = objc_getClass("NSLevelIndicator"); parsed_classes[329] = objc_getClass("NSPersistentDocument"); parsed_classes[330] = objc_getClass("NSRuleEditor"); parsed_classes[331] = objc_getClass("NSPredicateEditor"); parsed_classes[332] = objc_getClass("NSPropertyDescription"); parsed_classes[333] = objc_getClass("NSAttributeDescription"); parsed_classes[334] = objc_getClass("NSPredicateEditorRowTemplate"); parsed_classes[335] = objc_getClass("NSPathCell"); parsed_classes[336] = objc_getClass("NSPathControl"); parsed_classes[337] = objc_getClass("NSPathComponentCell"); parsed_classes[338] = objc_getClass("NSCollectionViewItem"); parsed_classes[339] = objc_getClass("NSCollectionView"); parsed_classes[340] = objc_getClass("NSTextInputContext"); parsed_classes[341] = objc_getClass("NSEntityDescription"); parsed_classes[342] = objc_getClass("NSFetchedPropertyDescription"); parsed_classes[343] = objc_getClass("NSExpressionDescription"); parsed_classes[344] = objc_getClass("NSRelationshipDescription"); parsed_classes[345] = objc_getClass("NSFetchRequest"); parsed_classes[346] = objc_getClass("NSFetchRequestExpression"); parsed_classes[347] = objc_getClass("NSManagedObjectModel"); parsed_classes[348] = objc_getClass("NSManagedObject"); parsed_classes[349] = objc_getClass("NSManagedObjectID"); parsed_classes[350] = objc_getClass("NSManagedObjectContext"); parsed_classes[351] = objc_getClass("NSPersistentStoreCoordinator"); parsed_classes[352] = objc_getClass("NSPersistentStore"); parsed_classes[353] = objc_getClass("NSAtomicStoreCacheNode"); parsed_classes[354] = objc_getClass("NSAtomicStore"); parsed_classes[355] = objc_getClass("NSEntityMigrationPolicy"); parsed_classes[356] = objc_getClass("NSMappingModel"); parsed_classes[357] = objc_getClass("NSEntityMapping"); parsed_classes[358] = objc_getClass("NSPropertyMapping"); parsed_classes[359] = objc_getClass("NSMigrationManager"); int runtime_classes_count = objc_getClassList(NULL, 0); assert(runtime_classes_count > 0); Class *runtime_classes = malloc(sizeof(Class) * runtime_classes_count); objc_getClassList(runtime_classes, runtime_classes_count); void **mapping = malloc(2 * sizeof(void *) * runtime_classes_count); int i, j; Class runtime_class, superclass; BOOL found; for (i = 0; i < runtime_classes_count; i++) { runtime_class = runtime_classes[i]; mapping[2*i] = runtime_class; for (j = 0, found = NO; j < parsed_classes_count; j++) { if (runtime_class == parsed_classes[j]) { found = YES; break; } } if (found) { mapping[2*i + 1] = (void *)class_getName(runtime_class); } else { superclass = runtime_class; while (!found) { superclass = class_getSuperclass(superclass); if (superclass == nil) { break; } for (j = 0, found = NO; j < parsed_classes_count; j++) { if (superclass == parsed_classes[j]) { found = YES; break; } } } if (found) { mapping[2*i + 1] = (void *)class_getName(superclass); } else { // This is a private class and it is not part of any class cluster. mapping[2*i + 1] = NULL; } } } free(runtime_classes); *(int *)$out_count = 2 * runtime_classes_count; return mapping; ]" end end