* Do not refuse to compile if a dynamic lambda is encountered

* 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.
This commit is contained in:
Andrea Corallo 2020-05-15 11:43:31 +01:00
parent 9a64585c12
commit d6f6353cfd

View file

@ -487,6 +487,11 @@ VERBOSITY is a number between 0 and 3."
;;; 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."