Move side-effect-free and pure declarations to function definitions

Some Lisp functions still had their `side-effect-free` and `pure`
properties declared in byte-opt.el; do it at their definition instead.
The lists in byte-opt.el now only contain functions implemented in C
and function aliases.

* lisp/emacs-lisp/byte-opt.el (side-effect-free-fns)
(side-effect-and-error-free-fns, pure-fns):
Remove functions whose properties are now declared elsewhere
and some obsolete entries.
* lisp/custom.el (custom-variable-p):
* lisp/emacs-lisp/lisp.el (buffer-end):
* lisp/emacs-lisp/regexp-opt.el (regexp-opt):
* lisp/env.el (getenv):
* lisp/simple.el (count-lines, mark, string-empty-p, lax-plist-get):
* lisp/subr.el (ignore, always, zerop, fixnump, bignump, lsh, last)
(eventp, mouse-movement-p, log10, memory-limit, string-greaterp)
(interactive-p):
* lisp/window.el (get-lru-window, get-largest-window, (window-edges)
(window-body-edges, window-pixel-edges, window-body-pixel-edges)
(window-absolute-pixel-edges, window-absolute-body-pixel-edges)
(one-window-p):
Declare functions `side-effect-free` and/or `pure` as appropriate.
This commit is contained in:
Mattias Engdegård 2023-02-17 14:38:50 +01:00
parent 7ab6c6ac83
commit d5bf26f488
8 changed files with 59 additions and 40 deletions

View file

@ -665,6 +665,7 @@ If NOSET is non-nil, don't bother autoloading LOAD when setting the variable."
A customizable variable is either (i) a variable whose property A customizable variable is either (i) a variable whose property
list contains a non-nil `standard-value' or `custom-autoload' list contains a non-nil `standard-value' or `custom-autoload'
property, or (ii) an alias for another customizable variable." property, or (ii) an alias for another customizable variable."
(declare (side-effect-free t))
(when (symbolp variable) (when (symbolp variable)
(setq variable (indirect-variable variable)) (setq variable (indirect-variable variable))
(or (get variable 'standard-value) (or (get variable 'standard-value)

View file

@ -1647,7 +1647,7 @@ See Info node `(elisp) Integer Basics'."
capitalize car-less-than-car car cdr ceiling char-after char-before capitalize car-less-than-car car cdr ceiling char-after char-before
char-equal char-to-string char-width compare-strings char-equal char-to-string char-width compare-strings
window-configuration-equal-p concat coordinates-in-window-p window-configuration-equal-p concat coordinates-in-window-p
copy-alist copy-sequence copy-marker copysign cos count-lines copy-alist copy-sequence copy-marker copysign cos
current-time-string current-time-zone current-time-string current-time-zone
decode-char decode-char
decode-time default-boundp default-value documentation downcase decode-time default-boundp default-value documentation downcase
@ -1659,26 +1659,24 @@ See Info node `(elisp) Integer Basics'."
float float-time floor format format-time-string frame-first-window float float-time floor format format-time-string frame-first-window
frame-root-window frame-selected-window frame-root-window frame-selected-window
frame-visible-p fround ftruncate frame-visible-p fround ftruncate
get gethash get-buffer get-buffer-window getenv get-file-buffer get gethash get-buffer get-buffer-window get-file-buffer
hash-table-count hash-table-count
int-to-string intern-soft isnan int-to-string intern-soft isnan
keymap-parent keymap-parent
lax-plist-get ldexp ldexp
length length< length> length= length length< length> length=
line-beginning-position line-end-position pos-bol pos-eol line-beginning-position line-end-position pos-bol pos-eol
local-variable-if-set-p local-variable-p locale-info local-variable-if-set-p local-variable-p locale-info
log log10 logand logb logcount logior lognot logxor lsh log logand logb logcount logior lognot logxor
make-byte-code make-list make-string make-symbol mark marker-buffer max make-byte-code make-list make-string make-symbol marker-buffer max
match-beginning match-end match-beginning match-end
member memq memql min minibuffer-selected-window minibuffer-window member memq memql min minibuffer-selected-window minibuffer-window
mod multibyte-char-to-unibyte next-window nth nthcdr number-to-string mod multibyte-char-to-unibyte next-window nth nthcdr number-to-string
parse-colon-path
prefix-numeric-value previous-window prin1-to-string propertize prefix-numeric-value previous-window prin1-to-string propertize
degrees-to-radians rassq rassoc read-from-string
radians-to-degrees rassq rassoc read-from-string regexp-opt
regexp-quote region-beginning region-end reverse round regexp-quote region-beginning region-end reverse round
sin sqrt string string< string= string-equal string-lessp sin sqrt string string< string= string-equal string-lessp
string> string-greaterp string-empty-p string-blank-p string>
string-search string-to-char string-search string-to-char
string-to-number string-to-syntax substring string-to-number string-to-syntax substring
sxhash sxhash-equal sxhash-eq sxhash-eql sxhash sxhash-equal sxhash-eq sxhash-eql
@ -1687,45 +1685,40 @@ See Info node `(elisp) Integer Basics'."
string-to-multibyte string-to-multibyte
take tan time-convert truncate take tan time-convert truncate
unibyte-char-to-multibyte upcase user-full-name unibyte-char-to-multibyte upcase user-full-name
user-login-name user-original-login-name custom-variable-p user-login-name user-original-login-name
vconcat vconcat
window-absolute-pixel-edges window-at window-body-height window-at window-body-height
window-body-width window-buffer window-dedicated-p window-display-table window-body-width window-buffer window-dedicated-p window-display-table
window-combination-limit window-edges window-frame window-fringes window-combination-limit window-frame window-fringes
window-height window-hscroll window-inside-edges window-height window-hscroll window-inside-edges
window-inside-absolute-pixel-edges window-inside-pixel-edges window-inside-absolute-pixel-edges window-inside-pixel-edges
window-left-child window-left-column window-margins window-minibuffer-p window-left-child window-left-column window-margins window-minibuffer-p
window-next-buffers window-next-sibling window-new-normal window-next-buffers window-next-sibling window-new-normal
window-new-total window-normal-size window-parameter window-parameters window-new-total window-normal-size window-parameter window-parameters
window-parent window-pixel-edges window-point window-prev-buffers window-parent window-point window-prev-buffers
window-prev-sibling window-scroll-bars window-prev-sibling window-scroll-bars
window-start window-text-height window-top-child window-top-line window-start window-text-height window-top-child window-top-line
window-total-height window-total-width window-use-time window-vscroll window-total-height window-total-width window-use-time window-vscroll
window-width zerop)) window-width))
(side-effect-and-error-free-fns (side-effect-and-error-free-fns
'(always arrayp atom '(arrayp atom
bignump bobp bolp bool-vector-p bobp bolp bool-vector-p
buffer-end buffer-list buffer-size buffer-string bufferp buffer-list buffer-size buffer-string bufferp
car-safe case-table-p cdr-safe char-or-string-p characterp car-safe case-table-p cdr-safe char-or-string-p characterp
charsetp commandp cons consp charsetp commandp cons consp
current-buffer current-global-map current-indentation current-buffer current-global-map current-indentation
current-local-map current-minor-mode-maps current-time current-local-map current-minor-mode-maps current-time
eobp eolp eq equal eventp eobp eolp eq equal
fixnump floatp following-char framep floatp following-char framep
get-largest-window get-lru-window
hash-table-p hash-table-p
;; `ignore' isn't here because we don't want calls to it elided; identity integerp integer-or-marker-p
;; see `byte-compile-ignore'.
identity integerp integer-or-marker-p interactive-p
invocation-directory invocation-name invocation-directory invocation-name
keymapp keywordp keymapp keywordp
list listp list listp
make-marker mark-marker markerp max-char make-marker mark-marker markerp max-char
memory-limit
mouse-movement-p
natnump nlistp not null number-or-marker-p numberp natnump nlistp not null number-or-marker-p numberp
one-window-p overlayp overlayp
point point-marker point-min point-max preceding-char primary-charset point point-marker point-min point-max preceding-char
processp proper-list-p processp proper-list-p
recent-keys recursion-depth recent-keys recursion-depth
safe-length selected-frame selected-window sequencep safe-length selected-frame selected-window sequencep
@ -1761,7 +1754,7 @@ See Info node `(elisp) Integer Basics'."
;; values if a marker is moved. ;; values if a marker is moved.
(let ((pure-fns (let ((pure-fns
'(concat regexp-opt regexp-quote '(concat regexp-quote
string-to-char string-to-syntax symbol-name string-to-char string-to-syntax symbol-name
eq eql eq eql
= /= < <= >= > min max = /= < <= >= > min max
@ -1770,8 +1763,7 @@ See Info node `(elisp) Integer Basics'."
copysign isnan ldexp float logb copysign isnan ldexp float logb
floor ceiling round truncate floor ceiling round truncate
ffloor fceiling fround ftruncate ffloor fceiling fround ftruncate
string= string-equal string< string-lessp string> string-greaterp string= string-equal string< string-lessp string>
string-empty-p string-blank-p
string-search string-search
consp atom listp nlistp proper-list-p consp atom listp nlistp proper-list-p
sequencep arrayp vectorp stringp bool-vector-p hash-table-p sequencep arrayp vectorp stringp bool-vector-p hash-table-p
@ -1780,20 +1772,19 @@ See Info node `(elisp) Integer Basics'."
integer-or-marker-p number-or-marker-p char-or-string-p integer-or-marker-p number-or-marker-p char-or-string-p
symbolp keywordp symbolp keywordp
type-of type-of
identity ignore identity
;; The following functions are pure up to mutation of their ;; The following functions are pure up to mutation of their
;; arguments. This is pure enough for the purposes of ;; arguments. This is pure enough for the purposes of
;; constant folding, but not necessarily for all kinds of ;; constant folding, but not necessarily for all kinds of
;; code motion. ;; code motion.
car cdr car-safe cdr-safe nth nthcdr last take car cdr car-safe cdr-safe nth nthcdr take
equal equal
length safe-length length safe-length
memq memql member memq memql member
;; `assoc' and `assoc-default' are excluded since they are ;; `assoc' and `assoc-default' are excluded since they are
;; impure if the test function is (consider `string-match'). ;; impure if the test function is (consider `string-match').
assq rassq rassoc assq rassq rassoc
lax-plist-get
aref elt aref elt
base64-decode-string base64-encode-string base64url-encode-string base64-decode-string base64-encode-string base64url-encode-string
bool-vector-subsetp bool-vector-subsetp

View file

@ -519,6 +519,7 @@ major mode's decisions about context.")
"Return the \"far end\" position of the buffer, in direction ARG. "Return the \"far end\" position of the buffer, in direction ARG.
If ARG is positive, that's the end of the buffer. If ARG is positive, that's the end of the buffer.
Otherwise, that's the beginning of the buffer." Otherwise, that's the beginning of the buffer."
(declare (side-effect-free error-free))
(if (> arg 0) (point-max) (point-min))) (if (> arg 0) (point-max) (point-min)))
(defun end-of-defun (&optional arg interactive) (defun end-of-defun (&optional arg interactive)

View file

@ -130,6 +130,7 @@ usually more efficient than that of a simplified version:
(concat (car parens) (concat (car parens)
(mapconcat \\='regexp-quote strings \"\\\\|\") (mapconcat \\='regexp-quote strings \"\\\\|\")
(cdr parens))))" (cdr parens))))"
(declare (pure t) (side-effect-free t))
(save-match-data (save-match-data
;; Recurse on the sorted list. ;; Recurse on the sorted list.
(let* ((max-lisp-eval-depth 10000) (let* ((max-lisp-eval-depth 10000)

View file

@ -205,6 +205,7 @@ Otherwise, this function searches `process-environment' for
VARIABLE. If it is not found there, then it continues the search VARIABLE. If it is not found there, then it continues the search
in the environment list of the selected frame." in the environment list of the selected frame."
(interactive (list (read-envvar-name "Get environment variable: " t))) (interactive (list (read-envvar-name "Get environment variable: " t)))
(declare (side-effect-free t))
(let ((value (getenv-internal (if (multibyte-string-p variable) (let ((value (getenv-internal (if (multibyte-string-p variable)
(encode-coding-string (encode-coding-string
variable locale-coding-system) variable locale-coding-system)

View file

@ -1755,6 +1755,7 @@ not at the start of a line.
When IGNORE-INVISIBLE-LINES is non-nil, invisible lines are not When IGNORE-INVISIBLE-LINES is non-nil, invisible lines are not
included in the count." included in the count."
(declare (side-effect-free t))
(save-excursion (save-excursion
(save-restriction (save-restriction
(narrow-to-region start end) (narrow-to-region start end)
@ -6830,6 +6831,7 @@ is active, and returns an integer or nil in the usual way.
If you are using this in an editing command, you are most likely making If you are using this in an editing command, you are most likely making
a mistake; see the documentation of `set-mark'." a mistake; see the documentation of `set-mark'."
(declare (side-effect-free t))
(if (or force (not transient-mark-mode) mark-active mark-even-if-inactive) (if (or force (not transient-mark-mode) mark-active mark-even-if-inactive)
(marker-position (mark-marker)) (marker-position (mark-marker))
(signal 'mark-inactive nil))) (signal 'mark-inactive nil)))
@ -10840,6 +10842,7 @@ If the buffer doesn't exist, create it first."
(defsubst string-empty-p (string) (defsubst string-empty-p (string)
"Check whether STRING is empty." "Check whether STRING is empty."
(declare (pure t) (side-effect-free t))
(string= string "")) (string= string ""))
(defun read-signal-name () (defun read-signal-name ()
@ -10857,7 +10860,7 @@ If the buffer doesn't exist, create it first."
(defun lax-plist-get (plist prop) (defun lax-plist-get (plist prop)
"Extract a value from a property list, comparing with `equal'." "Extract a value from a property list, comparing with `equal'."
(declare (obsolete plist-get "29.1")) (declare (pure t) (side-effect-free t) (obsolete plist-get "29.1"))
(plist-get plist prop #'equal)) (plist-get plist prop #'equal))
(defun lax-plist-put (plist prop val) (defun lax-plist-put (plist prop val)

View file

@ -422,7 +422,9 @@ PREFIX is a string, and defaults to \"g\"."
"Do nothing and return nil. "Do nothing and return nil.
This function accepts any number of ARGUMENTS, but ignores them. This function accepts any number of ARGUMENTS, but ignores them.
Also see `always'." Also see `always'."
(declare (completion ignore)) ;; Not declared `side-effect-free' because we don't want calls to it
;; elided; see `byte-compile-ignore'.
(declare (pure t) (completion ignore))
(interactive) (interactive)
nil) nil)
@ -430,6 +432,7 @@ Also see `always'."
"Do nothing and return t. "Do nothing and return t.
This function accepts any number of ARGUMENTS, but ignores them. This function accepts any number of ARGUMENTS, but ignores them.
Also see `ignore'." Also see `ignore'."
(declare (pure t) (side-effect-free error-free))
t) t)
;; Signal a compile-error if the first arg is missing. ;; Signal a compile-error if the first arg is missing.
@ -509,16 +512,19 @@ was called."
"Return t if NUMBER is zero." "Return t if NUMBER is zero."
;; Used to be in C, but it's pointless since (= 0 n) is faster anyway because ;; Used to be in C, but it's pointless since (= 0 n) is faster anyway because
;; = has a byte-code. ;; = has a byte-code.
(declare (compiler-macro (lambda (_) `(= 0 ,number)))) (declare (pure t) (side-effect-free t)
(compiler-macro (lambda (_) `(= 0 ,number))))
(= 0 number)) (= 0 number))
(defun fixnump (object) (defun fixnump (object)
"Return t if OBJECT is a fixnum." "Return t if OBJECT is a fixnum."
(declare (side-effect-free error-free))
(and (integerp object) (and (integerp object)
(<= most-negative-fixnum object most-positive-fixnum))) (<= most-negative-fixnum object most-positive-fixnum)))
(defun bignump (object) (defun bignump (object)
"Return t if OBJECT is a bignum." "Return t if OBJECT is a bignum."
(declare (side-effect-free error-free))
(and (integerp object) (not (fixnump object)))) (and (integerp object) (not (fixnump object))))
(defun lsh (value count) (defun lsh (value count)
@ -533,7 +539,8 @@ instead."
(lambda (form) (lambda (form)
(macroexp-warn-and-return (macroexp-warn-and-return
(format-message "avoid `lsh'; use `ash' instead") (format-message "avoid `lsh'; use `ash' instead")
form '(suspicious lsh) t form)))) form '(suspicious lsh) t form)))
(side-effect-free t))
(when (and (< value 0) (< count 0)) (when (and (< value 0) (< count 0))
(when (< value most-negative-fixnum) (when (< value most-negative-fixnum)
(signal 'args-out-of-range (list value count))) (signal 'args-out-of-range (list value count)))
@ -706,7 +713,7 @@ instead."
If LIST is nil, return nil. If LIST is nil, return nil.
If N is non-nil, return the Nth-to-last link of LIST. If N is non-nil, return the Nth-to-last link of LIST.
If N is bigger than the length of LIST, return LIST." If N is bigger than the length of LIST, return LIST."
(declare (side-effect-free t)) (declare (pure t) (side-effect-free t)) ; pure up to mutation
(if n (if n
(and (>= n 0) (and (>= n 0)
(let ((m (safe-length list))) (let ((m (safe-length list)))
@ -1525,6 +1532,7 @@ See also `current-global-map'.")
(defun eventp (object) (defun eventp (object)
"Return non-nil if OBJECT is an input event or event object." "Return non-nil if OBJECT is an input event or event object."
(declare (pure t) (side-effect-free error-free))
(or (integerp object) (or (integerp object)
(and (if (consp object) (and (if (consp object)
(setq object (car object)) (setq object (car object))
@ -1587,6 +1595,7 @@ in the current Emacs session, then this function may return nil."
(defsubst mouse-movement-p (object) (defsubst mouse-movement-p (object)
"Return non-nil if OBJECT is a mouse movement event." "Return non-nil if OBJECT is a mouse movement event."
(declare (side-effect-free error-free))
(eq (car-safe object) 'mouse-movement)) (eq (car-safe object) 'mouse-movement))
(defun mouse-event-p (object) (defun mouse-event-p (object)
@ -1859,7 +1868,7 @@ be a list of the form returned by `event-start' and `event-end'."
(defun log10 (x) (defun log10 (x)
"Return (log X 10), the log base 10 of X." "Return (log X 10), the log base 10 of X."
(declare (obsolete log "24.4")) (declare (side-effect-free t) (obsolete log "24.4"))
(log x 10)) (log x 10))
(set-advertised-calling-convention (set-advertised-calling-convention
@ -2983,6 +2992,7 @@ It can be retrieved with `(process-get PROCESS PROPNAME)'."
(defun memory-limit () (defun memory-limit ()
"Return an estimate of Emacs virtual memory usage, divided by 1024." "Return an estimate of Emacs virtual memory usage, divided by 1024."
(declare (side-effect-free error-free))
(let ((default-directory temporary-file-directory)) (let ((default-directory temporary-file-directory))
(or (cdr (assq 'vsize (process-attributes (emacs-pid)))) 0))) (or (cdr (assq 'vsize (process-attributes (emacs-pid)))) 0)))
@ -5544,6 +5554,7 @@ consisting of STR followed by an invisible left-to-right mark
"Return non-nil if STRING1 is greater than STRING2 in lexicographic order. "Return non-nil if STRING1 is greater than STRING2 in lexicographic order.
Case is significant. Case is significant.
Symbols are also allowed; their print names are used instead." Symbols are also allowed; their print names are used instead."
(declare (pure t) (side-effect-free t))
(string-lessp string2 string1)) (string-lessp string2 string1))
@ -6187,7 +6198,8 @@ To test whether a function can be called interactively, use
`commandp'." `commandp'."
;; Kept around for now. See discussion at: ;; Kept around for now. See discussion at:
;; https://lists.gnu.org/r/emacs-devel/2020-08/msg00564.html ;; https://lists.gnu.org/r/emacs-devel/2020-08/msg00564.html
(declare (obsolete called-interactively-p "23.2")) (declare (obsolete called-interactively-p "23.2")
(side-effect-free error-free))
(called-interactively-p 'interactive)) (called-interactively-p 'interactive))
(defun internal-push-keymap (keymap symbol) (defun internal-push-keymap (keymap symbol)

View file

@ -2522,6 +2522,7 @@ selected frame and no others.
`display-buffer-avoid-small-windows', if non-nil, is also taken into `display-buffer-avoid-small-windows', if non-nil, is also taken into
consideration. Windows whose height is smaller that the value of that consideration. Windows whose height is smaller that the value of that
variable will be avoided if larger windows are available." variable will be avoided if larger windows are available."
(declare (side-effect-free error-free))
(let ((windows (window-list-1 nil 'nomini all-frames)) (let ((windows (window-list-1 nil 'nomini all-frames))
best-window best-time second-best-window second-best-time time) best-window best-time second-best-window second-best-time time)
(dolist (window windows) (dolist (window windows)
@ -2603,6 +2604,7 @@ have special meanings:
Any other value of ALL-FRAMES means consider all windows on the Any other value of ALL-FRAMES means consider all windows on the
selected frame and no others." selected frame and no others."
(declare (side-effect-free error-free))
(let ((best-size 0) (let ((best-size 0)
best-window size) best-window size)
(dolist (window (window-list-1 nil 'nomini all-frames)) (dolist (window (window-list-1 nil 'nomini all-frames))
@ -3801,6 +3803,7 @@ frame, rounded if necessary. PIXELWISE non-nil means to return
the coordinates in pixels where the values for RIGHT and BOTTOM the coordinates in pixels where the values for RIGHT and BOTTOM
are one more than the actual value of these edges. Note that if are one more than the actual value of these edges. Note that if
ABSOLUTE is non-nil, PIXELWISE is implicitly non-nil too." ABSOLUTE is non-nil, PIXELWISE is implicitly non-nil too."
(declare (side-effect-free t))
(let* ((window (window-normalize-window window body)) (let* ((window (window-normalize-window window body))
(frame (window-frame window)) (frame (window-frame window))
(border-width (frame-internal-border-width frame)) (border-width (frame-internal-border-width frame))
@ -3856,6 +3859,7 @@ ABSOLUTE is non-nil, PIXELWISE is implicitly non-nil too."
"Return a list of the edge coordinates of WINDOW's body. "Return a list of the edge coordinates of WINDOW's body.
The return value is that of `window-edges' called with argument The return value is that of `window-edges' called with argument
BODY non-nil." BODY non-nil."
(declare (side-effect-free t))
(window-edges window t)) (window-edges window t))
(defalias 'window-inside-edges 'window-body-edges) (defalias 'window-inside-edges 'window-body-edges)
@ -3863,12 +3867,14 @@ BODY non-nil."
"Return a list of the edge pixel coordinates of WINDOW. "Return a list of the edge pixel coordinates of WINDOW.
The return value is that of `window-edges' called with argument The return value is that of `window-edges' called with argument
PIXELWISE non-nil." PIXELWISE non-nil."
(declare (side-effect-free t))
(window-edges window nil nil t)) (window-edges window nil nil t))
(defun window-body-pixel-edges (&optional window) (defun window-body-pixel-edges (&optional window)
"Return a list of the edge pixel coordinates of WINDOW's body. "Return a list of the edge pixel coordinates of WINDOW's body.
The return value is that of `window-edges' called with arguments The return value is that of `window-edges' called with arguments
BODY and PIXELWISE non-nil." BODY and PIXELWISE non-nil."
(declare (side-effect-free t))
(window-edges window t nil t)) (window-edges window t nil t))
(defalias 'window-inside-pixel-edges 'window-body-pixel-edges) (defalias 'window-inside-pixel-edges 'window-body-pixel-edges)
@ -3876,12 +3882,14 @@ BODY and PIXELWISE non-nil."
"Return a list of the edge pixel coordinates of WINDOW. "Return a list of the edge pixel coordinates of WINDOW.
The return value is that of `window-edges' called with argument The return value is that of `window-edges' called with argument
ABSOLUTE non-nil." ABSOLUTE non-nil."
(declare (side-effect-free t))
(window-edges window nil t t)) (window-edges window nil t t))
(defun window-absolute-body-pixel-edges (&optional window) (defun window-absolute-body-pixel-edges (&optional window)
"Return a list of the edge pixel coordinates of WINDOW's text area. "Return a list of the edge pixel coordinates of WINDOW's text area.
The return value is that of `window-edges' called with arguments The return value is that of `window-edges' called with arguments
BODY and ABSOLUTE non-nil." BODY and ABSOLUTE non-nil."
(declare (side-effect-free t))
(window-edges window t t t)) (window-edges window t t t))
(defalias 'window-inside-absolute-pixel-edges 'window-absolute-body-pixel-edges) (defalias 'window-inside-absolute-pixel-edges 'window-absolute-body-pixel-edges)
@ -4091,6 +4099,7 @@ with a special meaning are:
Anything else means consider all windows on the selected frame Anything else means consider all windows on the selected frame
and no others." and no others."
(declare (side-effect-free error-free))
(let ((base-window (selected-window))) (let ((base-window (selected-window)))
(if (and nomini (eq base-window (minibuffer-window))) (if (and nomini (eq base-window (minibuffer-window)))
(setq base-window (next-window base-window))) (setq base-window (next-window base-window)))