]>
Commit | Line | Data |
---|---|---|
13d88034 | 1 | /* |
b3962a83 | 2 | * Copyright (c) 1999-2001, 2005-2007 Apple Inc. All Rights Reserved. |
13d88034 | 3 | * |
b3962a83 | 4 | * @APPLE_LICENSE_HEADER_START@ |
390d5862 A |
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. | |
13d88034 A |
12 | * |
13 | * The Original Code and all software distributed under the License are | |
390d5862 | 14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
13d88034 A |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
390d5862 A |
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. | |
13d88034 A |
20 | * |
21 | * @APPLE_LICENSE_HEADER_END@ | |
22 | */ | |
23 | /* | |
24 | Protocol.h | |
25 | Copyright 1991-1996 NeXT Software, Inc. | |
26 | */ | |
27 | ||
7257e56c A |
28 | #include "objc-private.h" |
29 | ||
30 | #undef id | |
31 | #undef Class | |
13d88034 | 32 | |
13d88034 | 33 | #include <stdlib.h> |
b3962a83 | 34 | #include <string.h> |
41c8faa5 A |
35 | #include <mach-o/dyld.h> |
36 | #include <mach-o/ldsyms.h> | |
13d88034 | 37 | |
cd5f04f5 | 38 | #include "Protocol.h" |
c1e772c4 A |
39 | #include "NSObject.h" |
40 | ||
41 | // __IncompleteProtocol is used as the return type of objc_allocateProtocol(). | |
42 | ||
43 | // Old ABI uses NSObject as the superclass even though Protocol uses Object | |
44 | // because the R/R implementation for class Protocol is added at runtime | |
45 | // by CF, so __IncompleteProtocol would be left without an R/R implementation | |
46 | // otherwise, which would break ARC. | |
13d88034 | 47 | |
1807f628 A |
48 | @interface __IncompleteProtocol : NSObject |
49 | @end | |
50 | ||
c1e772c4 | 51 | #if __OBJC2__ |
1807f628 | 52 | __attribute__((objc_nonlazy_class)) |
cd5f04f5 | 53 | #endif |
1807f628 | 54 | @implementation __IncompleteProtocol |
c1e772c4 A |
55 | @end |
56 | ||
13d88034 | 57 | |
b3962a83 | 58 | #if __OBJC2__ |
1807f628 | 59 | __attribute__((objc_nonlazy_class)) |
b3962a83 | 60 | #endif |
1807f628 | 61 | @implementation Protocol |
13d88034 | 62 | |
13d88034 A |
63 | - (BOOL) conformsTo: (Protocol *)aProtocolObj |
64 | { | |
b3962a83 | 65 | return protocol_conformsToProtocol(self, aProtocolObj); |
13d88034 A |
66 | } |
67 | ||
68 | - (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel | |
69 | { | |
b3962a83 | 70 | #if !__OBJC2__ |
8972963c | 71 | return lookup_protocol_method((struct old_protocol *)self, aSel, |
cd5f04f5 A |
72 | YES/*required*/, YES/*instance*/, |
73 | YES/*recursive*/); | |
b3962a83 | 74 | #else |
7257e56c A |
75 | return method_getDescription(protocol_getMethod((struct protocol_t *)self, |
76 | aSel, YES, YES, YES)); | |
b3962a83 | 77 | #endif |
13d88034 A |
78 | } |
79 | ||
80 | - (struct objc_method_description *) descriptionForClassMethod:(SEL)aSel | |
81 | { | |
b3962a83 | 82 | #if !__OBJC2__ |
8972963c | 83 | return lookup_protocol_method((struct old_protocol *)self, aSel, |
cd5f04f5 A |
84 | YES/*required*/, NO/*instance*/, |
85 | YES/*recursive*/); | |
b3962a83 | 86 | #else |
7257e56c A |
87 | return method_getDescription(protocol_getMethod((struct protocol_t *)self, |
88 | aSel, YES, NO, YES)); | |
b3962a83 | 89 | #endif |
13d88034 A |
90 | } |
91 | ||
92 | - (const char *)name | |
93 | { | |
b3962a83 | 94 | return protocol_getName(self); |
13d88034 A |
95 | } |
96 | ||
97 | - (BOOL)isEqual:other | |
98 | { | |
b3962a83 A |
99 | #if __OBJC2__ |
100 | // check isKindOf: | |
101 | Class cls; | |
102 | Class protoClass = objc_getClass("Protocol"); | |
34d5b5e8 | 103 | for (cls = object_getClass(other); cls; cls = cls->getSuperclass()) { |
b3962a83 A |
104 | if (cls == protoClass) break; |
105 | } | |
106 | if (!cls) return NO; | |
107 | // check equality | |
108 | return protocol_isEqual(self, other); | |
109 | #else | |
13d88034 | 110 | return [other isKindOf:[Protocol class]] && [self conformsTo: other] && [other conformsTo: self]; |
b3962a83 | 111 | #endif |
13d88034 A |
112 | } |
113 | ||
cd5f04f5 A |
114 | #if __OBJC2__ |
115 | - (NSUInteger)hash | |
13d88034 A |
116 | { |
117 | return 23; | |
118 | } | |
cd5f04f5 A |
119 | #else |
120 | - (unsigned)hash | |
121 | { | |
122 | return 23; | |
123 | } | |
124 | #endif | |
13d88034 | 125 | |
13d88034 | 126 | @end |