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/lread.c | |
| 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/lread.c')
| -rw-r--r-- | src/lread.c | 86 |
1 files changed, 41 insertions, 45 deletions
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, |