Fix instance variable lookup to match OSX

main
rfm 16 years ago
parent 719b540317
commit 607bc433c9

@ -135,6 +135,10 @@ Method class_getInstanceMethod(Class aClass, SEL aSelector);
size_t class_getInstanceSize(Class cls); size_t class_getInstanceSize(Class cls);
/** Look up the named instance variable in the class (and its superclasses)
* returning a pointer to the instance variable definition or a null
* pointer if no instance variable of that name was found.
*/
Ivar class_getInstanceVariable(Class cls, const char* name); Ivar class_getInstanceVariable(Class cls, const char* name);
const char *class_getIvarLayout(Class cls); const char *class_getIvarLayout(Class cls);

@ -354,19 +354,32 @@ size_t class_getInstanceSize(Class cls)
return cls->instance_size; return cls->instance_size;
} }
Ivar class_getInstanceVariable(Class cls, const char* name) Ivar
class_getInstanceVariable(Class cls, const char* name)
{ {
if (name != NULL)
{
while (cls != Nil)
{
struct objc_ivar_list *ivarlist = cls->ivars; struct objc_ivar_list *ivarlist = cls->ivars;
if (NULL == ivarlist) { return NULL; } int i;
for (int i=0 ; i<ivarlist->ivar_count ; i++) if (NULL == ivarlist)
{
return NULL;
}
for (i = 0; i < ivarlist->ivar_count; i++)
{ {
Ivar ivar = &ivarlist->ivar_list[i]; Ivar ivar = &ivarlist->ivar_list[i];
if (strcmp(ivar->ivar_name, name) == 0) if (strcmp(ivar->ivar_name, name) == 0)
{ {
return ivar; return ivar;
} }
} }
cls = class_getSuperclass(cls);
}
}
return NULL; return NULL;
} }

Loading…
Cancel
Save