In libobjc/: 2010-10-17 Nicola Pero <nicola.pero@meta-innovation.com>

In libobjc/:
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.

In gcc/:
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.

From-SVN: r165583
This commit is contained in:
Nicola Pero 2010-10-17 11:01:31 +00:00 committed by Nicola Pero
parent 368be4c735
commit 1501d0941a
5 changed files with 35 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -27,12 +27,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#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];
}