summaryrefslogtreecommitdiff
path: root/libobjc/methods.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/methods.c
parentd761137fee594ee61ab14d121bdac9e051d67b07 (diff)
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/methods.c')
-rw-r--r--libobjc/methods.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/libobjc/methods.c b/libobjc/methods.c
new file mode 100644
index 00000000000..c6236a100e7
--- /dev/null
+++ b/libobjc/methods.c
@@ -0,0 +1,114 @@
+/* GNU Objective C Runtime method related functions.
+ Copyright (C) 2010 Free Software Foundation, Inc.
+ Contributed by Nicola Pero
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3, or (at your option) any later version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#include "objc-private/common.h"
+#include "objc/runtime.h"
+#include "objc-private/module-abi-8.h" /* For runtime structures. */
+#include "objc/thr.h"
+#include "objc-private/runtime.h" /* For __objc_runtime_mutex. */
+#include <stdlib.h> /* For malloc. */
+
+SEL method_getName (struct objc_method * method)
+{
+ if (method == NULL)
+ return NULL;
+
+ return method->method_name;
+}
+
+const char * method_getTypeEncoding (struct objc_method * method)
+{
+ if (method == NULL)
+ return NULL;
+
+ return method->method_types;
+}
+
+IMP method_getImplementation (struct objc_method * method)
+{
+ if (method == NULL)
+ return NULL;
+
+ return method->method_imp;
+}
+
+struct objc_method ** class_copyMethodList (Class class_, unsigned int *numberOfReturnedMethods)
+{
+ unsigned int count = 0;
+ struct objc_method **returnValue = NULL;
+ struct objc_method_list* method_list;
+
+ if (class_ == Nil)
+ {
+ if (numberOfReturnedMethods)
+ *numberOfReturnedMethods = 0;
+ return NULL;
+ }
+
+ /* Lock the runtime mutex because the class methods may be
+ concurrently modified. */
+ objc_mutex_lock (__objc_runtime_mutex);
+
+ /* Count how many methods we have. */
+ method_list = class_->methods;
+
+ while (method_list)
+ {
+ count = count + method_list->method_count;
+ method_list = method_list->method_next;
+ }
+
+ if (count != 0)
+ {
+ unsigned int i = 0;
+
+ /* Allocate enough memory to hold them. */
+ returnValue
+ = (struct objc_method **)(malloc (sizeof (struct objc_method *)
+ * (count + 1)));
+
+ /* Copy the methods. */
+ method_list = class_->methods;
+
+ while (method_list)
+ {
+ int j;
+ for (j = 0; j < method_list->method_count; j++)
+ {
+ returnValue[i] = &(method_list->method_list[j]);
+ i++;
+ }
+ method_list = method_list->method_next;
+ }
+
+ returnValue[i] = NULL;
+ }
+
+ objc_mutex_unlock (__objc_runtime_mutex);
+
+ if (numberOfReturnedMethods)
+ *numberOfReturnedMethods = count;
+
+ return returnValue;
+}