1/* 2 * Copyright (c) 1999-2001, 2005-2007 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23/* 24 Protocol.h 25 Copyright 1991-1996 NeXT Software, Inc. 26*/ 27 28#include "objc-private.h" 29 30#undef id 31#undef Class 32 33#include <stdlib.h> 34#include <string.h> 35#include <mach-o/dyld.h> 36#include <mach-o/ldsyms.h> 37 38#include "Protocol.h" 39 40#if __OBJC2__ 41@interface __IncompleteProtocol : NSObject @end 42@implementation __IncompleteProtocol 43// fixme hack - make __IncompleteProtocol a non-lazy class 44+ (void) load { } 45@end 46#endif 47 48@implementation Protocol 49 50#if __OBJC2__ 51// fixme hack - make Protocol a non-lazy class 52+ (void) load { } 53#endif 54 55 56- (BOOL) conformsTo: (Protocol *)aProtocolObj 57{ 58 return protocol_conformsToProtocol(self, aProtocolObj); 59} 60 61- (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel 62{ 63#if !__OBJC2__ 64 return lookup_protocol_method((struct old_protocol *)self, aSel, 65 YES/*required*/, YES/*instance*/, 66 YES/*recursive*/); 67#else 68 return method_getDescription(protocol_getMethod((struct protocol_t *)self, 69 aSel, YES, YES, YES)); 70#endif 71} 72 73- (struct objc_method_description *) descriptionForClassMethod:(SEL)aSel 74{ 75#if !__OBJC2__ 76 return lookup_protocol_method((struct old_protocol *)self, aSel, 77 YES/*required*/, NO/*instance*/, 78 YES/*recursive*/); 79#else 80 return method_getDescription(protocol_getMethod((struct protocol_t *)self, 81 aSel, YES, NO, YES)); 82#endif 83} 84 85- (const char *)name 86{ 87 return protocol_getName(self); 88} 89 90- (BOOL)isEqual:other 91{ 92#if __OBJC2__ 93 // check isKindOf: 94 Class cls; 95 Class protoClass = objc_getClass("Protocol"); 96 for (cls = object_getClass(other); cls; cls = cls->superclass) { 97 if (cls == protoClass) break; 98 } 99 if (!cls) return NO; 100 // check equality 101 return protocol_isEqual(self, other); 102#else 103 return [other isKindOf:[Protocol class]] && [self conformsTo: other] && [other conformsTo: self]; 104#endif 105} 106 107#if __OBJC2__ 108- (NSUInteger)hash 109{ 110 return 23; 111} 112#else 113- (unsigned)hash 114{ 115 return 23; 116} 117#endif 118 119@end 120