Mercurial > emacs
diff src/eval.c @ 108308:ee0a08d8887e
Try and fix unbind_to when localness of binding has changed
* eval.c (unbind_to): Don't unbind a local binding into the global
binding when the local binding disappeared. Inversely, don't unbind
a global binding into a newly created local binding.
* data.c (set_internal): Make its `buf' arg into a `where' arg so we
can specify the frame to use, when applicable. Adjust callers.
| author | Stefan Monnier <monnier@iro.umontreal.ca> |
|---|---|
| date | Fri, 07 May 2010 16:33:00 -0400 |
| parents | a2f08cd3ab5c |
| children | f6cfadfc0fb6 |
line wrap: on
line diff
--- a/src/eval.c Fri May 07 14:55:18 2010 -0400 +++ b/src/eval.c Fri May 07 16:33:00 2010 -0400 @@ -26,6 +26,7 @@ #include "commands.h" #include "keyboard.h" #include "dispextern.h" +#include "frame.h" /* For XFRAME. */ #if HAVE_X_WINDOWS #include "xterm.h" @@ -786,7 +787,7 @@ so that old-code that affects n_a before the aliasing is setup still works. */ if (NILP (Fboundp (base_variable))) - set_internal (base_variable, find_symbol_value (new_alias), NULL, 1); + set_internal (base_variable, find_symbol_value (new_alias), Qnil, 1); { struct specbinding *p; @@ -3335,7 +3336,7 @@ if (!sym->constant) SET_SYMBOL_VAL (sym, value); else - set_internal (symbol, value, 0, 1); + set_internal (symbol, value, Qnil, 1); break; } case SYMBOL_LOCALIZED: case SYMBOL_FORWARDED: @@ -3395,7 +3396,7 @@ specpdl_ptr->symbol = symbol; specpdl_ptr++; - set_internal (symbol, value, 0, 1); + set_internal (symbol, value, Qnil, 1); break; } default: abort (); @@ -3457,27 +3458,26 @@ if (NILP (where)) Fset_default (symbol, this_binding.old_value); + /* If `where' is non-nil, reset the value in the appropriate + local binding, but only if that binding still exists. */ else if (BUFFERP (where)) - if (!NILP (Flocal_variable_p (symbol, where))) - set_internal (symbol, this_binding.old_value, XBUFFER (where), 1); - /* else if (!NILP (Fbuffer_live_p (where))) - error ("Unbinding local %s to global!", symbol); */ - else - ; - else - set_internal (symbol, this_binding.old_value, NULL, 1); + { + if (BUFFERP (where) + ? !NILP (Flocal_variable_p (symbol, where)) + : !NILP (Fassq (symbol, XFRAME (where)->param_alist))) + set_internal (symbol, this_binding.old_value, where, 1); + } } + /* If variable has a trivial value (no forwarding), we can + just set it. No need to check for constant symbols here, + since that was already done by specbind. */ + else if (XSYMBOL (this_binding.symbol)->redirect == SYMBOL_PLAINVAL) + SET_SYMBOL_VAL (XSYMBOL (this_binding.symbol), + this_binding.old_value); else - { - /* If variable has a trivial value (no forwarding), we can - just set it. No need to check for constant symbols here, - since that was already done by specbind. */ - if (XSYMBOL (this_binding.symbol)->redirect == SYMBOL_PLAINVAL) - SET_SYMBOL_VAL (XSYMBOL (this_binding.symbol), - this_binding.old_value); - else - set_internal (this_binding.symbol, this_binding.old_value, 0, 1); - } + /* NOTE: we only ever come here if make_local_foo was used for + the first time on this var within this let. */ + Fset_default (this_binding.symbol, this_binding.old_value); } if (NILP (Vquit_flag) && !NILP (quitf))
