===================================================================
@@ -107,24 +107,27 @@ instead of @code{+initialize}.
@node What you can and what you cannot do in +load
@subsection What you can and what you cannot do in @code{+load}
-The @code{+load} implementation in the GNU runtime guarantees you the following
-things:
+@code{+load} is to be used only as a last resort. Because it is
+executed very early, most of the Objective-C runtime machinery will
+not be ready when @code{+load} is executed; hence @code{+load} works
+best for executing C code that is independent on the Objective-C
+runtime.
+The @code{+load} implementation in the GNU runtime guarantees you the
+following things:
+
@itemize @bullet
@item
you can write whatever C code you like;
@item
-you can send messages to Objective-C constant strings (@code{@@"this is a
-constant string"});
-
-@item
you can allocate and send messages to objects whose class is implemented
in the same file;
@item
-the @code{+load} implementation of all super classes of a class are executed before the @code{+load} of that class is executed;
+the @code{+load} implementation of all super classes of a class are
+executed before the @code{+load} of that class is executed;
@item
the @code{+load} implementation of a class is executed before the
@@ -144,6 +147,10 @@ allocation of or sending messages to arbitrary obj
allocation of or sending messages to objects whose classes have a
category implemented in the same file;
+@item
+sending messages to Objective-C constant strings (@code{@@"this is a
+constant string"});
+
@end itemize
You should make no assumptions about receiving @code{+load} in sibling
===================================================================
@@ -1,3 +1,9 @@
+2010-10-17 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * doc/objc.texi (What you can and what you cannot do in +load):
+ Document that sending messages to constant string objects in +load
+ is not guaranteed to work.
+
2010-10-16 Jan Hubicka <jh@suse.cz>
PR middle-end/44206
===================================================================
@@ -444,8 +444,7 @@ class_is_subclass_of_class (Class class, Class sup
their superclasses are not yet known to the runtime. */
static struct objc_list *unresolved_classes = 0;
-/* Extern function used to reference the Object and NXConstantString
- classes. */
+/* Extern function used to reference the Object class. */
extern void __objc_force_linking (void);
@@ -755,11 +754,9 @@ objc_send_load (void)
return;
}
- /* Special check to allow creating and sending messages to constant
- strings in +load methods. If these classes are not yet known,
- even if all the other classes are known, delay sending of +load. */
- if (! objc_lookup_class ("NXConstantString") ||
- ! objc_lookup_class ("Object"))
+ /* Special check. If 'Object', which is used by meta-classes, has
+ not been loaded yet, delay sending of +load. */
+ if (! objc_lookup_class ("Object"))
return;
/* Iterate over all modules in the __objc_module_list and call on
===================================================================
@@ -27,12 +27,11 @@ see the files COPYING3 and COPYING.RUNTIME respect
#include <objc/Object.h>
#include <objc/NXConstStr.h>
-/* Generate references to Object and NXConstanstString classes since they are
- needed by the runtime system to run correctly. */
+/* Generate references to Object class since it is needed by the
+ runtime system to run correctly. */
void __objc_linking (void)
{
[Object name];
- [NXConstantString name];
}
===================================================================
@@ -1,3 +1,12 @@
+2010-10-17 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * init.c (objc_send_load): Do not wait for NXConstantString to be
+ registered before executing +load. There is no point if
+ -fconstant-string-class=xxx is used when compiling all modules,
+ as is the case for almost all users.
+ * linking.m (__objc_linking): Do not try to forcefully link in
+ NXConstantString.
+
2010-10-16 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/runtime.h: Updated comments.