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
|
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
|
-
-
-
+
-
-
+
+
-
-
+
-
-
+
+
-
-
-
+
+
+
+
|
{
return (strcmp(protocol_getName(a), protocol_getName(b)) == 0);
}
bool
protocol_conformsToProtocol(Protocol *a, Protocol *b)
{
struct objc_protocol_list *pl;
size_t i;
if (protocol_isEqual(a, b))
return true;
for (struct objc_protocol_list *pl = a->protocol_list;
for (pl = a->protocol_list; pl != NULL; pl = pl->next)
for (i = 0; i < pl->count; i++)
pl != NULL; pl = pl->next)
for (size_t i = 0; i < pl->count; i++)
if (protocol_conformsToProtocol(pl->list[i], b))
return true;
return false;
}
bool
class_conformsToProtocol(Class cls, Protocol *p)
{
struct objc_protocol_list *pl;
struct objc_category **cats;
long i, j;
for (struct objc_protocol_list *pl = cls->protocols;
for (pl = cls->protocols; pl != NULL; pl = pl->next)
for (i = 0; i < pl->count; i++)
pl != NULL; pl = pl->next)
for (long i = 0; i < pl->count; i++)
if (protocol_conformsToProtocol(pl->list[i], p))
return true;
objc_global_mutex_lock();
if ((cats = objc_categories_for_class(cls)) == NULL) {
objc_global_mutex_unlock();
return false;
}
for (i = 0; cats[i] != NULL; i++) {
for (pl = cats[i]->protocols; pl != NULL; pl = pl->next) {
for (j = 0; j < pl->count; j++) {
for (long i = 0; cats[i] != NULL; i++) {
for (struct objc_protocol_list *pl = cats[i]->protocols;
pl != NULL; pl = pl->next) {
for (long j = 0; j < pl->count; j++) {
if (protocol_conformsToProtocol(
pl->list[j], p)) {
objc_global_mutex_unlock();
return true;
}
}
}
}
objc_global_mutex_unlock();
return false;
}
|