aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-05-23 19:33:55 +0000
committerRichard Stallman <rms@gnu.org>1993-05-23 19:33:55 +0000
commiteba92c951ed6038829c2500928c19ac4949f5d92 (patch)
tree838c7b9ae41bff37e1892ea43cc62be09b418cb4 /gcc
parentecd023b66232bb57c7b65b8022f8b5a5992d7de0 (diff)
downloadgcc-eba92c951ed6038829c2500928c19ac4949f5d92.zip
gcc-eba92c951ed6038829c2500928c19ac4949f5d92.tar.gz
gcc-eba92c951ed6038829c2500928c19ac4949f5d92.tar.bz2
(__objc_init_protocols): Call recursively on super protocols.
(__objc_init_protocols): Call recursively on super protocols. Make local var `proto_class' static. From-SVN: r4544
Diffstat (limited to 'gcc')
-rw-r--r--gcc/objc/init.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/objc/init.c b/gcc/objc/init.c
index ea601a0..220d7d2 100644
--- a/gcc/objc/init.c
+++ b/gcc/objc/init.c
@@ -224,14 +224,15 @@ static void
__objc_init_protocols (struct objc_protocol_list* protos)
{
int i;
- Class* proto_class;
+ static Class* proto_class = 0;
if (! protos)
return;
- proto_class = objc_lookup_class("Protocol");
+ if (!proto_class)
+ proto_class = objc_lookup_class("Protocol");
- if (proto_class == 0 && ! list_find (&unclaimed_proto_list, protos))
+ if (!proto_class)
{
unclaimed_proto_list = list_cons (protos, unclaimed_proto_list);
return;
@@ -241,13 +242,20 @@ __objc_init_protocols (struct objc_protocol_list* protos)
for(i = 0; i < protos->count; i++)
{
- if (((size_t)((id)protos->list[i])->class_pointer) == PROTOCOL_VERSION)
- ((id)protos->list[i])->class_pointer = proto_class;
- else if (((id)protos->list[i])->class_pointer != proto_class)
+ struct objc_protocol* aProto = protos->list[i];
+ if (((size_t)aProto->class_pointer) == PROTOCOL_VERSION)
+ {
+ /* assign class pointer */
+ aProto->class_pointer = proto_class;
+
+ /* init super protocols */
+ __objc_init_protocols (aProto->protocol_list);
+ }
+ else if (protos->list[i]->class_pointer != proto_class)
{
fprintf (stderr,
"Version %d doesn't match runtime protocol version %d\n",
- ((size_t)((id)protos->list[i])->class_pointer),
+ ((size_t)protos->list[i]->class_pointer),
PROTOCOL_VERSION);
abort ();
}