diff options
author | Nicola Pero <nicola.pero@meta-innovation.com> | 2010-10-12 22:00:01 +0000 |
---|---|---|
committer | Nicola Pero <nicola@gcc.gnu.org> | 2010-10-12 22:00:01 +0000 |
commit | ad9eef11dfc362261d3de4231eab7eac352d7f9f (patch) | |
tree | c1e1a95aab3eeed0bec8d3d90946e13dff607e7d /libobjc/ivars.c | |
parent | d761137fee594ee61ab14d121bdac9e051d67b07 (diff) | |
download | gcc-ad9eef11dfc362261d3de4231eab7eac352d7f9f.zip gcc-ad9eef11dfc362261d3de4231eab7eac352d7f9f.tar.gz gcc-ad9eef11dfc362261d3de4231eab7eac352d7f9f.tar.bz2 |
Makefile.in (C_SOURCE_FILES): Added methods.c.
2010-10-12 Nicola Pero <nicola.pero@meta-innovation.com>
* Makefile.in (C_SOURCE_FILES): Added methods.c.
* encoding.c (method_getNumberOfArguments): New.
(method_get_number_of_arguments): Call
method_getNumberOfArguments.
* ivars.c (ivar_getName): Check for NULL variable argument.
(ivar_getOffset): Check for NULL variable argument.
(ivar_getTypeEncoding): Check for NULL variable argument.
(class_copyIvarList): New.
* methods.c: New.
* protocols.c (class_copyProtocolList): Check for Nil class_
argument.
* sendmsg.c: Use 'struct objc_method *' instead of Method_t, and
'struct objc_method_list *' instead of MethodList_t.
(class_getMethodImplementation): New.
(class_respondsToSelector): New.
(class_getInstanceMethod): New.
(class_getClassMethod): New.
* objc/runtime.h: Updated comments.
(class_copyIvarList): New.
(class_getInstanceMethod): New.
(class_getClassMethod): New.
(class_getMethodImplementation): New.
(class_respondsToSelector): New.
(method_getName): New.
(method_getImplementation): New.
(method_getTypeEncoding): New.
(class_copyMethodList): New.
(method_getNumberOfArguments): New.
From-SVN: r165400
Diffstat (limited to 'libobjc/ivars.c')
-rw-r--r-- | libobjc/ivars.c | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/libobjc/ivars.c b/libobjc/ivars.c index 52b71af..0dbb45b 100644 --- a/libobjc/ivars.c +++ b/libobjc/ivars.c @@ -26,8 +26,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "objc/runtime.h" #include "objc-private/module-abi-8.h" /* For runtime structures */ #include "objc/thr.h" -#include "objc-private/runtime.h" /* the kitchen sink */ -#include <string.h> /* For strcmp */ +#include "objc-private/runtime.h" /* the kitchen sink */ +#include <string.h> /* For strcmp */ struct objc_ivar * class_getInstanceVariable (Class class_, const char *name) @@ -157,15 +157,74 @@ void object_setIvar (id object, struct objc_ivar * variable, id value) const char * ivar_getName (struct objc_ivar * variable) { + if (variable == NULL) + return NULL; + return variable->ivar_name; } ptrdiff_t ivar_getOffset (struct objc_ivar * variable) { + if (variable == NULL) + return 0; + return (ptrdiff_t)(variable->ivar_offset); } const char * ivar_getTypeEncoding (struct objc_ivar * variable) { + if (variable == NULL) + return NULL; + return variable->ivar_type; } + +struct objc_ivar ** class_copyIvarList (Class class_, unsigned int *numberOfReturnedIvars) +{ + unsigned int count = 0; + struct objc_ivar **returnValue = NULL; + struct objc_ivar_list* ivar_list; + + if (class_ == Nil) + { + if (numberOfReturnedIvars) + *numberOfReturnedIvars = 0; + return NULL; + } + + /* TODO: We do not need to lock the runtime mutex if the class has + been registered with the runtime, since the instance variable + list can not change after the class is registered. The only case + where the lock may be useful if the class is still being created + using objc_allocateClassPair(), but has not been registered using + objc_registerClassPair() yet. I'm not even sure that is + allowed. */ + objc_mutex_lock (__objc_runtime_mutex); + + /* Count how many ivars we have. */ + ivar_list = class_->ivars; + count = ivar_list->ivar_count; + + if (count != 0) + { + unsigned int i = 0; + + /* Allocate enough memory to hold them. */ + returnValue = (struct objc_ivar **)(malloc (sizeof (struct objc_ivar *) * (count + 1))); + + /* Copy the ivars. */ + for (i = 0; i < count; i++) + { + returnValue[i] = &(ivar_list->ivar_list[i]); + } + + returnValue[i] = NULL; + } + + objc_mutex_unlock (__objc_runtime_mutex); + + if (numberOfReturnedIvars) + *numberOfReturnedIvars = count; + + return returnValue; +} |