In libobjc/: 2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com>
In libobjc/: 2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com> * Protocol.m: Include objc/runtime.h and objc-private/module-abi-8.h instead of objc/objc-api.h. Do not repeat Protocol's instance variables. (struct objc_method_description_list): Do not define here. ([-conformsTo:]): Reimplemented on top of protocol_conformsTo(). ([descriptionForInstanceMethod:]): Use sel_isEqual() to compare selectors directly instead of getting names and then using strcmp. ([descriptionForClassMethod:]): Same change. ([-isEqual:]): Reimplemented on top of protocol_isEqual(). * protocols.c (protocol_getMethodDescription): Use sel_isEqual() to compare selectors directly instead of getting names and then using strcmp. * objc/Protocol.h: Updated comments. From-SVN: r165517
This commit is contained in:
parent
e2e1d4d8c8
commit
ae422ccd65
4 changed files with 38 additions and 79 deletions
|
@ -1,3 +1,19 @@
|
|||
2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* Protocol.m: Include objc/runtime.h and
|
||||
objc-private/module-abi-8.h instead of objc/objc-api.h. Do not
|
||||
repeat Protocol's instance variables.
|
||||
(struct objc_method_description_list): Do not define here.
|
||||
([-conformsTo:]): Reimplemented on top of protocol_conformsTo().
|
||||
([descriptionForInstanceMethod:]): Use sel_isEqual() to compare
|
||||
selectors directly instead of getting names and then using strcmp.
|
||||
([descriptionForClassMethod:]): Same change.
|
||||
([-isEqual:]): Reimplemented on top of protocol_isEqual().
|
||||
* protocols.c (protocol_getMethodDescription): Use sel_isEqual()
|
||||
to compare selectors directly instead of getting names and then
|
||||
using strcmp.
|
||||
* objc/Protocol.h: Updated comments.
|
||||
|
||||
2010-10-15 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||
|
||||
* init.c (__objc_init_protocol): New function which fixes up a
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* This file contains the implementation of class Protocol.
|
||||
Copyright (C) 1993, 2004, 2009 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 2004, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -23,69 +23,33 @@ 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"
|
||||
#include "objc/objc-api.h"
|
||||
|
||||
/* Method description list */
|
||||
struct objc_method_description_list {
|
||||
int count;
|
||||
struct objc_method_description list[1];
|
||||
};
|
||||
|
||||
|
||||
@implementation Protocol
|
||||
{
|
||||
@private
|
||||
char *protocol_name;
|
||||
struct objc_protocol_list *protocol_list;
|
||||
struct objc_method_description_list *instance_methods, *class_methods;
|
||||
}
|
||||
|
||||
/* Obtaining attributes intrinsic to the protocol */
|
||||
|
||||
- (const char *)name
|
||||
{
|
||||
return protocol_name;
|
||||
}
|
||||
|
||||
/* Testing protocol conformance */
|
||||
|
||||
- (BOOL) conformsTo: (Protocol *)aProtocolObject
|
||||
{
|
||||
size_t i;
|
||||
struct objc_protocol_list* proto_list;
|
||||
|
||||
if (aProtocolObject == nil)
|
||||
return NO;
|
||||
|
||||
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;
|
||||
|
||||
if (instance_methods)
|
||||
for (i = 0; i < instance_methods->count; i++)
|
||||
{
|
||||
if (!strcmp (sel_get_name (instance_methods->list[i].name), name))
|
||||
if (sel_isEqual (instance_methods->list[i].name, aSel))
|
||||
return &(instance_methods->list[i]);
|
||||
}
|
||||
|
||||
|
@ -95,7 +59,7 @@ struct objc_method_description_list {
|
|||
for (j=0; j < proto_list->count; j++)
|
||||
{
|
||||
if ((result = [proto_list->list[j]
|
||||
descriptionForInstanceMethod: aSel]))
|
||||
descriptionForInstanceMethod: aSel]))
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -107,13 +71,12 @@ struct objc_method_description_list {
|
|||
{
|
||||
int i;
|
||||
struct objc_protocol_list* proto_list;
|
||||
const char* name = sel_get_name (aSel);
|
||||
struct objc_method_description *result;
|
||||
|
||||
if (class_methods)
|
||||
for (i = 0; i < class_methods->count; i++)
|
||||
{
|
||||
if (!strcmp (sel_get_name (class_methods->list[i].name), name))
|
||||
if (sel_isEqual (class_methods->list[i].name, aSel))
|
||||
return &(class_methods->list[i]);
|
||||
}
|
||||
|
||||
|
@ -123,7 +86,7 @@ struct objc_method_description_list {
|
|||
for (j=0; j < proto_list->count; j++)
|
||||
{
|
||||
if ((result = [proto_list->list[j]
|
||||
descriptionForClassMethod: aSel]))
|
||||
descriptionForClassMethod: aSel]))
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -149,33 +112,9 @@ struct objc_method_description_list {
|
|||
return hash;
|
||||
}
|
||||
|
||||
/*
|
||||
* Equality between formal protocols is only formal (nothing to do
|
||||
* with actually checking the list of methods they have!). Two formal
|
||||
* Protocols are equal if and only if they have the same name.
|
||||
*
|
||||
* Please note (for comparisons with other implementations) that
|
||||
* checking the names is equivalent to checking that Protocol A
|
||||
* conforms to Protocol B and Protocol B conforms to Protocol A,
|
||||
* because this happens iff they have the same name. If they have
|
||||
* different names, A conforms to B if and only if A includes B, but
|
||||
* the situation where A includes B and B includes A is a circular
|
||||
* dependency between Protocols which is forbidden by the compiler, so
|
||||
* A conforms to B and B conforms to A with A and B having different
|
||||
* names is an impossible case.
|
||||
*/
|
||||
- (BOOL) isEqual: (id)obj
|
||||
{
|
||||
if (obj == self)
|
||||
return YES;
|
||||
|
||||
if ([obj isKindOf: [Protocol class]])
|
||||
{
|
||||
if (strcmp (protocol_name, ((Protocol *)obj)->protocol_name) == 0)
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
return protocol_isEqual (self, obj);
|
||||
}
|
||||
@end
|
||||
|
||||
|
|
|
@ -35,21 +35,24 @@ extern "C" {
|
|||
@interface Protocol : Object
|
||||
{
|
||||
@private
|
||||
char *protocol_name;
|
||||
struct objc_protocol_list *protocol_list;
|
||||
struct objc_method_description_list *instance_methods, *class_methods;
|
||||
char *protocol_name;
|
||||
struct objc_protocol_list *protocol_list;
|
||||
struct objc_method_description_list *instance_methods, *class_methods;
|
||||
}
|
||||
|
||||
/* Obtaining attributes intrinsic to the protocol */
|
||||
/* The following methods have been replaced by
|
||||
protocol_getName()
|
||||
protocol_conformsToProtocol()
|
||||
protocol_getMethodDescription()
|
||||
*/
|
||||
|
||||
/* Obtaining attributes intrinsic to the protocol */
|
||||
- (const char *)name;
|
||||
|
||||
/* Testing protocol conformance */
|
||||
|
||||
- (BOOL) conformsTo: (Protocol *)aProtocolObject;
|
||||
|
||||
/* Looking up information specific to a protocol */
|
||||
|
||||
- (struct objc_method_description *) descriptionForInstanceMethod:(SEL)aSel;
|
||||
- (struct objc_method_description *) descriptionForClassMethod:(SEL)aSel;
|
||||
|
||||
|
|
|
@ -358,7 +358,6 @@ struct objc_method_description protocol_getMethodDescription (Protocol *protocol
|
|||
BOOL instanceMethod)
|
||||
{
|
||||
struct objc_method_description no_result = { NULL, NULL };
|
||||
const char* selector_name;
|
||||
struct objc_method_description_list *methods;
|
||||
int i;
|
||||
|
||||
|
@ -372,8 +371,6 @@ struct objc_method_description protocol_getMethodDescription (Protocol *protocol
|
|||
if (protocol->class_pointer != objc_lookupClass ("Protocol"))
|
||||
return no_result;
|
||||
|
||||
selector_name = sel_getName (selector);
|
||||
|
||||
if (instanceMethod)
|
||||
methods = ((struct objc_protocol *)protocol)->instance_methods;
|
||||
else
|
||||
|
@ -383,8 +380,12 @@ struct objc_method_description protocol_getMethodDescription (Protocol *protocol
|
|||
{
|
||||
for (i = 0; i < methods->count; i++)
|
||||
{
|
||||
if (sel_isEqual (methods->list[i].name, selector))
|
||||
return methods->list[i];
|
||||
/*
|
||||
if (strcmp (sel_getName (methods->list[i].name), selector_name) == 0)
|
||||
return methods->list[i];
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue