diff options
author | Andrea Corallo <akrl@sdf.org> | 2020-06-18 23:04:55 +0200 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-06-22 00:13:43 +0200 |
commit | cfb871add49096f38c5a8ff0882a7e111943ee52 (patch) | |
tree | c9cdb168ae3d97c4939cee7678db453a2787df90 /lisp/emacs-lisp/comp.el | |
parent | 1179a1c748f7c18b8b82f14608f8f86790814a25 (diff) | |
download | emacs-cfb871add49096f38c5a8ff0882a7e111943ee52.tar.gz emacs-cfb871add49096f38c5a8ff0882a7e111943ee52.tar.bz2 emacs-cfb871add49096f38c5a8ff0882a7e111943ee52.zip |
* Handle correctly pure delaration specifier.
* lisp/emacs-lisp/comp.el (comp-func): New slot 'pure'.
(comp-spill-decl-spec): New function.
(comp-spill-speed): Rework to use the later.
(comp-spill-lap-function, comp-intern-func-in-ctxt): Spill pure
decl value.
(comp-function-optimizable-p): Check in the compiler env too if
pure.
Diffstat (limited to 'lisp/emacs-lisp/comp.el')
-rw-r--r-- | lisp/emacs-lisp/comp.el | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 3372400a6d3..e5674ccc95e 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -372,7 +372,9 @@ structure.") (array-h (make-hash-table) :type hash-table :documentation "array idx -> array length.") (speed nil :type number - :documentation "Optimization level (see `comp-speed').")) + :documentation "Optimization level (see `comp-speed').") + (pure nil :type boolean + :documentation "t if declared pure nil otherwise.")) (cl-defstruct (comp-func-l (:include comp-func)) "Lexical scoped function." @@ -549,10 +551,14 @@ instruction." (and (byte-code-function-p f) (fixnump (aref f 0)))) -(defun comp-spill-speed (fuction-name) - "Return the speed for SYMBOL-FUNCTION." - (or (plist-get (cdr (assq fuction-name byte-to-native-plist-environment)) - 'speed) +(defun comp-spill-decl-spec (function-name spec) + "Return the declared specifier SPEC for FUNCTION-NAME." + (plist-get (cdr (assq function-name byte-to-native-plist-environment)) + spec)) + +(defun comp-spill-speed (function-name) + "Return the speed for FUNCTION-NAME." + (or (comp-spill-decl-spec function-name 'speed) comp-speed)) (defun comp-c-func-name (name prefix) @@ -622,7 +628,9 @@ Put PREFIX in front of it." :c-name c-name :doc (documentation f) :int-spec (interactive-form f) - :speed (comp-spill-speed function-name)))) + :speed (comp-spill-speed function-name) + :pure (comp-spill-decl-spec function-name + 'pure)))) (when (byte-code-function-p f) (signal 'native-compiler-error "can't native compile an already bytecompiled function")) @@ -672,7 +680,8 @@ Put PREFIX in front of it." (comp-func-c-name func) c-name (comp-func-lap func) lap (comp-func-frame-size func) (comp-byte-frame-size byte-func) - (comp-func-speed func) (comp-spill-speed name)) + (comp-func-speed func) (comp-spill-speed name) + (comp-func-pure func) (comp-spill-decl-spec name 'pure)) ;; Store the c-name to have it retrivable from ;; `comp-ctxt-top-level-forms'. @@ -1960,7 +1969,12 @@ Here goes everything that can be done not iteratively (read once). (defsubst comp-function-optimizable-p (f args) "Given function F called with ARGS return non nil when optimizable." (when (cl-every #'comp-mvar-const-vld args) - (or (get f 'pure) + (or (when-let ((func (gethash (gethash f + (comp-ctxt-sym-to-c-name-h + comp-ctxt)) + (comp-ctxt-funcs-h comp-ctxt)))) + (comp-func-pure func)) + (get f 'pure) (memq (get f 'byte-optimizer) comp-propagate-classes) (let ((values (mapcar #'comp-mvar-constant args))) (pcase f |