mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
368be4c735
commit
1501d0941a
|
@ -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>
|
2010-10-16 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
PR middle-end/44206
|
PR middle-end/44206
|
||||||
|
|
|
@ -107,24 +107,27 @@ instead of @code{+initialize}.
|
||||||
@node What you can and what you cannot do in +load
|
@node What you can and what you cannot do in +load
|
||||||
@subsection What you can and what you cannot do in @code{+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
|
@code{+load} is to be used only as a last resort. Because it is
|
||||||
things:
|
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
|
@itemize @bullet
|
||||||
|
|
||||||
@item
|
@item
|
||||||
you can write whatever C code you like;
|
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
|
@item
|
||||||
you can allocate and send messages to objects whose class is implemented
|
you can allocate and send messages to objects whose class is implemented
|
||||||
in the same file;
|
in the same file;
|
||||||
|
|
||||||
@item
|
@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
|
@item
|
||||||
the @code{+load} implementation of a class is executed before the
|
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
|
allocation of or sending messages to objects whose classes have a
|
||||||
category implemented in the same file;
|
category implemented in the same file;
|
||||||
|
|
||||||
|
@item
|
||||||
|
sending messages to Objective-C constant strings (@code{@@"this is a
|
||||||
|
constant string"});
|
||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
You should make no assumptions about receiving @code{+load} in sibling
|
You should make no assumptions about receiving @code{+load} in sibling
|
||||||
|
|
|
@ -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>
|
2010-10-16 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||||
|
|
||||||
* objc/runtime.h: Updated comments.
|
* objc/runtime.h: Updated comments.
|
||||||
|
|
|
@ -444,8 +444,7 @@ class_is_subclass_of_class (Class class, Class superclass)
|
||||||
their superclasses are not yet known to the runtime. */
|
their superclasses are not yet known to the runtime. */
|
||||||
static struct objc_list *unresolved_classes = 0;
|
static struct objc_list *unresolved_classes = 0;
|
||||||
|
|
||||||
/* Extern function used to reference the Object and NXConstantString
|
/* Extern function used to reference the Object class. */
|
||||||
classes. */
|
|
||||||
|
|
||||||
extern void __objc_force_linking (void);
|
extern void __objc_force_linking (void);
|
||||||
|
|
||||||
|
@ -755,11 +754,9 @@ objc_send_load (void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Special check to allow creating and sending messages to constant
|
/* Special check. If 'Object', which is used by meta-classes, has
|
||||||
strings in +load methods. If these classes are not yet known,
|
not been loaded yet, delay sending of +load. */
|
||||||
even if all the other classes are known, delay sending of +load. */
|
if (! objc_lookup_class ("Object"))
|
||||||
if (! objc_lookup_class ("NXConstantString") ||
|
|
||||||
! objc_lookup_class ("Object"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Iterate over all modules in the __objc_module_list and call on
|
/* Iterate over all modules in the __objc_module_list and call on
|
||||||
|
|
|
@ -27,12 +27,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||||
#include <objc/Object.h>
|
#include <objc/Object.h>
|
||||||
#include <objc/NXConstStr.h>
|
#include <objc/NXConstStr.h>
|
||||||
|
|
||||||
/* Generate references to Object and NXConstanstString classes since they are
|
/* Generate references to Object class since it is needed by the
|
||||||
needed by the runtime system to run correctly. */
|
runtime system to run correctly. */
|
||||||
|
|
||||||
void __objc_linking (void)
|
void __objc_linking (void)
|
||||||
{
|
{
|
||||||
[Object name];
|
[Object name];
|
||||||
[NXConstantString name];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue