diff options
| author | Dmitry Antipov | 2014-09-22 10:06:19 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2014-09-22 10:06:19 +0400 |
| commit | 99c3fad7d44ceced111d8fa1b46d938bd4c67c73 (patch) | |
| tree | 4860666f44b9de20ac38373336b60e78bbc65053 /src | |
| parent | f135e94e4ecb4c6d3f88c7e028c935c2858f2e02 (diff) | |
| download | emacs-99c3fad7d44ceced111d8fa1b46d938bd4c67c73.tar.gz emacs-99c3fad7d44ceced111d8fa1b46d938bd4c67c73.zip | |
Avoid extra call to oblookup when interning symbols.
* lisp.h (intern_driver): Add prototype.
* lread.c (intern_driver): New function.
(intern1, intern_c_string_1, Fintern):
* font.c (font_intern_prop):
* w32font.c (intern_font_name): Use it.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 9 | ||||
| -rw-r--r-- | src/font.c | 13 | ||||
| -rw-r--r-- | src/lisp.h | 1 | ||||
| -rw-r--r-- | src/lread.c | 86 | ||||
| -rw-r--r-- | src/w32font.c | 2 |
5 files changed, 57 insertions, 54 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index a80394b5855..b7858c609b4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,12 @@ | |||
| 1 | 2014-09-22 Dmitry Antipov <dmantipov@yandex.ru> | ||
| 2 | |||
| 3 | Avoid extra call to oblookup when interning symbols. | ||
| 4 | * lisp.h (intern_driver): Add prototype. | ||
| 5 | * lread.c (intern_driver): New function. | ||
| 6 | (intern1, intern_c_string_1, Fintern): | ||
| 7 | * font.c (font_intern_prop): | ||
| 8 | * w32font.c (intern_font_name): Use it. | ||
| 9 | |||
| 1 | 2014-09-21 Paul Eggert <eggert@cs.ucla.edu> | 10 | 2014-09-21 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 11 | ||
| 3 | Minor improvements to new stack-allocated Lisp objects. | 12 | Minor improvements to new stack-allocated Lisp objects. |
diff --git a/src/font.c b/src/font.c index 57cc4aa0b2b..83860090820 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -277,10 +277,8 @@ static int num_font_drivers; | |||
| 277 | Lisp_Object | 277 | Lisp_Object |
| 278 | font_intern_prop (const char *str, ptrdiff_t len, bool force_symbol) | 278 | font_intern_prop (const char *str, ptrdiff_t len, bool force_symbol) |
| 279 | { | 279 | { |
| 280 | ptrdiff_t i; | 280 | ptrdiff_t i, nbytes, nchars; |
| 281 | Lisp_Object tem; | 281 | Lisp_Object tem, name, obarray; |
| 282 | Lisp_Object obarray; | ||
| 283 | ptrdiff_t nbytes, nchars; | ||
| 284 | 282 | ||
| 285 | if (len == 1 && *str == '*') | 283 | if (len == 1 && *str == '*') |
| 286 | return Qnil; | 284 | return Qnil; |
| @@ -311,12 +309,11 @@ font_intern_prop (const char *str, ptrdiff_t len, bool force_symbol) | |||
| 311 | parse_str_as_multibyte ((unsigned char *) str, len, &nchars, &nbytes); | 309 | parse_str_as_multibyte ((unsigned char *) str, len, &nchars, &nbytes); |
| 312 | tem = oblookup (obarray, str, | 310 | tem = oblookup (obarray, str, |
| 313 | (len == nchars || len != nbytes) ? len : nchars, len); | 311 | (len == nchars || len != nbytes) ? len : nchars, len); |
| 314 | |||
| 315 | if (SYMBOLP (tem)) | 312 | if (SYMBOLP (tem)) |
| 316 | return tem; | 313 | return tem; |
| 317 | tem = make_specified_string (str, nchars, len, | 314 | name = make_specified_string (str, nchars, len, |
| 318 | len != nchars && len == nbytes); | 315 | len != nchars && len == nbytes); |
| 319 | return Fintern (tem, obarray); | 316 | return intern_driver (name, obarray, XINT (tem)); |
| 320 | } | 317 | } |
| 321 | 318 | ||
| 322 | /* Return a pixel size of font-spec SPEC on frame F. */ | 319 | /* Return a pixel size of font-spec SPEC on frame F. */ |
diff --git a/src/lisp.h b/src/lisp.h index 1347b35f046..2bc9fb13284 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -3877,6 +3877,7 @@ extern Lisp_Object Qlexical_binding; | |||
| 3877 | extern Lisp_Object check_obarray (Lisp_Object); | 3877 | extern Lisp_Object check_obarray (Lisp_Object); |
| 3878 | extern Lisp_Object intern_1 (const char *, ptrdiff_t); | 3878 | extern Lisp_Object intern_1 (const char *, ptrdiff_t); |
| 3879 | extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t); | 3879 | extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t); |
| 3880 | extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, ptrdiff_t); | ||
| 3880 | extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t); | 3881 | extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t); |
| 3881 | INLINE void | 3882 | INLINE void |
| 3882 | LOADHIST_ATTACH (Lisp_Object x) | 3883 | LOADHIST_ATTACH (Lisp_Object x) |
diff --git a/src/lread.c b/src/lread.c index f285312e592..b6f259f1a95 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -3807,6 +3807,30 @@ check_obarray (Lisp_Object obarray) | |||
| 3807 | return obarray; | 3807 | return obarray; |
| 3808 | } | 3808 | } |
| 3809 | 3809 | ||
| 3810 | /* Intern a symbol with name STRING in OBARRAY using bucket INDEX. */ | ||
| 3811 | |||
| 3812 | Lisp_Object | ||
| 3813 | intern_driver (Lisp_Object string, Lisp_Object obarray, ptrdiff_t index) | ||
| 3814 | { | ||
| 3815 | Lisp_Object *ptr, sym = Fmake_symbol (string); | ||
| 3816 | |||
| 3817 | XSYMBOL (sym)->interned = (EQ (obarray, initial_obarray) | ||
| 3818 | ? SYMBOL_INTERNED_IN_INITIAL_OBARRAY | ||
| 3819 | : SYMBOL_INTERNED); | ||
| 3820 | |||
| 3821 | if ((SREF (string, 0) == ':') && EQ (obarray, initial_obarray)) | ||
| 3822 | { | ||
| 3823 | XSYMBOL (sym)->constant = 1; | ||
| 3824 | XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL; | ||
| 3825 | SET_SYMBOL_VAL (XSYMBOL (sym), sym); | ||
| 3826 | } | ||
| 3827 | |||
| 3828 | ptr = aref_addr (obarray, index); | ||
| 3829 | set_symbol_next (sym, SYMBOLP (*ptr) ? XSYMBOL (*ptr) : NULL); | ||
| 3830 | *ptr = sym; | ||
| 3831 | return sym; | ||
| 3832 | } | ||
| 3833 | |||
| 3810 | /* Intern the C string STR: return a symbol with that name, | 3834 | /* Intern the C string STR: return a symbol with that name, |
| 3811 | interned in the current obarray. */ | 3835 | interned in the current obarray. */ |
| 3812 | 3836 | ||
| @@ -3816,7 +3840,8 @@ intern_1 (const char *str, ptrdiff_t len) | |||
| 3816 | Lisp_Object obarray = check_obarray (Vobarray); | 3840 | Lisp_Object obarray = check_obarray (Vobarray); |
| 3817 | Lisp_Object tem = oblookup (obarray, str, len, len); | 3841 | Lisp_Object tem = oblookup (obarray, str, len, len); |
| 3818 | 3842 | ||
| 3819 | return SYMBOLP (tem) ? tem : Fintern (make_string (str, len), obarray); | 3843 | return SYMBOLP (tem) ? tem : intern_driver (make_string (str, len), |
| 3844 | obarray, XINT (tem)); | ||
| 3820 | } | 3845 | } |
| 3821 | 3846 | ||
| 3822 | Lisp_Object | 3847 | Lisp_Object |
| @@ -3825,16 +3850,14 @@ intern_c_string_1 (const char *str, ptrdiff_t len) | |||
| 3825 | Lisp_Object obarray = check_obarray (Vobarray); | 3850 | Lisp_Object obarray = check_obarray (Vobarray); |
| 3826 | Lisp_Object tem = oblookup (obarray, str, len, len); | 3851 | Lisp_Object tem = oblookup (obarray, str, len, len); |
| 3827 | 3852 | ||
| 3828 | if (SYMBOLP (tem)) | 3853 | if (!SYMBOLP (tem)) |
| 3829 | return tem; | 3854 | { |
| 3830 | 3855 | /* Creating a non-pure string from a string literal not implemented yet. | |
| 3831 | if (NILP (Vpurify_flag)) | 3856 | We could just use make_string here and live with the extra copy. */ |
| 3832 | /* Creating a non-pure string from a string literal not | 3857 | eassert (!NILP (Vpurify_flag)); |
| 3833 | implemented yet. We could just use make_string here and live | 3858 | tem = intern_driver (make_pure_c_string (str, len), obarray, XINT (tem)); |
| 3834 | with the extra copy. */ | 3859 | } |
| 3835 | emacs_abort (); | 3860 | return tem; |
| 3836 | |||
| 3837 | return Fintern (make_pure_c_string (str, len), obarray); | ||
| 3838 | } | 3861 | } |
| 3839 | 3862 | ||
| 3840 | DEFUN ("intern", Fintern, Sintern, 1, 2, 0, | 3863 | DEFUN ("intern", Fintern, Sintern, 1, 2, 0, |
| @@ -3844,43 +3867,16 @@ A second optional argument specifies the obarray to use; | |||
| 3844 | it defaults to the value of `obarray'. */) | 3867 | it defaults to the value of `obarray'. */) |
| 3845 | (Lisp_Object string, Lisp_Object obarray) | 3868 | (Lisp_Object string, Lisp_Object obarray) |
| 3846 | { | 3869 | { |
| 3847 | register Lisp_Object tem, sym, *ptr; | 3870 | Lisp_Object tem; |
| 3848 | |||
| 3849 | if (NILP (obarray)) obarray = Vobarray; | ||
| 3850 | obarray = check_obarray (obarray); | ||
| 3851 | 3871 | ||
| 3872 | obarray = check_obarray (NILP (obarray) ? Vobarray : obarray); | ||
| 3852 | CHECK_STRING (string); | 3873 | CHECK_STRING (string); |
| 3853 | 3874 | ||
| 3854 | tem = oblookup (obarray, SSDATA (string), | 3875 | tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); |
| 3855 | SCHARS (string), | 3876 | if (!SYMBOLP (tem)) |
| 3856 | SBYTES (string)); | 3877 | tem = intern_driver (NILP (Vpurify_flag) ? string |
| 3857 | if (!INTEGERP (tem)) | 3878 | : Fpurecopy (string), obarray, XINT (tem)); |
| 3858 | return tem; | 3879 | return tem; |
| 3859 | |||
| 3860 | if (!NILP (Vpurify_flag)) | ||
| 3861 | string = Fpurecopy (string); | ||
| 3862 | sym = Fmake_symbol (string); | ||
| 3863 | |||
| 3864 | if (EQ (obarray, initial_obarray)) | ||
| 3865 | XSYMBOL (sym)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY; | ||
| 3866 | else | ||
| 3867 | XSYMBOL (sym)->interned = SYMBOL_INTERNED; | ||
| 3868 | |||
| 3869 | if ((SREF (string, 0) == ':') | ||
| 3870 | && EQ (obarray, initial_obarray)) | ||
| 3871 | { | ||
| 3872 | XSYMBOL (sym)->constant = 1; | ||
| 3873 | XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL; | ||
| 3874 | SET_SYMBOL_VAL (XSYMBOL (sym), sym); | ||
| 3875 | } | ||
| 3876 | |||
| 3877 | ptr = aref_addr (obarray, XINT (tem)); | ||
| 3878 | if (SYMBOLP (*ptr)) | ||
| 3879 | set_symbol_next (sym, XSYMBOL (*ptr)); | ||
| 3880 | else | ||
| 3881 | set_symbol_next (sym, NULL); | ||
| 3882 | *ptr = sym; | ||
| 3883 | return sym; | ||
| 3884 | } | 3880 | } |
| 3885 | 3881 | ||
| 3886 | DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0, | 3882 | DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0, |
diff --git a/src/w32font.c b/src/w32font.c index 24666ad97c7..7b2aac1cbf2 100644 --- a/src/w32font.c +++ b/src/w32font.c | |||
| @@ -291,7 +291,7 @@ intern_font_name (char * string) | |||
| 291 | Lisp_Object obarray = check_obarray (Vobarray); | 291 | Lisp_Object obarray = check_obarray (Vobarray); |
| 292 | Lisp_Object tem = oblookup (obarray, SDATA (str), len, len); | 292 | Lisp_Object tem = oblookup (obarray, SDATA (str), len, len); |
| 293 | /* This code is similar to intern function from lread.c. */ | 293 | /* This code is similar to intern function from lread.c. */ |
| 294 | return SYMBOLP (tem) ? tem : Fintern (str, obarray); | 294 | return SYMBOLP (tem) ? tem : intern_driver (str, obarray, XINT (tem)); |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | /* w32 implementation of get_cache for font backend. | 297 | /* w32 implementation of get_cache for font backend. |