Merge remote-tracking branch 'origin/master' into feature/android
This commit is contained in:
@@ -113,10 +113,6 @@ is less than this number.")
|
||||
(defvar cconv--dynbound-variables nil
|
||||
"List of variables known to be dynamically bound.")
|
||||
|
||||
(defvar cconv-dont-trim-unused-variables nil
|
||||
"When bound to non-nil, don't remove unused variables from the environment.
|
||||
This is intended for use by edebug and similar.")
|
||||
|
||||
;;;###autoload
|
||||
(defun cconv-closure-convert (form &optional dynbound-vars)
|
||||
"Main entry point for closure conversion.
|
||||
@@ -882,15 +878,22 @@ lexically and dynamically bound symbols actually used by FORM."
|
||||
(cons fvs dyns)))))
|
||||
|
||||
(defun cconv-make-interpreted-closure (fun env)
|
||||
;; FIXME: I don't know what "This function is evaluated both at
|
||||
;; compile time and run time" is intended to mean here.
|
||||
"Make a closure for the interpreter.
|
||||
This function is evaluated both at compile time and run time.
|
||||
FUN, the closure's function, must be a lambda form.
|
||||
ENV, the closure's environment, is a mixture of lexical bindings of the form
|
||||
(SYMBOL . VALUE) and symbols which indicate dynamic bindings of those
|
||||
\(SYMBOL . VALUE) and symbols which indicate dynamic bindings of those
|
||||
symbols."
|
||||
(cl-assert (eq (car-safe fun) 'lambda))
|
||||
(let ((lexvars (delq nil (mapcar #'car-safe env))))
|
||||
(if (or cconv-dont-trim-unused-variables (null lexvars))
|
||||
(if (or (null lexvars)
|
||||
;; Functions with a `:closure-dont-trim-context' marker
|
||||
;; should keep their whole context untrimmed (bug#59213).
|
||||
(and (eq :closure-dont-trim-context (nth 2 fun))
|
||||
;; Check the function doesn't just return the magic keyword.
|
||||
(nthcdr 3 fun)))
|
||||
;; The lexical environment is empty, or needs to be preserved,
|
||||
;; so there's no need to look for free variables.
|
||||
;; Attempting to replace ,(cdr fun) by a macroexpanded version
|
||||
|
||||
@@ -1217,16 +1217,18 @@ purpose by adding an entry to this alist, and setting
|
||||
(setq edebug-old-def-name nil))
|
||||
(setq edebug-def-name
|
||||
(or edebug-def-name edebug-old-def-name (gensym "edebug-anon")))
|
||||
`(let ((cconv-dont-trim-unused-variables t))
|
||||
(edebug-enter
|
||||
(quote ,edebug-def-name)
|
||||
,(if edebug-inside-func
|
||||
`(list
|
||||
;; Doesn't work with more than one def-body!!
|
||||
;; But the list will just be reversed.
|
||||
,@(nreverse edebug-def-args))
|
||||
'nil)
|
||||
(function (lambda () ,@forms)))))
|
||||
`(edebug-enter
|
||||
(quote ,edebug-def-name)
|
||||
,(if edebug-inside-func
|
||||
`(list
|
||||
;; Doesn't work with more than one def-body!!
|
||||
;; But the list will just be reversed.
|
||||
,@(nreverse edebug-def-args))
|
||||
'nil)
|
||||
;; Make sure `forms' is not nil so we don't accidentally return
|
||||
;; the magic keyword. Mark the closure so we don't throw away
|
||||
;; unused vars (bug#59213).
|
||||
#'(lambda () :closure-dont-trim-context ,@(or forms '(nil)))))
|
||||
|
||||
|
||||
(defvar edebug-form-begin-marker) ; the mark for def being instrumented
|
||||
|
||||
@@ -442,11 +442,6 @@ or return multiple values."
|
||||
(let ((testcover-vector (get sym 'edebug-coverage)))
|
||||
(testcover-analyze-coverage-progn body)))
|
||||
|
||||
(`(let ((cconv-dont-trim-unused-variables t))
|
||||
(edebug-enter ',sym ,_ (function (lambda nil . ,body))))
|
||||
(let ((testcover-vector (get sym 'edebug-coverage)))
|
||||
(testcover-analyze-coverage-progn body)))
|
||||
|
||||
(`(edebug-after ,(and before-form
|
||||
(or `(edebug-before ,before-id) before-id))
|
||||
,after-id ,wrapped-form)
|
||||
|
||||
@@ -466,6 +466,12 @@
|
||||
|
||||
;; Viper mode-changing commands and utilities
|
||||
|
||||
(defcustom viper-enable-minibuffer-faces t
|
||||
"If non-nil, viper uses distinct faces in the minibuffer."
|
||||
:type 'boolean
|
||||
:version "30.1"
|
||||
:group 'viper-misc)
|
||||
|
||||
;; Modifies mode-line-buffer-identification.
|
||||
(defun viper-refresh-mode-line ()
|
||||
(setq-local viper-mode-string
|
||||
@@ -561,7 +567,7 @@
|
||||
))
|
||||
|
||||
;; minibuffer faces
|
||||
(if (viper-has-face-support-p)
|
||||
(if (and (viper-has-face-support-p) viper-enable-minibuffer-faces)
|
||||
(setq viper-minibuffer-current-face
|
||||
(cond ((eq state 'emacs-state) viper-minibuffer-emacs-face)
|
||||
((eq state 'vi-state) viper-minibuffer-vi-face)
|
||||
|
||||
@@ -487,16 +487,9 @@ Emacs dired can't find files."
|
||||
|
||||
(defun tramp-adb-handle-file-exists-p (filename)
|
||||
"Like `file-exists-p' for Tramp files."
|
||||
;; `file-exists-p' is used as predicate in file name completion.
|
||||
;; We don't want to run it when `non-essential' is t, or there is
|
||||
;; no connection process yet.
|
||||
(when (tramp-connectable-p filename)
|
||||
(with-parsed-tramp-file-name (expand-file-name filename) nil
|
||||
(with-tramp-file-property v localname "file-exists-p"
|
||||
(if (tramp-file-property-p v localname "file-attributes")
|
||||
(not (null (tramp-get-file-property v localname "file-attributes")))
|
||||
(tramp-adb-send-command-and-check
|
||||
v (format "test -e %s" (tramp-shell-quote-argument localname))))))))
|
||||
(tramp-skeleton-file-exists-p filename
|
||||
(tramp-adb-send-command-and-check
|
||||
v (format "test -e %s" (tramp-shell-quote-argument localname)))))
|
||||
|
||||
(defun tramp-adb-handle-file-readable-p (filename)
|
||||
"Like `file-readable-p' for Tramp files."
|
||||
|
||||
@@ -1186,20 +1186,13 @@ Operations not mentioned here will be handled by the normal Emacs functions.")
|
||||
|
||||
(defun tramp-sh-handle-file-exists-p (filename)
|
||||
"Like `file-exists-p' for Tramp files."
|
||||
;; `file-exists-p' is used as predicate in file name completion.
|
||||
;; We don't want to run it when `non-essential' is t, or there is
|
||||
;; no connection process yet.
|
||||
(when (tramp-connectable-p filename)
|
||||
(with-parsed-tramp-file-name (expand-file-name filename) nil
|
||||
(with-tramp-file-property v localname "file-exists-p"
|
||||
(if (tramp-file-property-p v localname "file-attributes")
|
||||
(not (null (tramp-get-file-property v localname "file-attributes")))
|
||||
(tramp-send-command-and-check
|
||||
v
|
||||
(format
|
||||
"%s %s"
|
||||
(tramp-get-file-exists-command v)
|
||||
(tramp-shell-quote-argument localname))))))))
|
||||
(tramp-skeleton-file-exists-p filename
|
||||
(tramp-send-command-and-check
|
||||
v
|
||||
(format
|
||||
"%s %s"
|
||||
(tramp-get-file-exists-command v)
|
||||
(tramp-shell-quote-argument localname)))))
|
||||
|
||||
(defun tramp-sh-handle-file-attributes (filename &optional id-format)
|
||||
"Like `file-attributes' for Tramp files."
|
||||
|
||||
@@ -454,16 +454,9 @@ the result will be a local, non-Tramp, file name."
|
||||
|
||||
(defun tramp-sudoedit-handle-file-exists-p (filename)
|
||||
"Like `file-exists-p' for Tramp files."
|
||||
;; `file-exists-p' is used as predicate in file name completion.
|
||||
;; We don't want to run it when `non-essential' is t, or there is
|
||||
;; no connection process yet.
|
||||
(when (tramp-connectable-p filename)
|
||||
(with-parsed-tramp-file-name (expand-file-name filename) nil
|
||||
(with-tramp-file-property v localname "file-exists-p"
|
||||
(if (tramp-file-property-p v localname "file-attributes")
|
||||
(not (null (tramp-get-file-property v localname "file-attributes")))
|
||||
(tramp-sudoedit-send-command
|
||||
v "test" "-e" (file-name-unquote localname)))))))
|
||||
(tramp-skeleton-file-exists-p filename
|
||||
(tramp-sudoedit-send-command
|
||||
v "test" "-e" (file-name-unquote localname))))
|
||||
|
||||
(defun tramp-sudoedit-handle-file-name-all-completions (filename directory)
|
||||
"Like `file-name-all-completions' for Tramp files."
|
||||
|
||||
@@ -2976,8 +2976,9 @@ not in completion mode."
|
||||
;; We need special handling only when a method is needed. Then we
|
||||
;; regard all files "/method:" or "/[method/" as existent, if
|
||||
;; "method" is a valid Tramp method. And we regard all files
|
||||
;; "/method:user@host" or "/[method/user@host" as existent, if
|
||||
;; "user@host" is a valid file name completion.
|
||||
;; "/method:user@", "/user@" or "/[method/user@" as existent, if
|
||||
;; "user@" is a valid file name completion. Host completion is
|
||||
;; performed in the respective backen operation.
|
||||
(or (and (cond
|
||||
;; Completion styles like `flex' and `substring' check for
|
||||
;; the file name "/". This does exist.
|
||||
@@ -2989,27 +2990,30 @@ not in completion mode."
|
||||
(regexp tramp-prefix-regexp)
|
||||
(* (regexp tramp-remote-file-name-spec-regexp)
|
||||
(regexp tramp-postfix-hop-regexp))
|
||||
(group (regexp tramp-method-regexp))
|
||||
(group-n 9 (regexp tramp-method-regexp))
|
||||
(? (regexp tramp-postfix-method-regexp))
|
||||
eos)
|
||||
filename))
|
||||
(assoc (match-string 1 filename) tramp-methods))
|
||||
;; Is it a valid user@host?
|
||||
(assoc (match-string 9 filename) tramp-methods))
|
||||
;; Is it a valid user?
|
||||
((string-match
|
||||
(rx
|
||||
(regexp tramp-prefix-regexp)
|
||||
(* (regexp tramp-remote-file-name-spec-regexp)
|
||||
(regexp tramp-postfix-hop-regexp))
|
||||
(group (regexp tramp-remote-file-name-spec-regexp))
|
||||
(group-n 10
|
||||
(regexp tramp-method-regexp)
|
||||
(regexp tramp-postfix-method-regexp))
|
||||
(group-n 11
|
||||
(regexp tramp-user-regexp)
|
||||
(regexp tramp-postfix-user-regexp))
|
||||
eos)
|
||||
filename)
|
||||
(member
|
||||
(concat
|
||||
(file-name-nondirectory filename) tramp-postfix-host-format)
|
||||
(file-name-all-completions
|
||||
(file-name-nondirectory filename)
|
||||
(file-name-directory filename)))))
|
||||
t)
|
||||
(member
|
||||
(match-string 11 filename)
|
||||
(file-name-all-completions
|
||||
"" (concat tramp-prefix-format (match-string 10 filename))))))
|
||||
t)
|
||||
|
||||
(tramp-run-real-handler #'file-exists-p (list filename))))
|
||||
|
||||
@@ -3629,6 +3633,25 @@ BODY is the backend specific code."
|
||||
(tramp-dissect-file-name ,directory) 'file-missing ,directory)
|
||||
nil)))
|
||||
|
||||
(defmacro tramp-skeleton-file-exists-p (filename &rest body)
|
||||
"Skeleton for `tramp-*-handle-file-exists-p'.
|
||||
BODY is the backend specific code."
|
||||
(declare (indent 1) (debug t))
|
||||
;; `file-exists-p' is used as predicate in file name completion.
|
||||
`(or (and minibuffer-completing-file-name
|
||||
(file-name-absolute-p ,filename)
|
||||
(tramp-string-empty-or-nil-p
|
||||
(tramp-file-name-localname (tramp-dissect-file-name ,filename))))
|
||||
;; We don't want to run it when `non-essential' is t, or there
|
||||
;; is no connection process yet.
|
||||
(when (tramp-connectable-p ,filename)
|
||||
(with-parsed-tramp-file-name (expand-file-name ,filename) nil
|
||||
(with-tramp-file-property v localname "file-exists-p"
|
||||
(if (tramp-file-property-p v localname "file-attributes")
|
||||
(not
|
||||
(null (tramp-get-file-property v localname "file-attributes")))
|
||||
,@body))))))
|
||||
|
||||
(defmacro tramp-skeleton-file-local-copy (filename &rest body)
|
||||
"Skeleton for `tramp-*-handle-file-local-copy'.
|
||||
BODY is the backend specific code."
|
||||
@@ -4066,13 +4089,8 @@ Let-bind it when necessary.")
|
||||
|
||||
(defun tramp-handle-file-exists-p (filename)
|
||||
"Like `file-exists-p' for Tramp files."
|
||||
;; `file-exists-p' is used as predicate in file name completion.
|
||||
;; We don't want to run it when `non-essential' is t, or there is
|
||||
;; no connection process yet.
|
||||
(when (tramp-connectable-p filename)
|
||||
(with-parsed-tramp-file-name (expand-file-name filename) nil
|
||||
(with-tramp-file-property v localname "file-exists-p"
|
||||
(not (null (file-attributes filename)))))))
|
||||
(tramp-skeleton-file-exists-p filename
|
||||
(not (null (file-attributes filename)))))
|
||||
|
||||
(defun tramp-handle-file-in-directory-p (filename directory)
|
||||
"Like `file-in-directory-p' for Tramp files."
|
||||
|
||||
@@ -364,5 +364,18 @@
|
||||
(call-interactively f))
|
||||
'((t 51696) (nil 51695) (t 51697)))))))
|
||||
|
||||
(ert-deftest cconv-safe-for-space ()
|
||||
(let* ((magic-string "This-is-a-magic-string")
|
||||
(safe-p (lambda (x) (not (string-match magic-string (format "%S" x))))))
|
||||
(should (funcall safe-p (lambda (x) (+ x 1))))
|
||||
(should (funcall safe-p (eval '(lambda (x) (+ x 1))
|
||||
`((y . ,magic-string)))))
|
||||
(should (funcall safe-p (eval '(lambda (x) :closure-dont-trim-context)
|
||||
`((y . ,magic-string)))))
|
||||
(should-not (funcall safe-p
|
||||
(eval '(lambda (x) :closure-dont-trim-context (+ x 1))
|
||||
`((y . ,magic-string)))))))
|
||||
|
||||
|
||||
(provide 'cconv-tests)
|
||||
;;; cconv-tests.el ends here
|
||||
|
||||
Reference in New Issue
Block a user