aboutsummaryrefslogtreecommitdiff
path: root/libobjc/ivars.c
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2010-10-12 22:00:01 +0000
committerNicola Pero <nicola@gcc.gnu.org>2010-10-12 22:00:01 +0000
commitad9eef11dfc362261d3de4231eab7eac352d7f9f (patch)
treec1e1a95aab3eeed0bec8d3d90946e13dff607e7d /libobjc/ivars.c
parentd761137fee594ee61ab14d121bdac9e051d67b07 (diff)
downloadgcc-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.c63
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;
+}