[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/02: 'string->symbol' avoids copying the underlying st
From: |
Ludovic Courtès |
Subject: |
[Guile-commits] 01/02: 'string->symbol' avoids copying the underlying string. |
Date: |
Sun, 6 Feb 2022 17:00:57 -0500 (EST) |
civodul pushed a commit to branch wip-tree-il-sourcev
in repository guile.
commit d656176f068a93b15cd093fafa193755d169de31
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sat Feb 5 23:27:48 2022 +0100
'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.
---
libguile/strings.c | 10 +++++++---
1 file 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));