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))
;; 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)
(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)
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)