aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-06-10 11:59:30 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-06-10 11:59:30 -0400
commit018086d1d0d90af377905aa43d806a465be17d50 (patch)
tree95d7a5883e1f77f6dd84baa9a0aa47ebcf3a84e3 /gcc
parent1717ec59158d5250140e479fd0fa5e57bc67f4e6 (diff)
downloadgcc-018086d1d0d90af377905aa43d806a465be17d50.zip
gcc-018086d1d0d90af377905aa43d806a465be17d50.tar.gz
gcc-018086d1d0d90af377905aa43d806a465be17d50.tar.bz2
(__sel_register_typed_name): Additional parameter that indicates
whether name and type parameters are constant or not. From-SVN: r12262
Diffstat (limited to 'gcc')
-rw-r--r--gcc/objc/init.c7
-rw-r--r--gcc/objc/runtime.h2
-rw-r--r--gcc/objc/selector.c44
3 files changed, 43 insertions, 10 deletions
diff --git a/gcc/objc/init.c b/gcc/objc/init.c
index 340e813..a7229d5 100644
--- a/gcc/objc/init.c
+++ b/gcc/objc/init.c
@@ -65,7 +65,7 @@ BOOL __objc_dangling_categories = NO; /* !T:UNUSED */
extern SEL
__sel_register_typed_name (const char *name, const char *types,
- struct objc_selector *orig);
+ struct objc_selector *orig, BOOL is_const);
/* Run through the statics list, removing modules as soon as all its statics
have been initialized. */
@@ -183,8 +183,11 @@ __objc_exec_class (Module_t module)
const char *name, *type;
name = (char*)selectors[i].sel_id;
type = (char*)selectors[i].sel_types;
+ /* Constructors are constant static data so we can safely store
+ pointers to them in the runtime structures. is_const == YES */
__sel_register_typed_name (name, type,
- (struct objc_selector*)&(selectors[i]));
+ (struct objc_selector*)&(selectors[i]),
+ YES);
}
}
diff --git a/gcc/objc/runtime.h b/gcc/objc/runtime.h
index f298ef4..900ca35 100644
--- a/gcc/objc/runtime.h
+++ b/gcc/objc/runtime.h
@@ -79,7 +79,7 @@ extern int __objc_runtime_threads_alive;
BOOL __objc_responds_to (id object, SEL sel); /* for internal use only! */
SEL __sel_register_typed_name (const char*, const char*,
- struct objc_selector*);
+ struct objc_selector*, BOOL is_const);
#endif /* not __objc_runtime_INCLUDE_GNU */
diff --git a/gcc/objc/selector.c b/gcc/objc/selector.c
index c089d00..26cbba8 100644
--- a/gcc/objc/selector.c
+++ b/gcc/objc/selector.c
@@ -258,9 +258,13 @@ extern struct sarray* __objc_uninstalled_dtable;
/* Store the passed selector name in the selector record and return its
selector value (value returned by sel_get_uid).
Assumes that the calling function has locked down __objc_runtime_mutex. */
+/* is_const parameter tells us if the name and types parameters
+ are really constant or not. If YES then they are constant and
+ we can just store the pointers. If NO then we need to copy
+ name and types because the pointers may disappear later on. */
SEL
__sel_register_typed_name (const char *name, const char *types,
- struct objc_selector *orig)
+ struct objc_selector *orig, BOOL is_const)
{
struct objc_selector* j;
sidx i;
@@ -303,7 +307,13 @@ __sel_register_typed_name (const char *name, const char *types,
j = __objc_xmalloc (sizeof (struct objc_selector));
j->sel_id = (void*)i;
- j->sel_types = (const char*)types;
+ /* Can we use the pointer or must copy types? Don't copy if NULL */
+ if ((is_const) || (types == 0))
+ j->sel_types = (const char*)types;
+ else {
+ j->sel_types = (char *)__objc_xmalloc(strlen(types)+1);
+ strcpy(j->sel_types, types);
+ }
l = (struct objc_list*)sarray_get (__objc_selector_array, i);
}
else
@@ -316,7 +326,13 @@ __sel_register_typed_name (const char *name, const char *types,
j = __objc_xmalloc (sizeof (struct objc_selector));
j->sel_id = (void*)i;
- j->sel_types = (const char*)types;
+ /* Can we use the pointer or must copy types? Don't copy if NULL */
+ if ((is_const) || (types == 0))
+ j->sel_types = (const char*)types;
+ else {
+ j->sel_types = (char *)__objc_xmalloc(strlen(types)+1);
+ strcpy(j->sel_types, types);
+ }
l = 0;
}
@@ -325,11 +341,21 @@ __sel_register_typed_name (const char *name, const char *types,
{
int is_new = (l == 0);
+ char *new_name;
+
+ /* Can we use the pointer or must copy name? Don't copy if NULL */
+ if ((is_const) || (name == 0))
+ new_name = name;
+ else {
+ new_name = (char *)__objc_xmalloc(strlen(name)+1);
+ strcpy(new_name, name);
+ }
+
l = list_cons ((void*)j, l);
- sarray_at_put_safe (__objc_selector_names, i, (void *) name);
+ sarray_at_put_safe (__objc_selector_names, i, (void *) new_name);
sarray_at_put_safe (__objc_selector_array, i, (void *) l);
if (is_new)
- hash_add (&__objc_selector_hash, (void *) name, (void *) i);
+ hash_add (&__objc_selector_hash, (void *) new_name, (void *) i);
}
sarray_realloc(__objc_uninstalled_dtable, __objc_selector_max_index+1);
@@ -343,7 +369,9 @@ sel_register_name (const char *name)
SEL ret;
objc_mutex_lock(__objc_runtime_mutex);
- ret = __sel_register_typed_name (name, 0, 0);
+ /* Assume that name is not constant static memory and needs to be
+ copied before put into a runtime structure. is_const == NO */
+ ret = __sel_register_typed_name (name, 0, 0, NO);
objc_mutex_unlock(__objc_runtime_mutex);
return ret;
@@ -355,7 +383,9 @@ sel_register_typed_name (const char *name, const char *type)
SEL ret;
objc_mutex_lock(__objc_runtime_mutex);
- ret = __sel_register_typed_name (name, type, 0);
+ /* Assume that name and type are not constant static memory and need to
+ be copied before put into a runtime structure. is_const == NO */
+ ret = __sel_register_typed_name (name, type, 0, NO);
objc_mutex_unlock(__objc_runtime_mutex);
return ret;