diff options
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c index 8d8b9b14d42..41085cdef5c 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -2899,16 +2899,31 @@ specbind (symbol, value) | |||
| 2899 | || BUFFER_OBJFWDP (XSYMBOL (symbol)->value)) | 2899 | || BUFFER_OBJFWDP (XSYMBOL (symbol)->value)) |
| 2900 | { | 2900 | { |
| 2901 | Lisp_Object current_buffer, binding_buffer; | 2901 | Lisp_Object current_buffer, binding_buffer; |
| 2902 | |||
| 2902 | /* For a local variable, record both the symbol and which | 2903 | /* For a local variable, record both the symbol and which |
| 2903 | buffer's value we are saving. */ | 2904 | buffer's value we are saving. */ |
| 2904 | current_buffer = Fcurrent_buffer (); | 2905 | current_buffer = Fcurrent_buffer (); |
| 2905 | binding_buffer = current_buffer; | 2906 | binding_buffer = current_buffer; |
| 2907 | |||
| 2906 | /* If the variable is not local in this buffer, | 2908 | /* If the variable is not local in this buffer, |
| 2907 | we are saving the global value, so restore that. */ | 2909 | we are saving the global value, so restore that. */ |
| 2908 | if (NILP (Flocal_variable_p (symbol, binding_buffer))) | 2910 | if (NILP (Flocal_variable_p (symbol, binding_buffer))) |
| 2909 | binding_buffer = Qnil; | 2911 | binding_buffer = Qnil; |
| 2910 | specpdl_ptr->symbol | 2912 | specpdl_ptr->symbol |
| 2911 | = Fcons (symbol, Fcons (binding_buffer, current_buffer)); | 2913 | = Fcons (symbol, Fcons (binding_buffer, current_buffer)); |
| 2914 | |||
| 2915 | /* If SYMBOL is a per-buffer variable which doesn't have a | ||
| 2916 | buffer-local value here, make the `let' change the global | ||
| 2917 | value by changing the value of SYMBOL in all buffers not | ||
| 2918 | having their own value. This is consistent with what | ||
| 2919 | happens with other buffer-local variables. */ | ||
| 2920 | if (NILP (binding_buffer) | ||
| 2921 | && BUFFER_OBJFWDP (XSYMBOL (symbol)->value)) | ||
| 2922 | { | ||
| 2923 | ++specpdl_ptr; | ||
| 2924 | Fset_default (symbol, value); | ||
| 2925 | return; | ||
| 2926 | } | ||
| 2912 | } | 2927 | } |
| 2913 | else | 2928 | else |
| 2914 | specpdl_ptr->symbol = symbol; | 2929 | specpdl_ptr->symbol = symbol; |