diff options
author | Ludovic Courtès <ludo@gnu.org> | 2022-02-05 23:27:48 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2022-02-05 23:27:48 +0100 |
commit | d656176f068a93b15cd093fafa193755d169de31 (patch) | |
tree | 47a01f9bc9b5c4cb2fb0da47d825ca9d4b84fbcf | |
parent | 8e2e2ceb1745620bef318fc403b6dea2c590f318 (diff) | |
download | guile-d656176f068a93b15cd093fafa193755d169de31.tar.gz |
'string->symbol' avoids copying the underlying string.
* libguile/strings.c (scm_i_make_symbol): Reuse NAME's stringbuf unless
it's mutable or NAME starts at a non-zero offset.
-rw-r--r-- | libguile/strings.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/libguile/strings.c b/libguile/strings.c index a5b4b0386..a48f82b4a 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -763,10 +763,14 @@ SCM scm_i_make_symbol (SCM name, scm_t_bits flags, unsigned long hash) { SCM buf, symbol; - size_t length = STRING_LENGTH (name); + size_t start, length = STRING_LENGTH (name); - name = scm_i_substring_copy (name, 0, length); - buf = STRING_STRINGBUF (name); + get_str_buf_start (&name, &buf, &start); + if (SCM_UNLIKELY (STRINGBUF_MUTABLE (buf) || start != 0)) + { + name = scm_i_substring_copy (name, 0, length); + buf = STRING_STRINGBUF (name); + } symbol = scm_words (scm_tc7_symbol | flags, 3); SCM_SET_CELL_WORD_1 (symbol, SCM_UNPACK (buf)); |