aboutsummaryrefslogtreecommitdiffstats
path: root/src/coding.c
diff options
context:
space:
mode:
authorEli Zaretskii2019-03-30 12:01:58 +0300
committerEli Zaretskii2019-03-30 12:01:58 +0300
commit9c0fa1172fd987a8f23b115145270383a11c12fc (patch)
tree251e79c78ada59224c8a9743e4b13dd9c86df6e5 /src/coding.c
parent273d7b3ee0f4841c7f3f112aeb2e29db51a642e7 (diff)
downloademacs-9c0fa1172fd987a8f23b115145270383a11c12fc.tar.gz
emacs-9c0fa1172fd987a8f23b115145270383a11c12fc.zip
Don't run buffer-related hooks in " *code conversion work*" buffers
Note: portions of this change were mistakenly pushed as part of an unrelated commit a35a1f6a9. * src/buffer.c (Fget_buffer_create): Set inhibit_buffer_hooks non-zero for temporary buffers created by coding.c. Don't run buffer-list-update-hook for such buffers. (Frename_buffer, Fkill_buffer, record_buffer) (Fbury_buffer_internal): Don't run hooks for buffers whose inhibit_buffer_hooks flag is set. * src/buffer.h (struct buffer): New member inhibit_buffer_hooks. * src/pdumper.c (dump_buffer): Dump the new field. Update the hash value in HASH_buffer_XXX. * src/coding.c (make_conversion_work_buffer): Function deleted; code moved to code_conversion_save. (code_conversion_save): Insert code from make_conversion_work_buffer, but arrange for unwind-protecting the current buffer before switching to the work buffer. This avoids leaving reused_workbuf_in_use set if user presses C-g during encoding/decoding. (Vcode_conversion_workbuf_name): Now external variable. * src/coding.h (Vcode_conversion_reused_workbuf): Declare.
Diffstat (limited to 'src/coding.c')
-rw-r--r--src/coding.c26
1 files changed, 4 insertions, 22 deletions
diff --git a/src/coding.c b/src/coding.c
index c6d96436770..e351cc72fab 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -7785,7 +7785,7 @@ encode_coding (struct coding_system *coding)
7785 7785
7786 7786
7787/* Name (or base name) of work buffer for code conversion. */ 7787/* Name (or base name) of work buffer for code conversion. */
7788static Lisp_Object Vcode_conversion_workbuf_name; 7788Lisp_Object Vcode_conversion_workbuf_name;
7789 7789
7790/* A working buffer used by the top level conversion. Once it is 7790/* A working buffer used by the top level conversion. Once it is
7791 created, it is never destroyed. It has the name 7791 created, it is never destroyed. It has the name
@@ -7797,7 +7797,6 @@ static Lisp_Object Vcode_conversion_reused_workbuf;
7797/* True iff Vcode_conversion_reused_workbuf is already in use. */ 7797/* True iff Vcode_conversion_reused_workbuf is already in use. */
7798static bool reused_workbuf_in_use; 7798static bool reused_workbuf_in_use;
7799 7799
7800
7801static void 7800static void
7802code_conversion_restore (Lisp_Object arg) 7801code_conversion_restore (Lisp_Object arg)
7803{ 7802{
@@ -7810,12 +7809,7 @@ code_conversion_restore (Lisp_Object arg)
7810 if (EQ (workbuf, Vcode_conversion_reused_workbuf)) 7809 if (EQ (workbuf, Vcode_conversion_reused_workbuf))
7811 reused_workbuf_in_use = 0; 7810 reused_workbuf_in_use = 0;
7812 else 7811 else
7813 { 7812 Fkill_buffer (workbuf);
7814 ptrdiff_t count = SPECPDL_INDEX ();
7815 specbind (Qbuffer_list_update_hook, Qnil);
7816 Fkill_buffer (workbuf);
7817 unbind_to (count, Qnil);
7818 }
7819 } 7813 }
7820 set_buffer_internal (XBUFFER (current)); 7814 set_buffer_internal (XBUFFER (current));
7821} 7815}
@@ -7827,24 +7821,17 @@ code_conversion_save (bool with_work_buf, bool multibyte)
7827 7821
7828 if (with_work_buf) 7822 if (with_work_buf)
7829 { 7823 {
7830 ptrdiff_t count = SPECPDL_INDEX ();
7831 if (reused_workbuf_in_use) 7824 if (reused_workbuf_in_use)
7832 { 7825 {
7833 Lisp_Object name 7826 Lisp_Object name
7834 = Fgenerate_new_buffer_name (Vcode_conversion_workbuf_name, Qnil); 7827 = Fgenerate_new_buffer_name (Vcode_conversion_workbuf_name, Qnil);
7835 specbind (Qbuffer_list_update_hook, Qnil);
7836 workbuf = Fget_buffer_create (name); 7828 workbuf = Fget_buffer_create (name);
7837 unbind_to (count, Qnil);
7838 } 7829 }
7839 else 7830 else
7840 { 7831 {
7841 if (NILP (Fbuffer_live_p (Vcode_conversion_reused_workbuf))) 7832 if (NILP (Fbuffer_live_p (Vcode_conversion_reused_workbuf)))
7842 { 7833 Vcode_conversion_reused_workbuf
7843 specbind (Qbuffer_list_update_hook, Qnil); 7834 = Fget_buffer_create (Vcode_conversion_workbuf_name);
7844 Vcode_conversion_reused_workbuf
7845 = Fget_buffer_create (Vcode_conversion_workbuf_name);
7846 unbind_to (count, Qnil);
7847 }
7848 workbuf = Vcode_conversion_reused_workbuf; 7835 workbuf = Vcode_conversion_reused_workbuf;
7849 } 7836 }
7850 } 7837 }
@@ -7863,11 +7850,6 @@ code_conversion_save (bool with_work_buf, bool multibyte)
7863 bset_enable_multibyte_characters (current_buffer, multibyte ? Qt : Qnil); 7850 bset_enable_multibyte_characters (current_buffer, multibyte ? Qt : Qnil);
7864 if (EQ (workbuf, Vcode_conversion_reused_workbuf)) 7851 if (EQ (workbuf, Vcode_conversion_reused_workbuf))
7865 reused_workbuf_in_use = 1; 7852 reused_workbuf_in_use = 1;
7866 else
7867 {
7868 Fset (Fmake_local_variable (Qkill_buffer_query_functions), Qnil);
7869 Fset (Fmake_local_variable (Qkill_buffer_hook), Qnil);
7870 }
7871 set_buffer_internal (current); 7853 set_buffer_internal (current);
7872 } 7854 }
7873 7855