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->class_methods = (struct objc_protocol_method_description_list_gcc*)n->class_methods;
p->properties = (struct objc_property_list_gsv1*)n->properties; p->properties = (struct objc_property_list_gsv1*)n->properties;
p->optional_properties = (struct objc_property_list_gsv1*)n->optional_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); assert(p->isa);
return n; return n;
} }

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

Loading…
Cancel
Save