From 1501d0941a5d845d923b30c6199ce0f8b792bdc8 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Sun, 17 Oct 2010 11:01:31 +0000 Subject: [PATCH] In libobjc/: 2010-10-17 Nicola Pero In libobjc/: 2010-10-17 Nicola Pero * 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. In gcc/: 2010-10-17 Nicola Pero * 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. From-SVN: r165583 --- gcc/ChangeLog | 6 ++++++ gcc/doc/objc.texi | 21 ++++++++++++++------- libobjc/ChangeLog | 9 +++++++++ libobjc/init.c | 11 ++++------- libobjc/linking.m | 5 ++--- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e65867d0809..47254d31f12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-17 Nicola Pero + + * 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 PR middle-end/44206 diff --git a/gcc/doc/objc.texi b/gcc/doc/objc.texi index 87c985d1e67..f0fab6be827 100644 --- a/gcc/doc/objc.texi +++ b/gcc/doc/objc.texi @@ -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 objects; 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 diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index 1d2b2948605..6e70ac762ea 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,12 @@ +2010-10-17 Nicola Pero + + * 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 * objc/runtime.h: Updated comments. diff --git a/libobjc/init.c b/libobjc/init.c index dd8789c9cac..d87a587a8af 100644 --- a/libobjc/init.c +++ b/libobjc/init.c @@ -444,8 +444,7 @@ class_is_subclass_of_class (Class class, Class superclass) 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 diff --git a/libobjc/linking.m b/libobjc/linking.m index e94c8ea8c4b..4438a668ce4 100644 --- a/libobjc/linking.m +++ b/libobjc/linking.m @@ -27,12 +27,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include #include -/* 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]; }