BOOL class_addProtocol (Class class_, Protocol *protocol) { struct objc_protocol_list *protocols; if (class_ == Nil || protocol == NULL) return NO; if (class_conformsToProtocol (class_, protocol)) return NO; /* Check that it is a Protocol object before casting it to (struct objc_protocol *). */ if (protocol->class_pointer != objc_lookUpClass ("Protocol")) return NO; objc_mutex_lock (__objc_runtime_mutex); /* Create the objc_protocol_list. */ protocols = malloc (sizeof (struct objc_protocol_list)); protocols->count = 1; protocols->list[0] = (struct objc_protocol *)protocol; /* Attach it to the list of class protocols. */ protocols->next = class_->protocols; class_->protocols = protocols; objc_mutex_unlock (__objc_runtime_mutex); return YES; }
BOOL class_addProtocol(Class cls, Protocol *protocol) { CHECK_ARG(cls); CHECK_ARG(protocol); if (class_conformsToProtocol(cls, protocol)) { return NO; } struct objc_protocol_list *protocols = malloc(sizeof(struct objc_protocol_list) + sizeof(Protocol2*)); if (protocols == NULL) { return NO; } protocols->next = cls->protocols; protocols->count = 1; protocols->list[0] = (Protocol2*)protocol; cls->protocols = protocols; return YES; }