1// TEST_CONFIG 2// rdar://8052003 rdar://8077031 3 4#include "test.h" 5 6#include <malloc/malloc.h> 7#include <objc/runtime.h> 8 9// add SELCOUNT methods to each of CLASSCOUNT classes 10#define CLASSCOUNT 100 11#define SELCOUNT 200 12 13int main() 14{ 15 int i, j; 16 malloc_statistics_t start, end; 17 18 Class root; 19 root = objc_allocateClassPair(NULL, "Root", 0); 20 objc_registerClassPair(root); 21 22 Class classes[CLASSCOUNT]; 23 for (i = 0; i < CLASSCOUNT; i++) { 24 char *classname; 25 asprintf(&classname, "GrP_class_%d", i); 26 classes[i] = objc_allocateClassPair(root, classname, 0); 27 objc_registerClassPair(classes[i]); 28 free(classname); 29 } 30 31 SEL selectors[SELCOUNT]; 32 for (i = 0; i < SELCOUNT; i++) { 33 char *selname; 34 asprintf(&selname, "GrP_sel_%d", i); 35 selectors[i] = sel_registerName(selname); 36 free(selname); 37 } 38 39 malloc_zone_statistics(NULL, &start); 40 41 for (i = 0; i < CLASSCOUNT; i++) { 42 for (j = 0; j < SELCOUNT; j++) { 43 class_addMethod(classes[i], selectors[j], (IMP)main, ""); 44 } 45 } 46 47 malloc_zone_statistics(NULL, &end); 48 49 // expected: 3-word method struct plus two other words 50 ssize_t expected = (sizeof(void*) * (3+2)) * SELCOUNT * CLASSCOUNT; 51 ssize_t actual = end.size_in_use - start.size_in_use; 52 testassert(actual < expected * 3); // allow generous fudge factor 53 54 succeed(__FILE__); 55} 56 57