# New Ticket Created by  NotFound 
# Please include the string:  [perl #56868]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=56868 >


This is another attempt to add a Parrot_string_empty function to
replace a lot of CONST_STRING and const_string with "" usages.

Instead of creating a new function on each usage like the previous
version, now creates one with const_string "" during string subsystem
initialization and always returns that.

-- 
Salu2
Index: src/string.c
===================================================================
--- src/string.c	(revisión: 29333)
+++ src/string.c	(copia de trabajo)
@@ -204,6 +204,24 @@
 
 /*
 
+=item C<STRING * Parrot_string_empty>
+
+Returns an empty string.
+
+= cut
+
+*/
+
+PARROT_API
+PARROT_CANNOT_RETURN_NULL
+STRING *
+Parrot_string_empty(PARROT_INTERP)
+{
+    return interp->const_empty_string;
+}
+
+/*
+
 =item C<STRING * string_set>
 
 Makes the contents of first Parrot string a copy of the contents of
@@ -267,6 +285,7 @@
         parrot_new_cstring_hash(interp, &const_cstring_hash);
         interp->const_cstring_hash  = (Hash *)const_cstring_hash;
         Parrot_charsets_encodings_init(interp);
+        interp->const_empty_string = const_string(interp, "");
     }
     /* initialize the constant string table */
     else {
@@ -274,9 +293,12 @@
             interp->parent_interpreter->const_cstring_table;
         interp->const_cstring_hash  =
             interp->parent_interpreter->const_cstring_hash;
+        interp->const_empty_string =
+            interp->parent_interpreter->const_empty_string;
         return;
     }
 
+
     interp->const_cstring_table =
         mem_allocate_n_zeroed_typed(n_parrot_cstrings, STRING *);
 
Index: src/inter_misc.c
===================================================================
--- src/inter_misc.c	(revisión: 29333)
+++ src/inter_misc.c	(copia de trabajo)
@@ -461,7 +461,7 @@
         case CPU_ARCH:
         case CPU_TYPE:
         default:
-            return CONST_STRING(interp, "");
+            return Parrot_string_empty(interp);
     }
 }
 
Index: src/pmc/role.pmc
===================================================================
--- src/pmc/role.pmc	(revisión: 29333)
+++ src/pmc/role.pmc	(copia de trabajo)
@@ -228,7 +228,7 @@
         PObj_active_destroy_SET(SELF);
 
         /* Set up the object. */
-        role->name            = CONST_STRING(interp, "");
+        role->name            = Parrot_string_empty(interp);
         role->_namespace      = PMCNULL;
         role->roles           = pmc_new(interp, enum_class_ResizablePMCArray);
         role->methods         = pmc_new(interp, enum_class_Hash);
Index: src/pmc/class.pmc
===================================================================
--- src/pmc/class.pmc	(revisión: 29333)
+++ src/pmc/class.pmc	(copia de trabajo)
@@ -460,7 +460,7 @@
 
         /* Set up the object. */
         PMC_data(SELF)          = _class;
-        _class->name            = CONST_STRING(interp, "");
+        _class->name            = Parrot_string_empty(interp);
         _class->_namespace      = PMCNULL;
         _class->parents         = pmc_new(interp, enum_class_ResizablePMCArray);
         _class->all_parents     = pmc_new(interp, enum_class_ResizablePMCArray);
@@ -956,7 +956,7 @@
 
         Parrot_Class * const new_class = PARROT_CLASS(copy);
 
-        new_class->name                = CONST_STRING(interp, "");
+        new_class->name                = Parrot_string_empty(interp);
         new_class->_namespace          = PMCNULL;
         new_class->parents             = VTABLE_clone(interp, _class->parents);
         new_class->roles               = VTABLE_clone(interp, _class->roles);
@@ -1385,7 +1385,7 @@
     VTABLE void freeze(visit_info *info) {
         IMAGE_IO     * const io         = info->image_io;
         Parrot_Class * const class_data = PARROT_CLASS(SELF);
-        STRING       *serial_namespace  = CONST_STRING(interp, "");
+        STRING       *serial_namespace  = Parrot_string_empty(interp);
 
         /* 1) freeze class id */
         VTABLE_push_integer(INTERP, io, class_data->id);
Index: src/pmc/exporter.pmc
===================================================================
--- src/pmc/exporter.pmc	(revisión: 29333)
+++ src/pmc/exporter.pmc	(copia de trabajo)
@@ -249,7 +249,7 @@
         STRING          *s_hash = CONST_STRING(interp, "hash");
 
         if (got_glb) {
-            STRING * const s_empty      = CONST_STRING(interp, "");
+            STRING * const s_empty      = Parrot_string_empty(interp);
             PMC           *temp_globals = pmc_new(interp, enum_class_Hash);
 
             if (PMC_IS_NULL(glb)) {
Index: src/pmc/eventhandler.pmc
===================================================================
--- src/pmc/eventhandler.pmc	(revisión: 29333)
+++ src/pmc/eventhandler.pmc	(copia de trabajo)
@@ -196,7 +196,7 @@
         if (e)
             return string_copy(INTERP, e->type);
 
-        return CONST_STRING(INTERP, "");
+        return Parrot_string_empty(INTERP);
     }
 
 /*
Index: src/pmc/env.pmc
===================================================================
--- src/pmc/env.pmc	(revisión: 29333)
+++ src/pmc/env.pmc	(copia de trabajo)
@@ -145,7 +145,7 @@
     VTABLE STRING *get_string_keyed(PMC *key) {
         if ((PObj_get_FLAGS(key) & KEY_type_FLAGS) == KEY_integer_FLAG) {
             if (PMC_int_val(key) < 0 || PMC_int_val(key) >= SELF.elements()) {
-                return CONST_STRING(interp, "");
+                return Parrot_string_empty(interp);
             }
             else {
                 const char * const envp = environ[PMC_int_val(key)];
@@ -174,7 +174,7 @@
                 }
             }
 
-            return CONST_STRING(interp, "");
+            return Parrot_string_empty(interp);
         }
     }
 
@@ -209,7 +209,7 @@
         }
 
         if (!retval)
-            retval = CONST_STRING(INTERP, "");
+            retval = Parrot_string_empty(INTERP);
 
         return_pmc = pmc_new(INTERP, enum_class_String);
 
Index: src/pmc/task.pmc
===================================================================
--- src/pmc/task.pmc	(revisión: 29333)
+++ src/pmc/task.pmc	(copia de trabajo)
@@ -53,8 +53,8 @@
         /* Set up the core struct. */
         PMC_data(SELF)           = core_struct;
         core_struct->id          = 0;
-        core_struct->type        = CONST_STRING(interp, "");
-        core_struct->subtype     = CONST_STRING(interp, "");
+        core_struct->type        = Parrot_string_empty(interp);
+        core_struct->subtype     = Parrot_string_empty(interp);
         core_struct->priority    = 0;
         core_struct->status      = CONST_STRING(interp, "created");
         core_struct->birthtime   = 0.0;
@@ -142,13 +142,13 @@
         if (! PMC_IS_NULL(elem))
             core_struct->type = VTABLE_get_string(INTERP, elem);
         else
-            core_struct->type = CONST_STRING(INTERP, "");
+            core_struct->type = Parrot_string_empty(INTERP);
 
         elem = VTABLE_get_pmc_keyed_str(INTERP, data, CONST_STRING(INTERP, "subtype"));
         if (! PMC_IS_NULL(elem))
             core_struct->subtype = VTABLE_get_string(INTERP, elem);
         else
-            core_struct->subtype = CONST_STRING(INTERP, "");
+            core_struct->subtype = Parrot_string_empty(INTERP);
 
         elem = VTABLE_get_pmc_keyed_str(INTERP, data, CONST_STRING(INTERP, "priority"));
         if (! PMC_IS_NULL(elem))
Index: src/pmc/timer.pmc
===================================================================
--- src/pmc/timer.pmc	(revisión: 29333)
+++ src/pmc/timer.pmc	(copia de trabajo)
@@ -95,7 +95,7 @@
         PMC_data(SELF)           = core_struct;
         core_struct->id          = 0;
         core_struct->type        = CONST_STRING(interp, "timer");
-        core_struct->subtype     = CONST_STRING(interp, "");
+        core_struct->subtype     = Parrot_string_empty(interp);
         core_struct->priority    = 0;
         core_struct->status      = CONST_STRING(interp, "created");
         core_struct->birthtime   = 0.0;
Index: src/pmc/fixedpmcarray.pmc
===================================================================
--- src/pmc/fixedpmcarray.pmc	(revisión: 29333)
+++ src/pmc/fixedpmcarray.pmc	(copia de trabajo)
@@ -281,7 +281,7 @@
         PMC * const tempPMC = SELF.get_pmc_keyed_int(key);
 
         if (PMC_IS_NULL(tempPMC))
-            return CONST_STRING(interp, "");
+            return Parrot_string_empty(interp);
 
         return VTABLE_get_string(INTERP, tempPMC);
     }
Index: src/pmc/codestring.pmc
===================================================================
--- src/pmc/codestring.pmc	(revisión: 29333)
+++ src/pmc/codestring.pmc	(copia de trabajo)
@@ -216,7 +216,7 @@
     STRING *close_bracket = CONST_STRING(INTERP, "]");
     STRING *s_array       = CONST_STRING(INTERP, "array");
     STRING *prefix        = open_bracket;
-    STRING *out           = CONST_STRING(INTERP, "");
+    STRING *out           = Parrot_string_empty(INTERP);
     INTVAL elements, index;
 
     elements     = VTABLE_elements(INTERP, args);
Index: src/pmc/pmcproxy.pmc
===================================================================
--- src/pmc/pmcproxy.pmc	(revisión: 29333)
+++ src/pmc/pmcproxy.pmc	(copia de trabajo)
@@ -87,7 +87,7 @@
 
         /* Set up the object. */
         _pmc->id               = 0;
-        _pmc->name             = CONST_STRING(interp, "");
+        _pmc->name             = Parrot_string_empty(interp);
         _pmc->_namespace       = PMCNULL;
         _pmc->parents          = pmc_new(interp, enum_class_ResizablePMCArray);
         _pmc->all_parents      = pmc_new(interp, enum_class_ResizablePMCArray);
Index: src/pmc/schedulermessage.pmc
===================================================================
--- src/pmc/schedulermessage.pmc	(revisión: 29333)
+++ src/pmc/schedulermessage.pmc	(copia de trabajo)
@@ -47,7 +47,7 @@
         /* Set up the core struct. */
         PMC_data(SELF)           = core_struct;
         core_struct->id          = 0;
-        core_struct->type        = CONST_STRING(INTERP, "");
+        core_struct->type        = Parrot_string_empty(INTERP);
         core_struct->data        = PMCNULL;
     }
 
Index: src/pmc/key.pmc
===================================================================
--- src/pmc/key.pmc	(revisión: 29333)
+++ src/pmc/key.pmc	(copia de trabajo)
@@ -147,7 +147,7 @@
         if (PObj_get_FLAGS(SELF) & KEY_type_FLAGS)
             return key_string(INTERP, SELF);
 
-        return CONST_STRING(INTERP, "");
+        return Parrot_string_empty(INTERP);
     }
 
 /*
Index: src/pmc/sub.pmc
===================================================================
--- src/pmc/sub.pmc	(revisión: 29333)
+++ src/pmc/sub.pmc	(copia de trabajo)
@@ -492,7 +492,7 @@
 
         hll_name = Parrot_get_HLL_name(INTERP, sub->HLL_id);
         if (!hll_name)
-            hll_name = CONST_STRING(INTERP, "");
+            hll_name = Parrot_string_empty(INTERP);
 
         VTABLE_push_string(INTERP, io, hll_name);
 
@@ -503,7 +503,7 @@
             VTABLE_push_integer(INTERP, io, sub->n_regs_used[i]);
 
         if (!sub->lexid)
-            sub->lexid = CONST_STRING(INTERP, "");
+            sub->lexid = Parrot_string_empty(INTERP);
         VTABLE_push_string(INTERP, io, sub->lexid);
     }
 
Index: src/pmc/parrotio.pmc
===================================================================
--- src/pmc/parrotio.pmc	(revisión: 29333)
+++ src/pmc/parrotio.pmc	(copia de trabajo)
@@ -493,7 +493,7 @@
                 if (last)
                     return string_from_cstring(INTERP, last->name, 0);
 
-                return CONST_STRING(INTERP, "");
+                return Parrot_string_empty(INTERP);
             }
 
             for (++n; n && layer; layer = layer->down, ++n)
@@ -503,7 +503,7 @@
                 return string_from_cstring(INTERP, layer->name, 0);
         }
 
-        return CONST_STRING(INTERP, "");
+        return Parrot_string_empty(INTERP);
     }
 /*
 
Index: src/library.c
===================================================================
--- src/library.c	(revisión: 29333)
+++ src/library.c	(copia de trabajo)
@@ -175,7 +175,7 @@
             PARROT_LIB_PATH_DYNEXT, paths);
     entry = CONST_STRING(interp, "runtime/parrot/dynext/");
     VTABLE_push_string(interp, paths, entry);
-    entry = CONST_STRING(interp, "");
+    entry = Parrot_string_empty(interp);
     VTABLE_push_string(interp, paths, entry);
     entry = CONST_STRING(interp, "lib/parrot/dynext/");
     VTABLE_push_string(interp, paths, entry);
Index: src/dynpmc/gdbmhash.pmc
===================================================================
--- src/dynpmc/gdbmhash.pmc	(revisión: 29333)
+++ src/dynpmc/gdbmhash.pmc	(copia de trabajo)
@@ -222,9 +222,9 @@
         datum key_gdbm, val_gdbm;
 
         if (!key)
-            return CONST_STRING(INTERP, "");
+            return Parrot_string_empty(INTERP);
         if (!dbf)
-            return CONST_STRING(INTERP, "");
+            return Parrot_string_empty(INTERP);
         keystr = make_hash_key(interp, key);
 
         key_gdbm.dsize = keystr->strlen;
Index: include/parrot/string_funcs.h
===================================================================
--- include/parrot/string_funcs.h	(revisión: 29333)
+++ include/parrot/string_funcs.h	(copia de trabajo)
@@ -59,6 +59,11 @@
         __attribute__nonnull__(2);
 
 PARROT_API
+PARROT_CANNOT_RETURN_NULL
+STRING * Parrot_string_empty(PARROT_INTERP)
+        __attribute__nonnull__(1);
+
+PARROT_API
 PARROT_WARN_UNUSED_RESULT
 INTVAL Parrot_string_find_cclass(PARROT_INTERP,
     INTVAL flags,
@@ -87,6 +92,14 @@
 
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
+PARROT_CANNOT_RETURN_NULL
+PMC* Parrot_string_split(PARROT_INTERP,
+    ARGIN_NULLOK(STRING *delim),
+    ARGIN_NULLOK(STRING *str))
+        __attribute__nonnull__(1);
+
+PARROT_API
+PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 STRING* Parrot_string_trans_charset(PARROT_INTERP,
     ARGMOD_NULLOK(STRING *src),
@@ -426,14 +439,6 @@
 
 PARROT_API
 PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-PMC* Parrot_string_split(PARROT_INTERP,
-    ARGIN_NULLOK(STRING *delim),
-    ARGIN_NULLOK(STRING *str))
-        __attribute__nonnull__(1);
-
-PARROT_API
-PARROT_WARN_UNUSED_RESULT
 INTVAL string_str_index(PARROT_INTERP,
     ARGIN(const STRING *s),
     ARGIN(const STRING *s2),
Index: include/parrot/interpreter.h
===================================================================
--- include/parrot/interpreter.h	(revisión: 29333)
+++ include/parrot/interpreter.h	(copia de trabajo)
@@ -389,6 +389,7 @@
 
     STRING     **const_cstring_table;         /* CONST_STRING(x) items */
     Hash        *const_cstring_hash;          /* cache of const_string items */
+    STRING      *const_empty_string;          /* Empty string is special */
 
     struct QUEUE* task_queue;                 /* per interpreter queue */
     struct _handler_node_t *exit_handler_list;/* exit.c */
Index: languages/pipp/src/pmc/phpboolean.pmc
===================================================================
--- languages/pipp/src/pmc/phpboolean.pmc	(revisión: 29333)
+++ languages/pipp/src/pmc/phpboolean.pmc	(copia de trabajo)
@@ -54,7 +54,7 @@
         if (PMC_int_val(SELF))
             return const_string(INTERP, "1");
         else
-            return const_string(INTERP, "");
+            return Parrot_string_empty(INTERP);
     }
 
 

Reply via email to