This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
libobjc: Call __objc_resolve_class_links() at the end of __objc_exec_class()
- From: "Nicola Pero" <nicola dot pero at meta-innovation dot com>
- To: "gcc-patches at gnu dot org" <gcc-patches at gnu dot org>
- Date: Sun, 19 Dec 2010 18:30:33 +0100 (CET)
- Subject: libobjc: Call __objc_resolve_class_links() at the end of __objc_exec_class()
This patch fixes the fact that libobjc wouldn't resolve class links automatically
after loading new modules ("class links" mean the class-to-superclass pointers).
Hopefully this patch means that gnustep-base, which currently calls __objc_resolve_class_links()
manually after loading a bundle, no longer needs to do it, and __objc_resolve_class_links()
can become the private function it is supposed to be. ;-)
Committed to trunk.
Thanks
Index: init.c
===================================================================
--- init.c (revision 168058)
+++ init.c (working copy)
@@ -31,7 +31,7 @@
#include "objc-private/hash.h"
#include "objc-private/objc-list.h"
#include "objc-private/module-abi-8.h"
-#include "objc-private/runtime.h"
+#include "objc-private/runtime.h" /* For __objc_resolve_class_links(). */
#include "objc-private/selector.h" /* For __sel_register_typed_name(). */
#include "objc-private/objc-sync.h" /* For __objc_sync_init() */
#include "objc-private/protocols.h" /* For __objc_protocols_init(),
@@ -719,11 +719,15 @@
objc_send_load ();
+ /* Check if there are no unresolved classes (ie, classes whose
+ superclass has not been loaded yet) and that the 'Object' class,
+ used as the class of classes, exist. If so, it is worth
+ "resolving the class links" at this point, which will setup all
+ the class/superclass pointers. */
+ if (!unresolved_classes && objc_getClass ("Object"))
+ __objc_resolve_class_links ();
+
objc_mutex_unlock (__objc_runtime_mutex);
-
- /* TODO: Do we need to add a call to __objc_resolve_class_links()
- here ? gnustep-base does it manually after it loads a module.
- Shouldn't we do it automatically ? */
}
static void
Index: ChangeLog
===================================================================
--- ChangeLog (revision 168064)
+++ ChangeLog (working copy)
@@ -1,5 +1,10 @@
2010-12-19 Nicola Pero <nicola.pero@meta-innovation.com>
+ * init.c (__objc_exec_class): Call __objc_resolve_class_links (),
+ if appropriate, after loading the module.
+
+2010-12-19 Nicola Pero <nicola.pero@meta-innovation.com>
+
* sendmsg.c (method_setImplementation): Do not declare.
2010-12-19 Nicola Pero <nicola.pero@meta-innovation.com>