diff options
author | Mark H Weaver <mhw@netris.org> | 2012-01-10 09:39:57 -0500 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2012-01-10 09:39:57 -0500 |
commit | 17bec5451bfb14c1412669a40b78e483dfe56933 (patch) | |
tree | 9101b9eb2d8a3177c2f4f01f73b868e4498a94c3 /libguile/strings.c | |
parent | d6a569c191e14ed756135cff3de35371b1b8757b (diff) | |
download | guile-17bec5451bfb14c1412669a40b78e483dfe56933.tar.gz |
Empty substrings no longer reference the original stringbuf
* libguile/strings.c (scm_i_substring, scm_i_substring_read_only,
scm_i_substring_shared): When asked to create an empty substring,
return a freshly allocated null string. Previously, an empty
substring needlessly held a reference to the original stringbuf.
Diffstat (limited to 'libguile/strings.c')
-rw-r--r-- | libguile/strings.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/libguile/strings.c b/libguile/strings.c index 2aa226d3e..5dcb321e4 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -320,29 +320,39 @@ get_str_buf_start (SCM *str, SCM *buf, size_t *start) SCM scm_i_substring (SCM str, size_t start, size_t end) { - SCM buf; - size_t str_start; - get_str_buf_start (&str, &buf, &str_start); - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); - return scm_double_cell (STRING_TAG, SCM_UNPACK(buf), - (scm_t_bits)str_start + start, - (scm_t_bits) end - start); + if (start == end) + return scm_i_make_string (0, NULL, 0); + else + { + SCM buf; + size_t str_start; + get_str_buf_start (&str, &buf, &str_start); + scm_i_pthread_mutex_lock (&stringbuf_write_mutex); + SET_STRINGBUF_SHARED (buf); + scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + return scm_double_cell (STRING_TAG, SCM_UNPACK(buf), + (scm_t_bits)str_start + start, + (scm_t_bits) end - start); + } } SCM scm_i_substring_read_only (SCM str, size_t start, size_t end) { - SCM buf; - size_t str_start; - get_str_buf_start (&str, &buf, &str_start); - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); - return scm_double_cell (RO_STRING_TAG, SCM_UNPACK(buf), - (scm_t_bits)str_start + start, - (scm_t_bits) end - start); + if (start == end) + return scm_i_make_string (0, NULL, 1); + else + { + SCM buf; + size_t str_start; + get_str_buf_start (&str, &buf, &str_start); + scm_i_pthread_mutex_lock (&stringbuf_write_mutex); + SET_STRINGBUF_SHARED (buf); + scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + return scm_double_cell (RO_STRING_TAG, SCM_UNPACK(buf), + (scm_t_bits)str_start + start, + (scm_t_bits) end - start); + } } SCM @@ -380,7 +390,9 @@ scm_i_substring_shared (SCM str, size_t start, size_t end) { if (start == 0 && end == STRING_LENGTH (str)) return str; - else + else if (start == end) + return scm_i_make_string (0, NULL, 0); + else { size_t len = end - start; if (IS_SH_STRING (str)) |