backport class data copying fixes from ObjectiveC2

main
rfm 16 years ago
parent bc0ad88a82
commit b7963e23a6

@ -235,92 +235,96 @@ BOOL class_conformsToProtocol(Class cls, Protocol *protocol)
return NO; return NO;
} }
Ivar * class_copyIvarList(Class cls, unsigned int *outCount) Ivar *
class_copyIvarList(Class cls, unsigned int *outCount)
{ {
struct objc_ivar_list *ivarlist = cls->ivars; struct objc_ivar_list *ivarlist = cls->ivars;
unsigned int count = 0; unsigned int count = 0;
if (ivarlist != NULL) Ivar *list;
{
count = ivarlist->ivar_count;
}
if (outCount != NULL)
{
*outCount = count;
}
if (count == 0)
{
return NULL;
}
Ivar *list = malloc(count * sizeof(struct objc_ivar *)); if (ivarlist != NULL)
for (unsigned int i=0; i<ivarlist->ivar_count; i++) {
{ count = ivarlist->ivar_count;
list[i] = &(ivarlist->ivar_list[i]); }
} if (outCount != NULL)
return list; {
*outCount = count;
}
if (count == 0)
{
return NULL;
}
list = malloc((count + 1) * sizeof(struct objc_ivar *));
list[count] = NULL;
memcpy(list, ivarlist->ivar_list,
ivarlist->ivar_count * sizeof(struct objc_ivar *));
return list;
} }
Method * class_copyMethodList(Class cls, unsigned int *outCount) Method *
class_copyMethodList(Class cls, unsigned int *outCount)
{ {
unsigned int count = 0; unsigned int count = 0;
for (struct objc_method_list *methods = cls->methods; Method *list;
methods != NULL ; methods = methods->method_next) struct objc_method_list *methods;
{
count += methods->method_count;
}
if (outCount != NULL)
{
*outCount = count;
}
if (count == 0)
{
return NULL;
}
Method *list = malloc(count * sizeof(struct objc_method *)); for (methods = cls->methods; methods != NULL; methods = methods->method_next)
Method *copyDest = list; {
count += methods->method_count;
}
if (outCount != NULL)
{
*outCount = count;
}
if (count == 0)
{
return NULL;
}
for (struct objc_method_list *methods = cls->methods; list = malloc((count + 1) * sizeof(struct objc_method *));
methods != NULL ; methods = methods->method_next) list[count] = NULL;
{ count = 0;
for (unsigned int i=0; i<methods->method_count; i++) for (methods = cls->methods; methods != NULL; methods = methods->method_next)
{ {
copyDest[i] = &(methods->method_list[i]); memcpy(&list[count], methods->method_list,
} methods->method_count * sizeof(struct objc_method *));
copyDest += methods->method_count; count += methods->method_count;
} }
return list; return list;
} }
Protocol ** class_copyProtocolList(Class cls, unsigned int *outCount) Protocol **
class_copyProtocolList(Class cls, unsigned int *outCount)
{ {
struct objc_protocol_list *protocolList = cls->protocols; struct objc_protocol_list *protocolList = cls->protocols;
int listSize = 0; struct objc_protocol_list *list;
for (struct objc_protocol_list *list = protocolList ; unsigned int count = 0;
list != NULL ; Protocol **protocols;
list = list->next)
{ for (list = protocolList; list != NULL; list = list->next)
listSize += list->count; {
} count += list->count;
if (listSize == 0) }
{ if (outCount != NULL)
*outCount = 0; {
return NULL; *outCount = count;
} }
if (count == 0)
Protocol **protocols = calloc(listSize, sizeof(Protocol*) + 1); {
int index = 0; return NULL;
for (struct objc_protocol_list *list = protocolList ; }
list != NULL ;
list = list->next) protocols = malloc((count + 1) * sizeof(Protocol *));
{ protocols[count] = NULL;
memcpy(&protocols[index], list->list, list->count * sizeof(Protocol*)); count = 0;
index += list->count; for (list = protocolList; list != NULL; list = list->next)
} {
protocols[listSize] = NULL; memcpy(&protocols[count], list->list, list->count * sizeof(Protocol *));
*outCount = listSize + 1; count += list->count;
return protocols; }
return protocols;
} }
id class_createInstance(Class cls, size_t extraBytes) id class_createInstance(Class cls, size_t extraBytes)

Loading…
Cancel
Save