]> git.eshelyaron.com Git - emacs.git/commitdiff
Maintain byte-compile-form-stack in cconv-convert (bug#67483)
authorMattias Engdegård <mattiase@acm.org>
Wed, 20 Dec 2023 12:21:36 +0000 (13:21 +0100)
committerMattias Engdegård <mattiase@acm.org>
Thu, 21 Dec 2023 12:20:27 +0000 (13:20 +0100)
* lisp/emacs-lisp/macroexp.el (macroexp--with-extended-form-stack):
New.
* lisp/emacs-lisp/cconv.el (cconv-closure-convert, cconv-convert):
Push forms onto byte-compile-form-stack.

lisp/emacs-lisp/cconv.el
lisp/emacs-lisp/macroexp.el

index 0879c2ee63c4212eb92b8515ec0e0ffbe6d0ae13..136560f3ef435077621bc1567df91b17cb2173af 100644 (file)
@@ -123,7 +123,8 @@ using dynamic scoping.
 Returns a form where all lambdas don't have any free variables."
   (let ((cconv--dynbound-variables dynbound-vars)
        (cconv-freevars-alist '())
-       (cconv-var-classification '()))
+       (cconv-var-classification '())
+        (byte-compile-form-stack byte-compile-form-stack))
     ;; Analyze form - fill these variables with new information.
     (cconv-analyze-form form '())
     (setq cconv-freevars-alist (nreverse cconv-freevars-alist))
@@ -328,6 +329,7 @@ places where they originally did not directly appear."
   ;; to find the number of a specific variable in the environment vector,
   ;; so we never touch it(unless we enter to the other closure).
   ;;(if (listp form) (print (car form)) form)
+  (macroexp--with-extended-form-stack form
   (pcase form
     (`(,(and letsym (or 'let* 'let)) ,binders . ,body)
 
@@ -624,7 +626,7 @@ places where they originally did not directly appear."
        (byte-compile-warn-x form "Malformed function `%S'" func)
        nil))
 
-    (_ (or (cdr (assq form env)) form))))
+    (_ (or (cdr (assq form env)) form)))))
 
 (defvar byte-compile-lexical-variables)
 
index 615a6622ce602a7d7ee8a4443ad79fbc12fe9578..2a646be9725c1ae63ace69d9d3a217b57ac75739 100644 (file)
@@ -39,6 +39,18 @@ of `byte-compile-form', etc., and manually popped off at its end.
 This is to preserve the data in it in the event of a
 condition-case handling a signaled error.")
 
+(defmacro macroexp--with-extended-form-stack (expr &rest body)
+  "Evaluate BODY with EXPR pushed onto `byte-compile-form-stack'."
+  (declare (indent 1))
+  ;; FIXME: We really should just be using a simple dynamic let-binding here,
+  ;; but these explicit push and pop make the extended stack value visible
+  ;; to error handlers.  Remove that need for that!
+  `(progn
+     (push ,expr byte-compile-form-stack)
+     (prog1
+         (progn ,@body)
+       (pop byte-compile-form-stack))))
+
 ;; Bound by the top-level `macroexpand-all', and modified to include any
 ;; macros defined by `defmacro'.
 (defvar macroexpand-all-environment nil)