From 607bc433c9153c0fe652b14f476765dd95cd93c0 Mon Sep 17 00:00:00 2001 From: rfm Date: Sun, 28 Feb 2010 17:23:02 +0000 Subject: [PATCH] Fix instance variable lookup to match OSX --- objc/runtime.h | 4 ++++ runtime.c | 31 ++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/objc/runtime.h b/objc/runtime.h index 5480aed..cb52fe2 100644 --- a/objc/runtime.h +++ b/objc/runtime.h @@ -135,6 +135,10 @@ Method class_getInstanceMethod(Class aClass, SEL aSelector); 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); const char *class_getIvarLayout(Class cls); diff --git a/runtime.c b/runtime.c index 2548828..bcd326e 100644 --- a/runtime.c +++ b/runtime.c @@ -354,20 +354,33 @@ size_t class_getInstanceSize(Class cls) 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 (NULL == ivarlist) { return NULL; } - - for (int i=0 ; iivar_count ; i++) + if (name != NULL) + { + while (cls != Nil) { - Ivar ivar = &ivarlist->ivar_list[i]; - if (strcmp(ivar->ivar_name, name) == 0) + struct objc_ivar_list *ivarlist = cls->ivars; + 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