Let `define-symbol-prop' take effect during compilation

* src/fns.c (syms_of_fns): New variable `overriding-plist-environment'.
(Fget): Consult it.
* lisp/emacs-lisp/bytecomp.el (byte-compile-close-variables): Let-bind
it to nil.
(byte-compile-define-symbol-prop): New function, handles compilation
of top-level `define-symbol-prop' and `function-put' calls by putting
the symbol setting into `overriding-plist-environment'.

Co-authored-by: Noam Postavsky <npostavs@gmail.com>
This commit is contained in:
Stefan Monnier 2017-07-14 00:32:34 -04:00 committed by Noam Postavsky
parent 00f7e31110
commit cc30d77ecd
3 changed files with 57 additions and 0 deletions

View file

@ -545,6 +545,23 @@ literals (Bug#20852)."
This functionality has been obsolete for more than 10 years already
and will be removed soon. See (elisp)Backquote in the manual.")))))))
(ert-deftest bytecomp-tests-function-put ()
"Check `function-put' operates during compilation."
(should (boundp 'lread--old-style-backquotes))
(bytecomp-tests--with-temp-file source
(dolist (form '((function-put 'bytecomp-tests--foo 'foo 1)
(function-put 'bytecomp-tests--foo 'bar 2)
(defmacro bytecomp-tests--foobar ()
`(cons ,(function-get 'bytecomp-tests--foo 'foo)
,(function-get 'bytecomp-tests--foo 'bar)))
(defvar bytecomp-tests--foobar 1)
(setq bytecomp-tests--foobar (bytecomp-tests--foobar))))
(print form (current-buffer)))
(write-region (point-min) (point-max) source nil 'silent)
(byte-compile-file source t)
(should (equal bytecomp-tests--foobar (cons 1 2)))))
;; Local Variables:
;; no-byte-compile: t
;; End: