diff options
| author | Richard M. Stallman | 2000-01-11 22:18:47 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 2000-01-11 22:18:47 +0000 |
| commit | 719177b33fadb91f42a6dd617cd6f6f3417558a8 (patch) | |
| tree | 53f2e561bddb3b7bb563f9f95c59400e3d126daa /src | |
| parent | 2829d05f57301e7f397be3a6bd92af3e56acdf64 (diff) | |
| download | emacs-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.c | 43 |
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 | ||
| 2770 | void | 2789 | void |
| @@ -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 | ||