/* This file contains the implementation of class Protocol.
- Copyright (C) 1993 Free Software Foundation, Inc.
+ Copyright (C) 1993, 2004, 2009, 2010 Free Software Foundation, Inc.
-This file is part of GNU CC.
+This file is part of GCC.
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-/* As a special exception, if you link this library with files
- compiled with GCC to produce an executable, this does not cause
- the resulting executable to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
-#include "objc/Protocol.h"
-#include "objc/objc-api.h"
-
-/* Method description list */
-struct objc_method_description_list {
- int count;
- struct objc_method_description list[1];
-};
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+#include "objc-private/common.h"
+#include "objc/runtime.h"
+#include "objc-private/module-abi-8.h"
+#include "objc/Protocol.h"
@implementation Protocol
+- (BOOL) isEqual: (id)obj
{
-@private
- char *protocol_name;
- struct objc_protocol_list *protocol_list;
- struct objc_method_description_list *instance_methods, *class_methods;
+ return protocol_isEqual (self, obj);
}
+@end
-/* Obtaining attributes intrinsic to the protocol */
+@implementation Protocol (Deprecated)
- (const char *)name
{
return protocol_name;
}
-/* Testing protocol conformance */
-
- (BOOL) conformsTo: (Protocol *)aProtocolObject
{
- size_t i;
- struct objc_protocol_list* proto_list;
-
- if (!strcmp(aProtocolObject->protocol_name, self->protocol_name))
- return YES;
-
- for (proto_list = protocol_list; proto_list; proto_list = proto_list->next)
- {
- for (i=0; i < proto_list->count; i++)
- {
- if ([proto_list->list[i] conformsTo: aProtocolObject])
- return YES;
- }
- }
-
- return NO;
+ return protocol_conformsToProtocol (self, aProtocolObject);
}
-/* Looking up information specific to a protocol */
-
- (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel
{
int i;
struct objc_protocol_list* proto_list;
- const char* name = sel_get_name (aSel);
struct objc_method_description *result;
- for (i = 0; i < instance_methods->count; i++)
- {
- if (!strcmp ((char*)instance_methods->list[i].name, name))
- return &(instance_methods->list[i]);
- }
+ if (instance_methods)
+ for (i = 0; i < instance_methods->count; i++)
+ {
+ if (sel_isEqual (instance_methods->list[i].name, aSel))
+ return &(instance_methods->list[i]);
+ }
for (proto_list = protocol_list; proto_list; proto_list = proto_list->next)
{
for (j=0; j < proto_list->count; j++)
{
if ((result = [proto_list->list[j]
- descriptionForInstanceMethod: aSel]))
+ descriptionForInstanceMethod: aSel]))
return result;
}
}
{
int i;
struct objc_protocol_list* proto_list;
- const char* name = sel_get_name (aSel);
struct objc_method_description *result;
- for (i = 0; i < class_methods->count; i++)
- {
- if (!strcmp ((char*)class_methods->list[i].name, name))
- return &(class_methods->list[i]);
- }
+ if (class_methods)
+ for (i = 0; i < class_methods->count; i++)
+ {
+ if (sel_isEqual (class_methods->list[i].name, aSel))
+ return &(class_methods->list[i]);
+ }
for (proto_list = protocol_list; proto_list; proto_list = proto_list->next)
{
for (j=0; j < proto_list->count; j++)
{
if ((result = [proto_list->list[j]
- descriptionForClassMethod: aSel]))
+ descriptionForClassMethod: aSel]))
return result;
}
}
return NULL;
}
+- (unsigned) hash
+{
+ /* Compute a hash of the protocol_name; use the same hash algorithm
+ that we use for class names; protocol names and class names are
+ somewhat similar types of string spaces. */
+ int hash = 0, index;
+
+ for (index = 0; protocol_name[index] != '\0'; index++)
+ {
+ hash = (hash << 4) ^ (hash >> 28) ^ protocol_name[index];
+ }
+
+ hash = (hash ^ (hash >> 10) ^ (hash >> 20));
+
+ return hash;
+}
+
@end