aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog9
-rw-r--r--src/font.c13
-rw-r--r--src/lisp.h1
-rw-r--r--src/lread.c86
-rw-r--r--src/w32font.c2
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 @@
12014-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
12014-09-21 Paul Eggert <eggert@cs.ucla.edu> 102014-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;
277Lisp_Object 277Lisp_Object
278font_intern_prop (const char *str, ptrdiff_t len, bool force_symbol) 278font_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;
3877extern Lisp_Object check_obarray (Lisp_Object); 3877extern Lisp_Object check_obarray (Lisp_Object);
3878extern Lisp_Object intern_1 (const char *, ptrdiff_t); 3878extern Lisp_Object intern_1 (const char *, ptrdiff_t);
3879extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t); 3879extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t);
3880extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, ptrdiff_t);
3880extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t); 3881extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t);
3881INLINE void 3882INLINE void
3882LOADHIST_ATTACH (Lisp_Object x) 3883LOADHIST_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
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,
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.