]> git.eshelyaron.com Git - emacs.git/commitdiff
* Memoize `comp-subtype-p'
authorAndrea Corallo <akrl@sdf.org>
Thu, 24 Dec 2020 12:05:30 +0000 (13:05 +0100)
committerAndrea Corallo <akrl@sdf.org>
Thu, 24 Dec 2020 14:40:53 +0000 (15:40 +0100)
* lisp/emacs-lisp/comp-cstr.el (comp-subtype-p): Memoize.
(comp-cstr-ctxt): Add `subtype-p-mem' slot.

lisp/emacs-lisp/comp-cstr.el

index 19905950b5a57cc075e05d0c4f72156dff1f08c4..32989f220a4e30a3113bc7d73bca8ed581d49d68 100644 (file)
@@ -86,6 +86,9 @@ Integer values are handled in the `range' slot.")
   (common-supertype-mem (make-hash-table :test #'equal) :type hash-table
                         :documentation "Serve memoization for
 `comp-common-supertype'.")
+  (subtype-p-mem (make-hash-table :test #'equal) :type hash-table
+                 :documentation "Serve memoization for
+`comp-subtype-p-mem'.")
   (union-1-mem-no-range (make-hash-table :test #'equal) :type hash-table
                         :documentation "Serve memoization for
 `comp-cstr-union-1'.")
@@ -215,7 +218,11 @@ Return them as multiple value."
 
 (defsubst comp-subtype-p (type1 type2)
   "Return t if TYPE1 is a subtype of TYPE2 or nil otherwise."
-  (eq (comp-common-supertype-2 type1 type2) type2))
+  (let ((types (cons type1 type2)))
+    (or (gethash types (comp-cstr-ctxt-subtype-p-mem comp-ctxt))
+        (puthash types
+                 (eq (comp-common-supertype-2 type1 type2) type2)
+                 (comp-cstr-ctxt-subtype-p-mem comp-ctxt)))))
 
 (defun comp-union-typesets (&rest typesets)
   "Union types present into TYPESETS."