aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman2000-01-11 22:18:47 +0000
committerRichard M. Stallman2000-01-11 22:18:47 +0000
commit719177b33fadb91f42a6dd617cd6f6f3417558a8 (patch)
tree53f2e561bddb3b7bb563f9f95c59400e3d126daa /src
parent2829d05f57301e7f397be3a6bd92af3e56acdf64 (diff)
downloademacs-719177b33fadb91f42a6dd617cd6f6f3417558a8.tar.gz
emacs-719177b33fadb91f42a6dd617cd6f6f3417558a8.zip
(specbind): Record buffer-local variables specially,
indicating which buffer's binding was saved. (unbind_to): Restore buffer-local variables specially in the proper buffer. (specbind, unbind_to): Pass new arg to set_internal.
Diffstat (limited to 'src')
-rw-r--r--src/eval.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/eval.c b/src/eval.c
index f9ca9ecfeb9..84d939dabf4 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2755,16 +2755,35 @@ specbind (symbol, value)
2755 2755
2756 CHECK_SYMBOL (symbol, 0); 2756 CHECK_SYMBOL (symbol, 0);
2757 2757
2758 ovalue = find_symbol_value (symbol);
2759
2758 if (specpdl_ptr == specpdl + specpdl_size) 2760 if (specpdl_ptr == specpdl + specpdl_size)
2759 grow_specpdl (); 2761 grow_specpdl ();
2760 specpdl_ptr->symbol = symbol;
2761 specpdl_ptr->func = 0; 2762 specpdl_ptr->func = 0;
2762 specpdl_ptr->old_value = ovalue = find_symbol_value (symbol); 2763 specpdl_ptr->old_value = ovalue;
2764
2765 if (BUFFER_LOCAL_VALUEP (XSYMBOL (symbol)->value)
2766 || SOME_BUFFER_LOCAL_VALUEP (XSYMBOL (symbol)->value)
2767 || BUFFER_OBJFWDP (XSYMBOL (symbol)->value))
2768 {
2769 Lisp_Object buffer;
2770 /* For a local variable, record both the symbol and which
2771 buffer's value we are saving. */
2772 buffer = Fcurrent_buffer ();
2773 /* If the variable is not local in this buffer,
2774 we are saving the global value, so restore that. */
2775 if (NILP (Flocal_variable_p (symbol, buffer)))
2776 buffer = Qnil;
2777 specpdl_ptr->symbol = Fcons (symbol, buffer);
2778 }
2779 else
2780 specpdl_ptr->symbol = symbol;
2781
2763 specpdl_ptr++; 2782 specpdl_ptr++;
2764 if (BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue)) 2783 if (BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue))
2765 store_symval_forwarding (symbol, ovalue, value); 2784 store_symval_forwarding (symbol, ovalue, value);
2766 else 2785 else
2767 set_internal (symbol, value, 1); 2786 set_internal (symbol, value, 0, 1);
2768} 2787}
2769 2788
2770void 2789void
@@ -2798,11 +2817,25 @@ unbind_to (count, value)
2798 if (specpdl_ptr->func != 0) 2817 if (specpdl_ptr->func != 0)
2799 (*specpdl_ptr->func) (specpdl_ptr->old_value); 2818 (*specpdl_ptr->func) (specpdl_ptr->old_value);
2800 /* Note that a "binding" of nil is really an unwind protect, 2819 /* Note that a "binding" of nil is really an unwind protect,
2801 so in that case the "old value" is a list of forms to evaluate. */ 2820 so in that case the "old value" is a list of forms to evaluate. */
2802 else if (NILP (specpdl_ptr->symbol)) 2821 else if (NILP (specpdl_ptr->symbol))
2803 Fprogn (specpdl_ptr->old_value); 2822 Fprogn (specpdl_ptr->old_value);
2823 else if (CONSP (specpdl_ptr->symbol))
2824 {
2825 Lisp_Object symbol, buffer;
2826
2827 symbol = XCAR (specpdl_ptr->symbol);
2828 buffer = XCDR (specpdl_ptr->symbol);
2829
2830 /* Handle restoring a default value. */
2831 if (NILP (buffer))
2832 Fset_default (symbol, specpdl_ptr->old_value);
2833 /* Handle restoring a value saved from a live buffer. */
2834 else
2835 set_internal (symbol, specpdl_ptr->old_value, XBUFFER (buffer), 1);
2836 }
2804 else 2837 else
2805 set_internal (specpdl_ptr->symbol, specpdl_ptr->old_value, 1); 2838 set_internal (specpdl_ptr->symbol, specpdl_ptr->old_value, 0, 1);
2806 } 2839 }
2807 if (NILP (Vquit_flag) && quitf) Vquit_flag = Qt; 2840 if (NILP (Vquit_flag) && quitf) Vquit_flag = Qt;
2808 2841