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,20 +354,33 @@ 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)
{ {
struct objc_ivar_list *ivarlist = cls->ivars; if (name != NULL)
if (NULL == ivarlist) { return NULL; } {
while (cls != Nil)
for (int i=0 ; i<ivarlist->ivar_count ; i++)
{ {
Ivar ivar = &ivarlist->ivar_list[i]; struct objc_ivar_list *ivarlist = cls->ivars;
if (strcmp(ivar->ivar_name, name) == 0) int i;
if (NULL == ivarlist)
{
return NULL;
}
for (i = 0; i < ivarlist->ivar_count; i++)
{
Ivar ivar = &ivarlist->ivar_list[i];
if (strcmp(ivar->ivar_name, name) == 0)
{ {
return ivar; return ivar;
} }
}
cls = class_getSuperclass(cls);
} }
return NULL; }
return NULL;
} }
// The format of the char* is undocumented. This function is only ever used in // The format of the char* is undocumented. This function is only ever used in

Loading…
Cancel
Save