]> git.eshelyaron.com Git - emacs.git/commitdiff
* Do not refuse to compile if a dynamic lambda is encountered
authorAndrea Corallo <akrl@sdf.org>
Fri, 15 May 2020 10:43:31 +0000 (11:43 +0100)
committerAndrea Corallo <akrl@sdf.org>
Fri, 15 May 2020 19:06:49 +0000 (20:06 +0100)
* lisp/emacs-lisp/comp.el (comp-lex-byte-func-p): New subst.
(comp-intern-func-in-ctxt): Do not crash if we still encounter a
non lexical scoped lambda.

lisp/emacs-lisp/comp.el

index 38c89ec263b393b946b65e62185609f5eb5db2f6..662cfe2d4e8c08ccd149bae1c1d9a63a824f4a94 100644 (file)
@@ -487,6 +487,11 @@ VERBOSITY is a number between 0 and 3."
 \f
 ;;; spill-lap pass specific code.
 
+(defsubst comp-lex-byte-func-p (f)
+  "Return t if F is a lexical scoped byte compiled function."
+  (and (byte-code-function-p f)
+       (fixnump (aref f 0))))
+
 (defun comp-c-func-name (name prefix)
   "Given NAME return a name suitable for the native code.
 Put PREFIX in front of it."
@@ -590,28 +595,31 @@ Put PREFIX in front of it."
                                       byte-func))
                         return form))
            (name (when top-l-form
-                   (byte-to-native-func-def-name top-l-form)))
-           (c-name (comp-c-func-name (or name "anonymous-lambda") "F"))
-           (func (make-comp-func :name name
-                                 :byte-func byte-func
-                                 :doc (documentation byte-func)
-                                 :int-spec (interactive-form byte-func)
-                                 :c-name c-name
-                                 :args (comp-decrypt-arg-list (aref byte-func 0)
-                                                              name)
-                                 :lap lap
-                                 :frame-size (comp-byte-frame-size byte-func))))
-      ;; Store the c-name to have it retrivable from
-      ;; `comp-ctxt-top-level-forms'.
-      (when top-l-form
-        (setf (byte-to-native-func-def-c-name top-l-form) c-name))
-      (unless name
-        (puthash byte-func func (comp-ctxt-byte-func-to-func-h comp-ctxt)))
-      ;; Create the default array.
-      (puthash 0 (comp-func-frame-size func) (comp-func-array-h func))
-      (comp-add-func-to-ctxt func)
-      (comp-log (format "Function %s:\n" name) 1)
-      (comp-log lap 1))))
+                   (byte-to-native-func-def-name top-l-form))))
+      ;; Do not refuse to compile if a dynamic byte-compiled lambda
+      ;; leaks here (advice).
+      (when (or name (comp-lex-byte-func-p byte-func))
+        (let* ((c-name (comp-c-func-name (or name "anonymous-lambda") "F"))
+               (func (make-comp-func :name name
+                                     :byte-func byte-func
+                                     :doc (documentation byte-func)
+                                     :int-spec (interactive-form byte-func)
+                                     :c-name c-name
+                                     :args (comp-decrypt-arg-list (aref byte-func 0)
+                                                                  name)
+                                     :lap lap
+                                     :frame-size (comp-byte-frame-size byte-func))))
+          ;; Store the c-name to have it retrivable from
+          ;; `comp-ctxt-top-level-forms'.
+          (when top-l-form
+            (setf (byte-to-native-func-def-c-name top-l-form) c-name))
+          (unless name
+            (puthash byte-func func (comp-ctxt-byte-func-to-func-h comp-ctxt)))
+          ;; Create the default array.
+          (puthash 0 (comp-func-frame-size func) (comp-func-array-h func))
+          (comp-add-func-to-ctxt func)
+          (comp-log (format "Function %s:\n" name) 1)
+          (comp-log lap 1))))))
 
 (cl-defgeneric comp-spill-lap-function ((filename string))
   "Byte compile FILENAME spilling data from the byte compiler."