=== modified file 'lisp/window.el' --- lisp/window.el 2012-09-09 06:43:47 +0000 +++ lisp/window.el 2012-09-13 07:37:03 +0000 @@ -219,16 +219,9 @@ "Return buffer specified by BUFFER-OR-NAME. BUFFER-OR-NAME must be either a buffer or a string naming a live buffer and defaults to the current buffer." - (cond - ((not buffer-or-name) - (current-buffer)) - ((bufferp buffer-or-name) - (if (buffer-live-p buffer-or-name) - buffer-or-name - (error "Buffer %s is not a live buffer" buffer-or-name))) - ((get-buffer buffer-or-name)) - (t - (error "No such buffer %s" buffer-or-name)))) + (let ((buffer (get-live-buffer buffer-or-name))) + (or buffer (error "No such live buffer %s" buffer-or-name)) + buffer)) (defun window-normalize-frame (frame) "Return frame specified by FRAME. === modified file 'src/buffer.c' --- src/buffer.c 2012-09-11 04:22:03 +0000 +++ src/buffer.c 2012-09-13 07:47:23 +0000 @@ -469,6 +469,33 @@ return Fcdr (assoc_ignore_text_properties (buffer_or_name, Vbuffer_alist)); } +DEFUN ("get-live-buffer", Fget_live_buffer, Sget_live_buffer, 1, 1, 0, + doc: /* Return live buffer named BUFFER-OR-NAME. +If BUFFER-OR-NAME is nil, return current buffer, which is always live. +If BUFFER-OR-NAME is a string and there is a live buffer with that name, +return this buffer. If there is no such buffer or the buffer is killed, +return nil. If BUFFER-OR-NAME is a buffer, return it as given if it is +live, and nil otherwise. */) + (Lisp_Object buffer_or_name) +{ + struct buffer *b; + + if (STRINGP (buffer_or_name)) + { + buffer_or_name = Fcdr (assoc_ignore_text_properties + (buffer_or_name, Vbuffer_alist)); + if (NILP (buffer_or_name)) + return Qnil; + } + b = live_buffer (buffer_or_name); + if (b) + { + XSETBUFFER (buffer_or_name, b); + return buffer_or_name; + } + return Qnil; +} + DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0, doc: /* Return the buffer visiting file FILENAME (a string). The buffer's `buffer-file-name' must match exactly the expansion of FILENAME. @@ -6260,6 +6287,7 @@ defsubr (&Sbuffer_live_p); defsubr (&Sbuffer_list); defsubr (&Sget_buffer); + defsubr (&Sget_live_buffer); defsubr (&Sget_file_buffer); defsubr (&Sget_buffer_create); defsubr (&Smake_indirect_buffer); === modified file 'src/buffer.h' --- src/buffer.h 2012-09-11 04:22:03 +0000 +++ src/buffer.h 2012-09-13 07:30:23 +0000 @@ -1025,6 +1025,30 @@ extern void fix_overlays_before (struct buffer *, ptrdiff_t, ptrdiff_t); extern void mmap_set_vars (bool); +/* If BUFFER is nil, return current buffer pointer. Next, check + whether BUFFER is a buffer object and return buffer pointer + corresponding to BUFFER if BUFFER is live, or NULL otherwise. */ + +BUFFER_INLINE struct buffer * +live_buffer (Lisp_Object buffer) +{ + struct buffer *b; + + if (NILP (buffer)) + { + b = current_buffer; + eassert (BUFFER_LIVE_P (b)); + } + else + { + CHECK_BUFFER (buffer); + b = XBUFFER (buffer); + if (!BUFFER_LIVE_P (b)) + b = NULL; + } + return b; +} + /* Set the current buffer to B. We previously set windows_or_buffers_changed here to invalidate === modified file 'src/marker.c' --- src/marker.c 2012-09-11 04:22:03 +0000 +++ src/marker.c 2012-09-13 07:30:02 +0000 @@ -450,30 +450,6 @@ } } -/* If BUFFER is nil, return current buffer pointer. Next, check - whether BUFFER is a buffer object and return buffer pointer - corresponding to BUFFER if BUFFER is live, or NULL otherwise. */ - -static inline struct buffer * -live_buffer (Lisp_Object buffer) -{ - struct buffer *b; - - if (NILP (buffer)) - { - b = current_buffer; - eassert (BUFFER_LIVE_P (b)); - } - else - { - CHECK_BUFFER (buffer); - b = XBUFFER (buffer); - if (!BUFFER_LIVE_P (b)) - b = NULL; - } - return b; -} - /* Internal function to set MARKER in BUFFER at POSITION. Non-zero RESTRICTED means limit the POSITION by the visible part of BUFFER. */