Index: src/runtime/protocol.m ================================================================== --- src/runtime/protocol.m +++ src/runtime/protocol.m @@ -21,10 +21,39 @@ #import "runtime.h" #import "runtime-private.h" @implementation Protocol @end + +inline const char* +protocol_getName(Protocol *p) +{ + return p->name; +} + +inline BOOL +protocol_isEqual(Protocol *a, Protocol *b) +{ + return !strcmp(protocol_getName(a), protocol_getName(b)); +} + +BOOL +protocol_conformsToProtocol(Protocol *a, Protocol *b) +{ + struct objc_protocol_list *pl; + size_t i; + + if (protocol_isEqual(a, b)) + return YES; + + for (pl = a->protocol_list; pl != NULL; pl = pl->next) + for (i = 0; i < pl->count; i++) + if (protocol_conformsToProtocol(pl->list[i], b)) + return YES; + + return NO; +} BOOL class_conformsToProtocol(Class cls, Protocol *p) { struct objc_protocol_list *pl; Index: src/runtime/runtime.h ================================================================== --- src/runtime/runtime.h +++ src/runtime/runtime.h @@ -120,9 +120,12 @@ extern IMP class_getMethodImplementation(Class, SEL); extern IMP class_replaceMethod(Class, SEL, IMP, const char*); extern const char* objc_get_type_encoding(Class, SEL); extern IMP objc_msg_lookup(id, SEL); extern IMP objc_msg_lookup_super(struct objc_super*, SEL); +extern const char* protocol_getName(Protocol*); +extern BOOL protocol_isEqual(Protocol*, Protocol*); +extern BOOL protocol_conformsToProtocol(Protocol*, Protocol*); extern void objc_thread_add(void); extern void objc_thread_remove(void); extern void objc_exit(void); #endif