Fix `functionp' contraining (bug#45576)

* lisp/emacs-lisp/comp.el (comp-known-predicates)
	(comp-known-predicates-h): New constants.
	(comp-known-predicate-p, comp-pred-to-cstr): New functions.
	* lisp/emacs-lisp/cl-macs.el (cl-deftype-satisfies): Don't define.
	* test/src/comp-tests.el (comp-test-45576): New testcase.
	* test/src/comp-test-funcs.el (comp-test-45576-f): New function.
This commit is contained in:
Andrea Corallo 2021-01-02 12:18:39 +01:00
parent 03be03d366
commit 43d0e8483e
5 changed files with 60 additions and 11 deletions

View file

@ -3199,8 +3199,7 @@ Of course, we really can't know that for sure, so it's just a heuristic."
;; FIXME: Do we really want to consider this a type? ;; FIXME: Do we really want to consider this a type?
(integer-or-marker . integer-or-marker-p) (integer-or-marker . integer-or-marker-p)
)) ))
(put type 'cl-deftype-satisfies pred) (put type 'cl-deftype-satisfies pred))
(put pred 'cl-satisfies-deftype type))
;;;###autoload ;;;###autoload
(define-inline cl-typep (val type) (define-inline cl-typep (val type)

View file

@ -2,7 +2,7 @@
;; Author: Andrea Corallo <akrl@sdf.com> ;; Author: Andrea Corallo <akrl@sdf.com>
;; Copyright (C) 2020 Free Software Foundation, Inc. ;; Copyright (C) 2020-2021 Free Software Foundation, Inc.
;; Keywords: lisp ;; Keywords: lisp
;; Package: emacs ;; Package: emacs
@ -179,10 +179,6 @@ Return them as multiple value."
(defvar comp-cstr-one (comp-value-to-cstr 1) (defvar comp-cstr-one (comp-value-to-cstr 1)
"Represent the integer immediate one.") "Represent the integer immediate one.")
(defun comp-pred-to-cstr (predicate)
"Given PREDICATE return the correspondig constraint."
(comp-type-to-cstr (get predicate 'cl-satisfies-deftype)))
;;; Value handling. ;;; Value handling.

View file

@ -500,6 +500,51 @@ Useful to hook into pass checkers.")
finally return h) finally return h)
"Hash table function -> `comp-constraint'") "Hash table function -> `comp-constraint'")
(defconst comp-known-predicates
'((arrayp . array)
(atom . atom)
(characterp . base-char)
(booleanp . boolean)
(bool-vector-p . bool-vector)
(bufferp . buffer)
(natnump . character)
(char-table-p . char-table)
(hash-table-p . hash-table)
(consp . cons)
(integerp . fixnum)
(floatp . float)
(functionp . (or function symbol))
(integerp . integer)
(keywordp . keyword)
(listp . list)
(numberp . number)
(null . null)
(numberp . real)
(sequencep . sequence)
(stringp . string)
(symbolp . symbol)
(vectorp . vector)
(integer-or-marker-p . integer-or-marker))
"Alist predicate -> matched type specifier.")
(defconst comp-known-predicates-h
(cl-loop
with comp-ctxt = (make-comp-cstr-ctxt)
with h = (make-hash-table :test #'eq)
for (pred . type-spec) in comp-known-predicates
for cstr = (comp-type-spec-to-cstr type-spec)
do (puthash pred cstr h)
finally return h)
"Hash table function -> `comp-constraint'")
(defun comp-known-predicate-p (predicate)
"Predicate matching if PREDICATE is known."
(when (gethash predicate comp-known-predicates-h) t))
(defun comp-pred-to-cstr (predicate)
"Given PREDICATE return the correspondig constraint."
(gethash predicate comp-known-predicates-h))
(defconst comp-symbol-values-optimizable '(most-positive-fixnum (defconst comp-symbol-values-optimizable '(most-positive-fixnum
most-negative-fixnum) most-negative-fixnum)
"Symbol values we can resolve in the compile-time.") "Symbol values we can resolve in the compile-time.")
@ -2329,10 +2374,6 @@ TARGET-BB-SYM is the symbol name of the target block."
(comp-emit-assume 'and obj1 obj2 block-target negated)) (comp-emit-assume 'and obj1 obj2 block-target negated))
finally (cl-return-from in-the-basic-block))))))) finally (cl-return-from in-the-basic-block)))))))
(defun comp-known-predicate-p (pred)
(when (symbolp pred)
(get pred 'cl-satisfies-deftype)))
(defun comp-add-cond-cstrs () (defun comp-add-cond-cstrs ()
"`comp-add-cstrs' worker function for each selected function." "`comp-add-cstrs' worker function for each selected function."
(cl-loop (cl-loop

View file

@ -455,6 +455,14 @@
(print x) (print x)
(car x))) (car x)))
(defun comp-test-45576-f ()
;; Reduced from `eshell-find-alias-function'.
(let ((sym (intern-soft "eval")))
(if (and (functionp sym)
'(eshell-ls eshell-pred eshell-prompt eshell-script
eshell-term eshell-unix))
sym)))
;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;
;; Tromey's tests ;; ;; Tromey's tests ;;

View file

@ -482,6 +482,11 @@ https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html."
(comp-deftest comp-test-not-cons () (comp-deftest comp-test-not-cons ()
(should-not (comp-test-not-cons-f nil))) (should-not (comp-test-not-cons-f nil)))
(comp-deftest comp-test-45576 ()
"Functionp satisfies also symbols.
<https://lists.gnu.org/archive/html/bug-gnu-emacs/2021-01/msg00029.html>."
(should (eq (comp-test-45576-f) 'eval)))
;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;
;; Tromey's tests. ;; ;; Tromey's tests. ;;