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)
{
listSize += list->count;
}
if (listSize == 0)
{
*outCount = 0;
return NULL;
}
Protocol **protocols = calloc(listSize, sizeof(Protocol*) + 1); for (list = protocolList; list != NULL; list = list->next)
int index = 0; {
for (struct objc_protocol_list *list = protocolList ; count += list->count;
list != NULL ; }
list = list->next) if (outCount != NULL)
{ {
memcpy(&protocols[index], list->list, list->count * sizeof(Protocol*)); *outCount = count;
index += list->count; }
} if (count == 0)
protocols[listSize] = NULL; {
*outCount = listSize + 1; return NULL;
return protocols; }
protocols = malloc((count + 1) * sizeof(Protocol *));
protocols[count] = NULL;
count = 0;
for (list = protocolList; list != NULL; list = list->next)
{
memcpy(&protocols[count], list->list, list->count * sizeof(Protocol *));
count += list->count;
}
return protocols;
} }
id class_createInstance(Class cls, size_t extraBytes) id class_createInstance(Class cls, size_t extraBytes)

Loading…
Cancel
Save