diff options
author | Ihor Radchenko <yantar92@posteo.net> | 2023-10-08 11:48:42 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2023-12-30 09:53:46 +0200 |
commit | b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723 (patch) | |
tree | f05276bb8e942e8b33a88d04b5a6beaf392028a8 /src/buffer.c | |
parent | 0cb252cf21efec49f693f5a8873ed02c1bcbd713 (diff) | |
download | emacs-b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723.tar.gz |
Improve performance of `find-buffer-visiting' (bug#66117)
* src/buffer.c (Fget_truename_buffer): Expose `get_truename_buffer' to
Elisp.
(Ffind_buffer): New subr searching for a live buffer with a given
value of buffer-local variable.
(syms_of_buffer): Register the new added subroutines.
* src/filelock.c (lock_file): Use the new `Fget_truename_buffer' name.
* src/lisp.h:
* test/manual/etags/c-src/emacs/src/lisp.h: Remove no-longer-necessary
extern declarations for `get_truename_buffer'.
* lisp/files.el (find-buffer-visiting): Refactor, using subroutines to
search for buffers instead of slow manual Elisp iterations.
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/buffer.c b/src/buffer.c index ea0c23192b7..73e9839f883 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -519,8 +519,11 @@ See also `find-buffer-visiting'. */) return Qnil; } -Lisp_Object -get_truename_buffer (register Lisp_Object filename) +DEFUN ("get-truename-buffer", Fget_truename_buffer, Sget_truename_buffer, 1, 1, 0, + doc: /* Return the buffer with `file-truename' equal to FILENAME (a string). +If there is no such live buffer, return nil. +See also `find-buffer-visiting'. */) + (register Lisp_Object filename) { register Lisp_Object tail, buf; @@ -533,6 +536,22 @@ get_truename_buffer (register Lisp_Object filename) return Qnil; } +DEFUN ("find-buffer", Ffind_buffer, Sfind_buffer, 2, 2, 0, + doc: /* Return the buffer with buffer-local VARIABLE equal to VALUE. + If there is no such live buffer, return nil. +See also `find-buffer-visiting'. */) + (Lisp_Object variable, Lisp_Object value) +{ + register Lisp_Object tail, buf; + + FOR_EACH_LIVE_BUFFER (tail, buf) + { + if (!NILP (Fequal (value, Fbuffer_local_value(variable, buf)))) + return buf; + } + return Qnil; +} + /* Run buffer-list-update-hook if Vrun_hooks is non-nil and BUF does not have buffer hooks inhibited. */ @@ -6010,6 +6029,8 @@ There is no reason to change that value except for debugging purposes. */); defsubr (&Sbuffer_list); defsubr (&Sget_buffer); defsubr (&Sget_file_buffer); + defsubr (&Sget_truename_buffer); + defsubr (&Sfind_buffer); defsubr (&Sget_buffer_create); defsubr (&Smake_indirect_buffer); defsubr (&Sgenerate_new_buffer_name); |