diff options
author | rms <rms@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-05-23 19:33:55 +0000 |
---|---|---|
committer | rms <rms@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-05-23 19:33:55 +0000 |
commit | 766c33435cead29a7b2a90ee39117d65bfbf3bdc (patch) | |
tree | 838c7b9ae41bff37e1892ea43cc62be09b418cb4 /gcc/objc/init.c | |
parent | bea1ee3039d281e2c4a9cc95dd4b7df81f386fed (diff) | |
download | ppe42-gcc-766c33435cead29a7b2a90ee39117d65bfbf3bdc.tar.gz ppe42-gcc-766c33435cead29a7b2a90ee39117d65bfbf3bdc.zip |
(__objc_init_protocols): Call recursively
on super protocols. Make local var `proto_class' static.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@4544 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc/init.c')
-rw-r--r-- | gcc/objc/init.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/objc/init.c b/gcc/objc/init.c index ea601a02e14..220d7d23e64 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 (); } |