From 27a6c729329e8c934d49f5ec5a9c980807a32eef Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 15 Feb 2000 09:58:41 +0000 Subject: [PATCH] (specbind): For buffer-local value, record the current buffer also. (unbind_to): Cope with that change. --- src/eval.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/eval.c b/src/eval.c index ad01cb4f021..b3a8319d9fa 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2768,15 +2768,17 @@ specbind (symbol, value) || SOME_BUFFER_LOCAL_VALUEP (XSYMBOL (symbol)->value) || BUFFER_OBJFWDP (XSYMBOL (symbol)->value)) { - Lisp_Object buffer; + Lisp_Object current_buffer, binding_buffer; /* For a local variable, record both the symbol and which buffer's value we are saving. */ - buffer = Fcurrent_buffer (); + current_buffer = Fcurrent_buffer (); + binding_buffer = current_buffer; /* If the variable is not local in this buffer, we are saving the global value, so restore that. */ - if (NILP (Flocal_variable_p (symbol, buffer))) - buffer = Qnil; - specpdl_ptr->symbol = Fcons (symbol, buffer); + if (NILP (Flocal_variable_p (symbol, binding_buffer))) + binding_buffer = Qnil; + specpdl_ptr->symbol + = Fcons (symbol, Fcons (binding_buffer, current_buffer)); } else specpdl_ptr->symbol = symbol; @@ -2822,12 +2824,16 @@ unbind_to (count, value) so in that case the "old value" is a list of forms to evaluate. */ else if (NILP (specpdl_ptr->symbol)) Fprogn (specpdl_ptr->old_value); + /* If the symbol is a list, it is really + (SYMBOL BINDING_BUFFER . CURRENT_BUFFER) + and it indicates we bound a variable that has + buffer-local bindings. */ else if (CONSP (specpdl_ptr->symbol)) { Lisp_Object symbol, buffer; symbol = XCAR (specpdl_ptr->symbol); - buffer = XCDR (specpdl_ptr->symbol); + buffer = XCAR (XCDR (specpdl_ptr->symbol)); /* Handle restoring a default value. */ if (NILP (buffer)) -- 2.39.5