diff options
-rw-r--r-- | src/buffer.c | 24 | ||||
-rw-r--r-- | src/buffer.h | 7 | ||||
-rw-r--r-- | src/coding.c | 26 | ||||
-rw-r--r-- | src/coding.h | 2 | ||||
-rw-r--r-- | src/pdumper.c | 3 |
5 files changed, 31 insertions, 31 deletions
diff --git a/src/buffer.c b/src/buffer.c index 5fabbc253c8..8bdc30300ba 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -37,6 +37,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ #include "window.h" #include "commands.h" #include "character.h" +#include "coding.h" #include "buffer.h" #include "region-cache.h" #include "indent.h" @@ -583,6 +584,11 @@ even if it is dead. The return value is never nil. */) set_string_intervals (name, NULL); bset_name (b, name); + if (STRINGP (Vcode_conversion_workbuf_name) + && strncmp (SSDATA (name), SSDATA (Vcode_conversion_workbuf_name), + SBYTES (Vcode_conversion_workbuf_name)) == 0) + b->inhibit_buffer_hooks = true; + bset_undo_list (b, SREF (name, 0) != ' ' ? Qnil : Qt); reset_buffer (b); @@ -595,7 +601,7 @@ even if it is dead. The return value is never nil. */) XSETBUFFER (buffer, b); Vbuffer_alist = nconc2 (Vbuffer_alist, list1 (Fcons (name, buffer))); /* And run buffer-list-update-hook. */ - if (!NILP (Vrun_hooks)) + if (!NILP (Vrun_hooks) && !b->inhibit_buffer_hooks) call1 (Vrun_hooks, Qbuffer_list_update_hook); return buffer; @@ -1493,7 +1499,7 @@ This does not change the name of the visited file (if any). */) call0 (intern ("rename-auto-save-file")); /* Run buffer-list-update-hook. */ - if (!NILP (Vrun_hooks)) + if (!NILP (Vrun_hooks) && !current_buffer->inhibit_buffer_hooks) call1 (Vrun_hooks, Qbuffer_list_update_hook); /* Refetch since that last call may have done GC. */ @@ -1706,8 +1712,9 @@ cleaning up all windows currently displaying the buffer to be killed. */) /* First run the query functions; if any query is answered no, don't kill the buffer. */ - tem = CALLN (Frun_hook_with_args_until_failure, - Qkill_buffer_query_functions); + if (!b->inhibit_buffer_hooks) + tem = CALLN (Frun_hook_with_args_until_failure, + Qkill_buffer_query_functions); if (NILP (tem)) return unbind_to (count, Qnil); @@ -1726,7 +1733,8 @@ cleaning up all windows currently displaying the buffer to be killed. */) return unbind_to (count, Qt); /* Then run the hooks. */ - run_hook (Qkill_buffer_hook); + if (!b->inhibit_buffer_hooks) + run_hook (Qkill_buffer_hook); unbind_to (count, Qnil); } @@ -1928,7 +1936,7 @@ cleaning up all windows currently displaying the buffer to be killed. */) bset_undo_list (b, Qnil); /* Run buffer-list-update-hook. */ - if (!NILP (Vrun_hooks)) + if (!NILP (Vrun_hooks) && !b->inhibit_buffer_hooks) call1 (Vrun_hooks, Qbuffer_list_update_hook); return Qt; @@ -1970,7 +1978,7 @@ record_buffer (Lisp_Object buffer) fset_buried_buffer_list (f, Fdelq (buffer, f->buried_buffer_list)); /* Run buffer-list-update-hook. */ - if (!NILP (Vrun_hooks)) + if (!NILP (Vrun_hooks) && !XBUFFER (buffer)->inhibit_buffer_hooks) call1 (Vrun_hooks, Qbuffer_list_update_hook); } @@ -2009,7 +2017,7 @@ DEFUN ("bury-buffer-internal", Fbury_buffer_internal, Sbury_buffer_internal, (f, Fcons (buffer, Fdelq (buffer, f->buried_buffer_list))); /* Run buffer-list-update-hook. */ - if (!NILP (Vrun_hooks)) + if (!NILP (Vrun_hooks) && !XBUFFER (buffer)->inhibit_buffer_hooks) call1 (Vrun_hooks, Qbuffer_list_update_hook); return Qnil; diff --git a/src/buffer.h b/src/buffer.h index d3528ac50e9..63b162161c6 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -855,6 +855,13 @@ struct buffer /* Non-zero whenever the narrowing is changed in this buffer. */ bool_bf clip_changed : 1; + /* Non-zero for internally used temporary buffers that don't need to + run hooks kill-buffer-hook, buffer-list-update-hook, and + kill-buffer-query-functions. This is used in coding.c to avoid + slowing down en/decoding when there are a lot of these hooks + defined. */ + bool_bf inhibit_buffer_hooks : 1; + /* List of overlays that end at or before the current center, in order of end-position. */ struct Lisp_Overlay *overlays_before; 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) /* Name (or base name) of work buffer for code conversion. */ -static Lisp_Object Vcode_conversion_workbuf_name; +Lisp_Object Vcode_conversion_workbuf_name; /* A working buffer used by the top level conversion. Once it is created, it is never destroyed. It has the name @@ -7797,7 +7797,6 @@ static Lisp_Object Vcode_conversion_reused_workbuf; /* True iff Vcode_conversion_reused_workbuf is already in use. */ static bool reused_workbuf_in_use; - static void code_conversion_restore (Lisp_Object arg) { @@ -7810,12 +7809,7 @@ code_conversion_restore (Lisp_Object arg) if (EQ (workbuf, Vcode_conversion_reused_workbuf)) reused_workbuf_in_use = 0; else - { - ptrdiff_t count = SPECPDL_INDEX (); - specbind (Qbuffer_list_update_hook, Qnil); - Fkill_buffer (workbuf); - unbind_to (count, Qnil); - } + Fkill_buffer (workbuf); } set_buffer_internal (XBUFFER (current)); } @@ -7827,24 +7821,17 @@ code_conversion_save (bool with_work_buf, bool multibyte) if (with_work_buf) { - ptrdiff_t count = SPECPDL_INDEX (); if (reused_workbuf_in_use) { Lisp_Object name = Fgenerate_new_buffer_name (Vcode_conversion_workbuf_name, Qnil); - specbind (Qbuffer_list_update_hook, Qnil); workbuf = Fget_buffer_create (name); - unbind_to (count, Qnil); } else { if (NILP (Fbuffer_live_p (Vcode_conversion_reused_workbuf))) - { - specbind (Qbuffer_list_update_hook, Qnil); - Vcode_conversion_reused_workbuf - = Fget_buffer_create (Vcode_conversion_workbuf_name); - unbind_to (count, Qnil); - } + Vcode_conversion_reused_workbuf + = Fget_buffer_create (Vcode_conversion_workbuf_name); workbuf = Vcode_conversion_reused_workbuf; } } @@ -7863,11 +7850,6 @@ code_conversion_save (bool with_work_buf, bool multibyte) bset_enable_multibyte_characters (current_buffer, multibyte ? Qt : Qnil); if (EQ (workbuf, Vcode_conversion_reused_workbuf)) reused_workbuf_in_use = 1; - else - { - Fset (Fmake_local_variable (Qkill_buffer_query_functions), Qnil); - Fset (Fmake_local_variable (Qkill_buffer_hook), Qnil); - } set_buffer_internal (current); } diff --git a/src/coding.h b/src/coding.h index e38c0ee3968..0c03d1a44ed 100644 --- a/src/coding.h +++ b/src/coding.h @@ -97,6 +97,8 @@ enum define_coding_undecided_arg_index extern Lisp_Object Vcoding_system_hash_table; +/* Name (or base name) of work buffer for code conversion. */ +extern Lisp_Object Vcode_conversion_workbuf_name; /* Enumeration of index to an attribute vector of a coding system. */ diff --git a/src/pdumper.c b/src/pdumper.c index 8116c75ae8e..a9b3732a2d4 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2761,7 +2761,7 @@ dump_hash_table (struct dump_context *ctx, static dump_off dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer) { -#if CHECK_STRUCTS && !defined HASH_buffer_AE2C8CE357 +#if CHECK_STRUCTS && !defined HASH_buffer_2CEE653E74 # error "buffer changed. See CHECK_STRUCTS comment." #endif struct buffer munged_buffer = *in_buffer; @@ -2873,6 +2873,7 @@ dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer) DUMP_FIELD_COPY (out, buffer, prevent_redisplay_optimizations_p); DUMP_FIELD_COPY (out, buffer, clip_changed); + DUMP_FIELD_COPY (out, buffer, inhibit_buffer_hooks); dump_field_lv_rawptr (ctx, out, buffer, &buffer->overlays_before, Lisp_Vectorlike, WEIGHT_NORMAL); |