23
24
25
26
27
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
58
59
60
61
62
63
64
65
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
|
23
24
25
26
27
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
58
59
60
61
62
63
64
65
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
|
-
+
-
-
+
+
+
+
-
-
-
+
+
-
-
+
-
-
-
+
+
-
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
-
-
+
+
|
#import "ObjFWRT.h"
#import "private.h"
static struct objc_hashtable *categoriesMap = NULL;
static void
registerSelectors(struct objc_abi_category *category)
registerSelectors(struct objc_category *category)
{
for (struct objc_abi_method_list *methodList =
category->instanceMethods; methodList != NULL;
struct objc_method_list *iter;
unsigned int i;
for (iter = category->instanceMethods; iter != NULL; iter = iter->next)
methodList = methodList->next)
for (unsigned int i = 0; i < methodList->count; i++)
objc_register_selector((struct objc_abi_selector *)
for (i = 0; i < iter->count; i++)
objc_register_selector(&iter->methods[i].selector);
&methodList->methods[i]);
for (struct objc_abi_method_list *methodList = category->classMethods;
for (iter = category->classMethods; iter != NULL; iter = iter->next)
methodList != NULL; methodList = methodList->next)
for (unsigned int i = 0; i < methodList->count; i++)
objc_register_selector((struct objc_abi_selector *)
for (i = 0; i < iter->count; i++)
objc_register_selector(&iter->methods[i].selector);
&methodList->methods[i]);
}
static void
registerCategory(struct objc_abi_category *category)
registerCategory(struct objc_category *category)
{
struct objc_abi_category **categories;
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_abi_category **)objc_hashtable_get(
categories = (struct objc_category **)objc_hashtable_get(
categoriesMap, category->className);
if (categories != NULL) {
struct objc_abi_category **newCategories;
struct objc_category **newCategories;
size_t i;
for (i = 0; categories[i] != NULL; i++);
if ((newCategories = realloc(categories,
(i + 2) * sizeof(struct objc_abi_category *))) == NULL)
(i + 2) * sizeof(*categories))) == NULL)
OBJC_ERROR("Not enough memory for category %s of "
"class %s!", category->categoryName,
category->className);
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(
if ((categories = malloc(2 * sizeof(*categories))) == NULL)
2 * sizeof(struct objc_abi_category *))) == 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_abi_symtab *symtab)
objc_register_all_categories(struct objc_symtab *symtab)
{
struct objc_abi_category **categories =
(struct objc_abi_category **)symtab->defs + symtab->classDefsCount;
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]);
}
}
|