backport class data copying fixes from ObjectiveC2

main
rfm 16 years ago
parent bc0ad88a82
commit b7963e23a6

@ -235,10 +235,13 @@ 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;
Ivar *list;
if (ivarlist != NULL) if (ivarlist != NULL)
{ {
count = ivarlist->ivar_count; count = ivarlist->ivar_count;
@ -252,19 +255,21 @@ Ivar * class_copyIvarList(Class cls, unsigned int *outCount)
return NULL; return NULL;
} }
Ivar *list = malloc(count * sizeof(struct objc_ivar *)); list = malloc((count + 1) * sizeof(struct objc_ivar *));
for (unsigned int i=0; i<ivarlist->ivar_count; i++) list[count] = NULL;
{ memcpy(list, ivarlist->ivar_list,
list[i] = &(ivarlist->ivar_list[i]); ivarlist->ivar_count * sizeof(struct objc_ivar *));
}
return list; 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;
for (methods = cls->methods; methods != NULL; methods = methods->method_next)
{ {
count += methods->method_count; count += methods->method_count;
} }
@ -277,49 +282,48 @@ Method * class_copyMethodList(Class cls, unsigned int *outCount)
return NULL; return NULL;
} }
Method *list = malloc(count * sizeof(struct objc_method *)); list = malloc((count + 1) * sizeof(struct objc_method *));
Method *copyDest = list; list[count] = NULL;
count = 0;
for (struct objc_method_list *methods = cls->methods; for (methods = cls->methods; methods != NULL; methods = methods->method_next)
methods != NULL ; methods = methods->method_next)
{
for (unsigned int i=0; i<methods->method_count; i++)
{ {
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 = count;
}
if (count == 0)
{ {
*outCount = 0;
return NULL; return NULL;
} }
Protocol **protocols = calloc(listSize, sizeof(Protocol*) + 1); protocols = malloc((count + 1) * sizeof(Protocol *));
int index = 0; protocols[count] = NULL;
for (struct objc_protocol_list *list = protocolList ; count = 0;
list != NULL ; for (list = protocolList; list != NULL; list = list->next)
list = list->next)
{ {
memcpy(&protocols[index], list->list, list->count * sizeof(Protocol*)); memcpy(&protocols[count], list->list, list->count * sizeof(Protocol *));
index += list->count; count += list->count;
} }
protocols[listSize] = NULL;
*outCount = listSize + 1;
return protocols; return protocols;
} }

Loading…
Cancel
Save