mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
'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.
This commit is contained in:
parent
8e2e2ceb17
commit
d656176f06
1 changed files with 7 additions and 3 deletions
|
@ -763,10 +763,14 @@ SCM
|
||||||
scm_i_make_symbol (SCM name, scm_t_bits flags, unsigned long hash)
|
scm_i_make_symbol (SCM name, scm_t_bits flags, unsigned long hash)
|
||||||
{
|
{
|
||||||
SCM buf, symbol;
|
SCM buf, symbol;
|
||||||
size_t length = STRING_LENGTH (name);
|
size_t start, length = STRING_LENGTH (name);
|
||||||
|
|
||||||
|
get_str_buf_start (&name, &buf, &start);
|
||||||
|
if (SCM_UNLIKELY (STRINGBUF_MUTABLE (buf) || start != 0))
|
||||||
|
{
|
||||||
name = scm_i_substring_copy (name, 0, length);
|
name = scm_i_substring_copy (name, 0, length);
|
||||||
buf = STRING_STRINGBUF (name);
|
buf = STRING_STRINGBUF (name);
|
||||||
|
}
|
||||||
|
|
||||||
symbol = scm_words (scm_tc7_symbol | flags, 3);
|
symbol = scm_words (scm_tc7_symbol | flags, 3);
|
||||||
SCM_SET_CELL_WORD_1 (symbol, SCM_UNPACK (buf));
|
SCM_SET_CELL_WORD_1 (symbol, SCM_UNPACK (buf));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue