Fix some bugs in protocol upgrading from old ABIs.

Reported by Riccardo Mottola!
main
David Chisnall 8 years ago
parent 43f557e26e
commit 38efd04e33

@ -400,7 +400,7 @@ PRIVATE struct objc_protocol *objc_upgrade_protocol_gsv1(struct objc_protocol_gs
p->class_methods = (struct objc_protocol_method_description_list_gcc*)n->class_methods;
p->properties = (struct objc_property_list_gsv1*)n->properties;
p->optional_properties = (struct objc_property_list_gsv1*)n->optional_properties;
p->isa = objc_getClass("Protocol");
p->isa = objc_getClass("ProtocolGSv1");
assert(p->isa);
return n;
}

@ -206,6 +206,7 @@ static BOOL init_protocols(struct objc_protocol_list *protocols)
struct objc_protocol *aProto = protocols->list[i];
// Don't initialise a protocol twice
if ((aProto->isa == protocol_class_gcc) ||
(aProto->isa == protocol_class_gsv1) ||
(aProto->isa == protocol_class_gsv2))
{
continue;
@ -222,12 +223,16 @@ static BOOL init_protocols(struct objc_protocol_list *protocols)
abort();
#ifdef OLDABI_COMPAT
case protocol_version_gcc:
protocols->list[i] = aProto = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto);
protocols->list[i] = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto);
assert(aProto->isa == protocol_class_gcc);
assert(protocols->list[i]->isa == protocol_class_gsv2);
aProto = protocols->list[i];
break;
case protocol_version_gsv1:
protocols->list[i] = aProto = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto);
assert(aProto->isa == protocol_class_gsv2);
protocols->list[i] = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto);
assert(aProto->isa == protocol_class_gsv1);
assert(protocols->list[i]->isa == protocol_class_gsv2);
aProto = protocols->list[i];
break;
#endif
case protocol_version_gsv2:

Loading…
Cancel
Save