struct objc_selector; struct objc_class; #ifndef OBJC_SUPER struct objc_super { struct objc_object *o; struct objc_object *superClass; }; #define OBJC_SUPER #endif #ifndef _REWRITER_typedef_Protocol typedef struct objc_object Protocol; #define _REWRITER_typedef_Protocol #endif extern struct objc_object *objc_msgSend(struct objc_object *, struct objc_selector *, ...); extern struct objc_object *objc_msgSendSuper(struct objc_super *, struct objc_selector *, ...); extern struct objc_object *objc_msgSend_stret(struct objc_object *, struct objc_selector *, ...); extern struct objc_object *objc_msgSendSuper_stret(struct objc_super *, struct objc_selector *, ...); extern struct objc_object *objc_msgSend_fpret(struct objc_object *, struct objc_selector *, ...); extern struct objc_object *objc_getClass(const char *); extern struct objc_object *objc_getMetaClass(const char *); extern void objc_exception_throw(struct objc_object *); extern void objc_exception_try_enter(void *); extern void objc_exception_try_exit(void *); extern struct objc_object *objc_exception_extract(void *); extern int objc_exception_match(struct objc_class *, struct objc_object *, ...); extern Protocol *objc_getProtocol(const char *); #include #ifndef __FASTENUMERATIONSTATE struct __objcFastEnumerationState { unsigned long state; id *itemsPtr; unsigned long *mutationsPtr; unsigned long extra[5]; }; #define __FASTENUMERATIONSTATE #endif // RUN: clang -rewrite-test %s | clang #ifndef _REWRITER_typedef_MyList #define _REWRITER_typedef_MyList typedef struct MyList MyList; #endif // - (id) allKeys; // @end // @implementation MyList static unsigned int _I_MyList_countByEnumeratingWithState_objects_count_(MyList * self, SEL _cmd, struct __objcFastEnumerationState * state, id * items, unsigned int stackcount) { return 0; } static id _I_MyList_allKeys(MyList * self, SEL _cmd) {} // @end // @interface MyList (BasicTest) // - (void)compilerTestAgainst; // @end int LOOP(); // @implementation MyList (BasicTest) static void _I_MyList_BasicTest_compilerTestAgainst(MyList * self, SEL _cmd) { MyList * el; { struct __objcFastEnumerationState enumState = { 0 }; id items[16]; id l_collection = (id) ((id (*)(id, SEL))(void *)objc_msgSend)((id)el, sel_registerName("allKeys")); unsigned long limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16); if (limit) { unsigned long startMutations = *enumState.mutationsPtr; do { unsigned long counter = 0; do { if (startMutations != *enumState.mutationsPtr) objc_enumerationMutation(l_collection); el = (MyList *)enumState.itemsPtr[counter++]; { LOOP(); }; __continue_label_1: ; } while (counter < limit); } while (limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16)); el = nil; __break_label_1: ; } else el = nil; } { id el1; struct __objcFastEnumerationState enumState = { 0 }; id items[16]; id l_collection = (id)((id (*)(id, SEL))(void *)objc_msgSend)((id)el, sel_registerName("allKeys")); unsigned long limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16); if (limit) { unsigned long startMutations = *enumState.mutationsPtr; do { unsigned long counter = 0; do { if (startMutations != *enumState.mutationsPtr) objc_enumerationMutation(l_collection); el1 = (id)enumState.itemsPtr[counter++]; { LOOP(); }; __continue_label_2: ; } while (counter < limit); } while (limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16)); el1 = nil; __break_label_2: ; } else el1 = nil; } { struct __objcFastEnumerationState enumState = { 0 }; id items[16]; id l_collection = (id)(((id (*)(id, SEL))(void *)objc_msgSend)((id)el, sel_registerName("allKeys"))); unsigned long limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16); if (limit) { unsigned long startMutations = *enumState.mutationsPtr; do { unsigned long counter = 0; do { if (startMutations != *enumState.mutationsPtr) objc_enumerationMutation(l_collection); el = (MyList *)enumState.itemsPtr[counter++]; { LOOP(); }; __continue_label_3: ; } while (counter < limit); } while (limit = ((unsigned int (*) (id, SEL, struct __objcFastEnumerationState *, id *, unsigned int))(void *)objc_msgSend) ((id)l_collection, sel_registerName("countByEnumeratingWithState:objects:count:"), &enumState, (id *)items, (unsigned int)16)); el = nil; __break_label_3: ; } else el = nil; } } // @end #include struct _objc_method { SEL _cmd; char *method_types; void *_imp; }; struct _objc_method_list { struct _objc_method_list *next_method; int method_count; struct _objc_method method_list[]; }; static struct _objc_method_list _OBJC_INSTANCE_METHODS_MyList __attribute__ ((section ("__OBJC, __inst_meth")))= { 0, 2 ,{{(SEL)"countByEnumeratingWithState:objects:count:", "I20@0:4^{__objcFastEnumerationState=}8^@12I16", _I_MyList_countByEnumeratingWithState_objects_count_} ,{(SEL)"allKeys", "@8@0:4", _I_MyList_allKeys} } }; struct _objc_class { struct _objc_class *isa; const char *super_class_name; char *name; long version; long info; long instance_size; struct _objc_ivar_list *ivars; struct _objc_method_list *methods; struct objc_cache *cache; struct _objc_protocol_list *protocols; const char *ivar_layout; struct _objc_class_ext *ext; }; static struct _objc_class _OBJC_METACLASS_MyList __attribute__ ((section ("__OBJC, __meta_class")))= { (struct _objc_class *)"MyList", 0, "MyList", 0,2, sizeof(struct _objc_class), 0, 0 ,0,0,0,0 }; static struct _objc_class _OBJC_CLASS_MyList __attribute__ ((section ("__OBJC, __class")))= { &_OBJC_METACLASS_MyList, 0, "MyList", 0,1,0,0, &_OBJC_INSTANCE_METHODS_MyList, 0 ,0,0,0 }; static struct _objc_method_list _OBJC_CATEGORY_INSTANCE_METHODS_MyList_BasicTest __attribute__ ((section ("__OBJC, __inst_meth")))= { 0, 1 ,{{(SEL)"compilerTestAgainst", "v8@0:4", _I_MyList_BasicTest_compilerTestAgainst} } }; struct _objc_category { char *category_name; char *class_name; struct _objc_method_list *instance_methods; struct _objc_method_list *class_methods; struct _objc_protocol_list *protocols; unsigned int size; struct _objc_property_list *instance_properties; }; static struct _objc_category _OBJC_CATEGORY_MyList_BasicTest __attribute__ ((section ("__OBJC, __category")))= { "BasicTest" , "MyList" , (struct _objc_method_list *)&_OBJC_CATEGORY_INSTANCE_METHODS_MyList_BasicTest , 0 , 0 , sizeof(struct _objc_category), 0 }; struct _objc_symtab { long sel_ref_cnt; SEL *refs; short cls_def_cnt; short cat_def_cnt; void *defs[2]; }; static struct _objc_symtab _OBJC_SYMBOLS __attribute__((section ("__OBJC, __symbols")))= { 0, 0, 1, 1 ,&_OBJC_CLASS_MyList ,&_OBJC_CATEGORY_MyList_BasicTest }; struct _objc_module { long version; long size; const char *name; struct _objc_symtab *symtab; }; static struct _objc_module _OBJC_MODULES __attribute__ ((section ("__OBJC, __module_info")))= { 7, sizeof(struct _objc_module), "", &_OBJC_SYMBOLS };