summaryrefslogtreecommitdiffstats
path: root/gcc/objc/init.c
diff options
context:
space:
mode:
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1993-05-23 19:33:55 +0000
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1993-05-23 19:33:55 +0000
commit766c33435cead29a7b2a90ee39117d65bfbf3bdc (patch)
tree838c7b9ae41bff37e1892ea43cc62be09b418cb4 /gcc/objc/init.c
parentbea1ee3039d281e2c4a9cc95dd4b7df81f386fed (diff)
downloadppe42-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.c22
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 ();
}
OpenPOWER on IntegriCloud