(__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
This commit is contained in:
Richard Stallman 1993-05-23 19:33:55 +00:00
parent ecd023b662
commit eba92c951e
1 changed files with 15 additions and 7 deletions

View File

@ -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 ();
}