From 29b2a08c36554ec26f8f3c51da2a2a26b13bfe8f Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 2 Jun 2020 11:08:50 +0100 Subject: [PATCH] Execute top level forms in the right lex/dyn scope. * lisp/emacs-lisp/bytecomp.el (byte-to-native-top-level): Add 'lexical' slot. (byte-compile-output-file-form): Update for new slot. (byte-compile-file-form-defmumble): Capture scope. * lisp/emacs-lisp/comp.el (comp-emit-for-top-level): Specify execution scope. --- lisp/emacs-lisp/bytecomp.el | 7 ++++--- lisp/emacs-lisp/comp.el | 12 +++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 9e39b8f78ac..c7d2344dbd2 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -585,7 +585,7 @@ Each element is (INDEX . VALUE)") name c-name byte-func) (cl-defstruct byte-to-native-top-level "All other top-level forms." - form) + form lexical) (defvar byte-native-compiling nil "Non nil while native compiling.") @@ -2248,7 +2248,7 @@ Call from the source buffer." ;; it here. (when byte-native-compiling ;; Spill output for the native compiler here - (push (make-byte-to-native-top-level :form form) + (push (make-byte-to-native-top-level :form form :lexical lexical-binding) byte-to-native-top-level-forms)) (let ((print-escape-newlines t) (print-length nil) @@ -2707,7 +2707,8 @@ not to take responsibility for the actual compilation of the code." ;; Spill output for the native compiler here. (push (if macro (make-byte-to-native-top-level - :form `(defalias ',name '(macro . ,code) nil)) + :form `(defalias ',name '(macro . ,code) nil) + :lexical lexical-binding) (make-byte-to-native-func-def :name name :byte-func code)) byte-to-native-top-level-forms)) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index e7bd0690727..928fa516ed5 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -1373,11 +1373,13 @@ the annotation emission." (cl-defmethod comp-emit-for-top-level ((form byte-to-native-top-level) for-late-load) (unless for-late-load - (let ((form (byte-to-native-top-level-form form))) - (comp-emit (comp-call 'eval - (let ((comp-curr-allocation-class 'd-impure)) - (make-comp-mvar :constant form)) - (make-comp-mvar :constant t)))))) + (comp-emit + (comp-call 'eval + (let ((comp-curr-allocation-class 'd-impure)) + (make-comp-mvar :constant + (byte-to-native-top-level-form form))) + (make-comp-mvar :constant + (byte-to-native-top-level-lexical form)))))) (defun comp-emit-lambda-for-top-level (func) "Emit the creation of subrs for lambda FUNC. -- 2.39.5