mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +02:00
optimize symbol printing
* libguile/print.h: Remove internal declaration of scm_i_print_symbol_name. * libguile/print.c (symbol_has_extended_read_syntax): Optimize to avoid calling symbol_to_string if we know the symbol cannot be mistaken for a number. (print_normal_symbol): Optimize to call display_string directly, instead of jumping through scm_display. (print_symbol): Rename from scm_i_print_symbol_name. (scm_print_symbol_name, iprin1): Adapt to print_symbol name change.
This commit is contained in:
parent
f6e6b5181a
commit
4164dd6d1f
2 changed files with 61 additions and 23 deletions
|
@ -332,6 +332,7 @@ quote_keywordish_symbols (void)
|
||||||
(INITIAL_IDENTIFIER_MASK \
|
(INITIAL_IDENTIFIER_MASK \
|
||||||
| UC_CATEGORY_MASK_Nd | UC_CATEGORY_MASK_Mc | UC_CATEGORY_MASK_Me)
|
| UC_CATEGORY_MASK_Nd | UC_CATEGORY_MASK_Mc | UC_CATEGORY_MASK_Me)
|
||||||
|
|
||||||
|
/* FIXME: Cache this information on the symbol, somehow. */
|
||||||
static int
|
static int
|
||||||
symbol_has_extended_read_syntax (SCM sym)
|
symbol_has_extended_read_syntax (SCM sym)
|
||||||
{
|
{
|
||||||
|
@ -344,26 +345,56 @@ symbol_has_extended_read_syntax (SCM sym)
|
||||||
|
|
||||||
c = scm_i_symbol_ref (sym, 0);
|
c = scm_i_symbol_ref (sym, 0);
|
||||||
|
|
||||||
/* Single dot; conflicts with dotted-pair notation. */
|
switch (c)
|
||||||
if (len == 1 && c == '.')
|
{
|
||||||
return 1;
|
case '\'':
|
||||||
|
case '`':
|
||||||
|
case ',':
|
||||||
|
case '"':
|
||||||
|
case ';':
|
||||||
|
case '#':
|
||||||
|
/* Some initial-character constraints. */
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case ':':
|
||||||
|
/* Symbols that look like keywords. */
|
||||||
|
return quote_keywordish_symbols ();
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
/* Single dot conflicts with dotted-pair notation. */
|
||||||
|
if (len == 1)
|
||||||
|
return 1;
|
||||||
|
/* Fall through to check numbers. */
|
||||||
|
case '+':
|
||||||
|
case '-':
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
/* Number-ish symbols. Numbers with radixes already caught be #
|
||||||
|
above. */
|
||||||
|
if (scm_is_true (scm_i_string_to_number (scm_symbol_to_string (sym), 10)))
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
/* Other initial-character constraints. */
|
default:
|
||||||
if (c == '\'' || c == '`' || c == ',' || c == '"' || c == ';' || c == '#')
|
break;
|
||||||
return 1;
|
}
|
||||||
|
|
||||||
/* Keywords can be identified by trailing colons too. */
|
|
||||||
if (c == ':' || scm_i_symbol_ref (sym, len - 1) == ':')
|
|
||||||
return quote_keywordish_symbols ();
|
|
||||||
|
|
||||||
/* Number-ish symbols. */
|
|
||||||
if (scm_is_true (scm_i_string_to_number (scm_symbol_to_string (sym), 10)))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* Other disallowed first characters. */
|
/* Other disallowed first characters. */
|
||||||
if (!uc_is_general_category_withtable (c, INITIAL_IDENTIFIER_MASK))
|
if (!uc_is_general_category_withtable (c, INITIAL_IDENTIFIER_MASK))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* Keywords can be identified by trailing colons too. */
|
||||||
|
if (scm_i_symbol_ref (sym, len - 1) == ':')
|
||||||
|
return quote_keywordish_symbols ();
|
||||||
|
|
||||||
/* Otherwise, any character that's in the identifier category mask is
|
/* Otherwise, any character that's in the identifier category mask is
|
||||||
fine to pass through as-is, provided it's not one of the ASCII
|
fine to pass through as-is, provided it's not one of the ASCII
|
||||||
delimiters like `;'. */
|
delimiters like `;'. */
|
||||||
|
@ -382,7 +413,16 @@ symbol_has_extended_read_syntax (SCM sym)
|
||||||
static void
|
static void
|
||||||
print_normal_symbol (SCM sym, SCM port)
|
print_normal_symbol (SCM sym, SCM port)
|
||||||
{
|
{
|
||||||
scm_display (scm_symbol_to_string (sym), port);
|
size_t len;
|
||||||
|
scm_t_string_failed_conversion_handler strategy;
|
||||||
|
|
||||||
|
len = scm_i_symbol_length (sym);
|
||||||
|
strategy = scm_i_get_conversion_strategy (port);
|
||||||
|
|
||||||
|
if (scm_i_is_narrow_symbol (sym))
|
||||||
|
display_string (scm_i_symbol_chars (sym), 1, len, port, strategy);
|
||||||
|
else
|
||||||
|
display_string (scm_i_symbol_wide_chars (sym), 0, len, port, strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -421,8 +461,8 @@ print_extended_symbol (SCM sym, SCM port)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: allow R6RS hex escapes instead of #{...}#. */
|
/* FIXME: allow R6RS hex escapes instead of #{...}#. */
|
||||||
void
|
static void
|
||||||
scm_i_print_symbol_name (SCM sym, SCM port)
|
print_symbol (SCM sym, SCM port)
|
||||||
{
|
{
|
||||||
if (symbol_has_extended_read_syntax (sym))
|
if (symbol_has_extended_read_syntax (sym))
|
||||||
print_extended_symbol (sym, port);
|
print_extended_symbol (sym, port);
|
||||||
|
@ -434,7 +474,7 @@ void
|
||||||
scm_print_symbol_name (const char *str, size_t len, SCM port)
|
scm_print_symbol_name (const char *str, size_t len, SCM port)
|
||||||
{
|
{
|
||||||
SCM symbol = scm_from_utf8_symboln (str, len);
|
SCM symbol = scm_from_utf8_symboln (str, len);
|
||||||
scm_i_print_symbol_name (symbol, port);
|
print_symbol (symbol, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print generally. Handles both write and display according to PSTATE.
|
/* Print generally. Handles both write and display according to PSTATE.
|
||||||
|
@ -597,13 +637,13 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate)
|
||||||
case scm_tc7_symbol:
|
case scm_tc7_symbol:
|
||||||
if (scm_i_symbol_is_interned (exp))
|
if (scm_i_symbol_is_interned (exp))
|
||||||
{
|
{
|
||||||
scm_i_print_symbol_name (exp, port);
|
print_symbol (exp, port);
|
||||||
scm_remember_upto_here_1 (exp);
|
scm_remember_upto_here_1 (exp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scm_puts_unlocked ("#<uninterned-symbol ", port);
|
scm_puts_unlocked ("#<uninterned-symbol ", port);
|
||||||
scm_i_print_symbol_name (exp, port);
|
print_symbol (exp, port);
|
||||||
scm_putc_unlocked (' ', port);
|
scm_putc_unlocked (' ', port);
|
||||||
scm_uintprint (SCM_UNPACK (exp), 16, port);
|
scm_uintprint (SCM_UNPACK (exp), 16, port);
|
||||||
scm_putc_unlocked ('>', port);
|
scm_putc_unlocked ('>', port);
|
||||||
|
@ -1002,7 +1042,6 @@ static size_t
|
||||||
display_string (const void *str, int narrow_p,
|
display_string (const void *str, int narrow_p,
|
||||||
size_t len, SCM port,
|
size_t len, SCM port,
|
||||||
scm_t_string_failed_conversion_handler strategy)
|
scm_t_string_failed_conversion_handler strategy)
|
||||||
|
|
||||||
{
|
{
|
||||||
scm_t_port *pt;
|
scm_t_port *pt;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#ifndef SCM_PRINT_H
|
#ifndef SCM_PRINT_H
|
||||||
#define SCM_PRINT_H
|
#define SCM_PRINT_H
|
||||||
|
|
||||||
/* Copyright (C) 1995,1996,1998,2000,2001, 2003, 2004, 2006, 2008, 2010 Free Software Foundation, Inc.
|
/* Copyright (C) 1995,1996,1998,2000,2001, 2003, 2004, 2006, 2008, 2010, 2012 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public License
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
@ -82,7 +82,6 @@ SCM_API void scm_intprint (scm_t_intmax n, int radix, SCM port);
|
||||||
SCM_API void scm_uintprint (scm_t_uintmax n, int radix, SCM port);
|
SCM_API void scm_uintprint (scm_t_uintmax n, int radix, SCM port);
|
||||||
SCM_API void scm_ipruk (char *hdr, SCM ptr, SCM port);
|
SCM_API void scm_ipruk (char *hdr, SCM ptr, SCM port);
|
||||||
SCM_API void scm_iprlist (char *hdr, SCM exp, int tlr, SCM port, scm_print_state *pstate);
|
SCM_API void scm_iprlist (char *hdr, SCM exp, int tlr, SCM port, scm_print_state *pstate);
|
||||||
SCM_INTERNAL void scm_i_print_symbol_name (SCM sym, SCM port);
|
|
||||||
SCM_API void scm_print_symbol_name (const char *str, size_t len, SCM port);
|
SCM_API void scm_print_symbol_name (const char *str, size_t len, SCM port);
|
||||||
SCM_API void scm_prin1 (SCM exp, SCM port, int writingp);
|
SCM_API void scm_prin1 (SCM exp, SCM port, int writingp);
|
||||||
SCM_API void scm_iprin1 (SCM exp, SCM port, scm_print_state *pstate);
|
SCM_API void scm_iprin1 (SCM exp, SCM port, scm_print_state *pstate);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue