From 018086d1d0d90af377905aa43d806a465be17d50 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Mon, 10 Jun 1996 11:59:30 -0400 Subject: [PATCH] (__sel_register_typed_name): Additional parameter that indicates whether name and type parameters are constant or not. From-SVN: r12262 --- gcc/objc/init.c | 7 +++++-- gcc/objc/runtime.h | 2 +- gcc/objc/selector.c | 44 +++++++++++++++++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gcc/objc/init.c b/gcc/objc/init.c index 340e8133005..a7229d50f9d 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 f298ef4be30..900ca35d52e 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 c089d006dec..26cbba83d49 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; -- 2.30.2