From 032acdeac9dfe6b407a1fcbd9f00c3e1a0dd27aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sat, 5 Feb 2022 23:27:48 +0100 Subject: [PATCH] '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 or has a different length. --- libguile/strings.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libguile/strings.c b/libguile/strings.c index a5b4b0386..5eebb3300 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -763,10 +763,16 @@ 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 + || STRINGBUF_LENGTH (buf) != length)) + { + 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));