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