aboutsummaryrefslogtreecommitdiffstats
path: root/src/lread.c
diff options
context:
space:
mode:
authorDmitry Antipov2014-09-22 10:06:19 +0400
committerDmitry Antipov2014-09-22 10:06:19 +0400
commit99c3fad7d44ceced111d8fa1b46d938bd4c67c73 (patch)
tree4860666f44b9de20ac38373336b60e78bbc65053 /src/lread.c
parentf135e94e4ecb4c6d3f88c7e028c935c2858f2e02 (diff)
downloademacs-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.c86
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
3812Lisp_Object
3813intern_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
3822Lisp_Object 3847Lisp_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
3840DEFUN ("intern", Fintern, Sintern, 1, 2, 0, 3863DEFUN ("intern", Fintern, Sintern, 1, 2, 0,
@@ -3844,43 +3867,16 @@ A second optional argument specifies the obarray to use;
3844it defaults to the value of `obarray'. */) 3867it 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
3886DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0, 3882DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0,