# 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);
}