When changing the size of structures, it's a good idea to make sure that you change everything that depends on those sizes too...

main
theraven 15 years ago
parent 4e7b476aa6
commit 65d6a8dfb5

@ -83,7 +83,7 @@ static Method class_getInstanceMethodNonrecursive(Class aClass, SEL aSelector)
for (int i=0 ; i<methods->count ; i++) for (int i=0 ; i<methods->count ; i++)
{ {
Method method = &methods->methods[i]; Method method = &methods->methods[i];
if (method->selector->index == aSelector->index) if (sel_isEqual(method->selector, aSelector))
{ {
return method; return method;
} }
@ -129,7 +129,7 @@ BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment,
if (NULL == ivarlist) if (NULL == ivarlist)
{ {
cls->ivars = malloc(sizeof(struct objc_ivar_list)); cls->ivars = malloc(sizeof(struct objc_ivar_list) + sizeof(struct objc_ivar));
cls->ivars->count = 1; cls->ivars->count = 1;
} }
else else
@ -137,7 +137,7 @@ BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment,
ivarlist->count++; ivarlist->count++;
// objc_ivar_list contains one ivar. Others follow it. // objc_ivar_list contains one ivar. Others follow it.
cls->ivars = realloc(ivarlist, sizeof(struct objc_ivar_list) + cls->ivars = realloc(ivarlist, sizeof(struct objc_ivar_list) +
(ivarlist->count - 1) * sizeof(struct objc_ivar)); (ivarlist->count) * sizeof(struct objc_ivar));
} }
Ivar ivar = &cls->ivars->ivar_list[cls->ivars->count - 1]; Ivar ivar = &cls->ivars->ivar_list[cls->ivars->count - 1];
ivar->name = strdup(name); ivar->name = strdup(name);
@ -177,7 +177,7 @@ BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
} }
} }
methods = malloc(sizeof(struct objc_method_list)); methods = malloc(sizeof(struct objc_method_list) + sizeof(struct objc_method));
methods->next = cls->methods; methods->next = cls->methods;
cls->methods = methods; cls->methods = methods;
@ -200,7 +200,7 @@ BOOL class_addProtocol(Class cls, Protocol *protocol)
CHECK_ARG(protocol); CHECK_ARG(protocol);
if (class_conformsToProtocol(cls, protocol)) { return NO; } if (class_conformsToProtocol(cls, protocol)) { return NO; }
struct objc_protocol_list *protocols = struct objc_protocol_list *protocols =
malloc(sizeof(struct objc_protocol_list)); malloc(sizeof(struct objc_protocol_list) + sizeof(Protocol2*));
if (protocols == NULL) { return NO; } if (protocols == NULL) { return NO; }
protocols->next = cls->protocols; protocols->next = cls->protocols;
protocols->count = 1; protocols->count = 1;
@ -450,6 +450,7 @@ IMP class_replaceMethod(Class cls, SEL name, IMP imp, const char *types)
if (Nil == cls) { return (IMP)0; } if (Nil == cls) { return (IMP)0; }
SEL sel = sel_registerTypedName_np(sel_getName(name), types); SEL sel = sel_registerTypedName_np(sel_getName(name), types);
Method method = class_getInstanceMethodNonrecursive(cls, sel); Method method = class_getInstanceMethodNonrecursive(cls, sel);
//fprintf(stderr, "Found %p looking for [%s %s]\n", method, cls->name, sel_getName(sel));
if (method == NULL) if (method == NULL)
{ {
class_addMethod(cls, sel, imp, types); class_addMethod(cls, sel, imp, types);
@ -472,7 +473,7 @@ void class_setIvarLayout(Class cls, const char *layout)
if ((Nil == cls) || (NULL == layout)) { return; } if ((Nil == cls) || (NULL == layout)) { return; }
struct objc_ivar_list *list = (struct objc_ivar_list*)layout; struct objc_ivar_list *list = (struct objc_ivar_list*)layout;
size_t listsize = sizeof(struct objc_ivar_list) + size_t listsize = sizeof(struct objc_ivar_list) +
sizeof(struct objc_ivar) * (list->count - 1); sizeof(struct objc_ivar) * (list->count);
cls->ivars = malloc(listsize); cls->ivars = malloc(listsize);
memcpy(cls->ivars, list, listsize); memcpy(cls->ivars, list, listsize);
} }

Loading…
Cancel
Save