28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
registerSelectors(struct objc_category *category)
{
struct objc_method_list *iter;
unsigned int i;
for (iter = category->instanceMethods; iter != NULL; iter = iter->next)
for (i = 0; i < iter->count; i++)
objc_register_selector(&iter->methods[i].selector);
for (iter = category->classMethods; iter != NULL; iter = iter->next)
for (i = 0; i < iter->count; i++)
objc_register_selector(&iter->methods[i].selector);
}
static void
registerCategory(struct objc_category *category)
{
struct objc_category **categories;
Class class = objc_classname_to_class(category->className, false);
if (categoriesMap == NULL)
categoriesMap = objc_hashtable_new(
objc_hash_string, objc_equal_string, 2);
categories = (struct objc_category **)objc_hashtable_get(
categoriesMap, category->className);
if (categories != NULL) {
struct objc_category **newCategories;
size_t i;
|
|
|
|
|
|
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
registerSelectors(struct objc_category *category)
{
struct objc_method_list *iter;
unsigned int i;
for (iter = category->instanceMethods; iter != NULL; iter = iter->next)
for (i = 0; i < iter->count; i++)
objc_registerSelector(&iter->methods[i].selector);
for (iter = category->classMethods; iter != NULL; iter = iter->next)
for (i = 0; i < iter->count; i++)
objc_registerSelector(&iter->methods[i].selector);
}
static void
registerCategory(struct objc_category *category)
{
struct objc_category **categories;
Class class = objc_classnameToClass(category->className, false);
if (categoriesMap == NULL)
categoriesMap = objc_hashtable_new(
objc_string_hash, objc_string_equal, 2);
categories = (struct objc_category **)objc_hashtable_get(
categoriesMap, category->className);
if (categories != NULL) {
struct objc_category **newCategories;
size_t i;
|
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
newCategories[i] = category;
newCategories[i + 1] = NULL;
objc_hashtable_set(categoriesMap, category->className,
newCategories);
if (class != Nil && class->info & OBJC_CLASS_INFO_SETUP) {
objc_update_dtable(class);
objc_update_dtable(class->isa);
}
return;
}
if ((categories = malloc(2 * sizeof(*categories))) == NULL)
OBJC_ERROR("Not enough memory for category %s of class %s!\n",
category->categoryName, category->className);
categories[0] = category;
categories[1] = NULL;
objc_hashtable_set(categoriesMap, category->className, categories);
if (class != Nil && class->info & OBJC_CLASS_INFO_SETUP) {
objc_update_dtable(class);
objc_update_dtable(class->isa);
}
}
void
objc_register_all_categories(struct objc_symtab *symtab)
{
struct objc_category **categories =
(struct objc_category **)symtab->defs + symtab->classDefsCount;
for (size_t i = 0; i < symtab->categoryDefsCount; i++) {
registerSelectors(categories[i]);
registerCategory(categories[i]);
}
}
struct objc_category **
objc_categories_for_class(Class class)
{
if (categoriesMap == NULL)
return NULL;
return (struct objc_category **)objc_hashtable_get(categoriesMap,
class->name);
}
void
objc_unregister_all_categories(void)
{
if (categoriesMap == NULL)
return;
for (uint32_t i = 0; i < categoriesMap->size; i++)
if (categoriesMap->data[i] != NULL)
free((void *)categoriesMap->data[i]->object);
objc_hashtable_free(categoriesMap);
categoriesMap = NULL;
}
|
|
|
|
|
|
|
|
|
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
newCategories[i] = category;
newCategories[i + 1] = NULL;
objc_hashtable_set(categoriesMap, category->className,
newCategories);
if (class != Nil && class->info & OBJC_CLASS_INFO_SETUP) {
objc_updateDTable(class);
objc_updateDTable(class->isa);
}
return;
}
if ((categories = malloc(2 * sizeof(*categories))) == NULL)
OBJC_ERROR("Not enough memory for category %s of class %s!\n",
category->categoryName, category->className);
categories[0] = category;
categories[1] = NULL;
objc_hashtable_set(categoriesMap, category->className, categories);
if (class != Nil && class->info & OBJC_CLASS_INFO_SETUP) {
objc_updateDTable(class);
objc_updateDTable(class->isa);
}
}
void
objc_registerAllCategories(struct objc_symtab *symtab)
{
struct objc_category **categories =
(struct objc_category **)symtab->defs + symtab->classDefsCount;
for (size_t i = 0; i < symtab->categoryDefsCount; i++) {
registerSelectors(categories[i]);
registerCategory(categories[i]);
}
}
struct objc_category **
objc_categoriesForClass(Class class)
{
if (categoriesMap == NULL)
return NULL;
return (struct objc_category **)objc_hashtable_get(categoriesMap,
class->name);
}
void
objc_unregisterAllCategories(void)
{
if (categoriesMap == NULL)
return;
for (uint32_t i = 0; i < categoriesMap->size; i++)
if (categoriesMap->data[i] != NULL)
free((void *)categoriesMap->data[i]->object);
objc_hashtable_free(categoriesMap);
categoriesMap = NULL;
}
|