[go: up one dir, main page]

Skip to content

ecl_bclosure can't be compiled (lexenv is lost)

When we compile ecl_bclosure we lose its lexenv what leads to compiled function corruption. See this test:

;;; Date 2018-02-11
;;; Description
;;;
;;;   ecl_bclosure lexenv is not used during complation (both bytecmp and ccmp).
;;;   That leads to dangling references in compiled code.
(test cmp.0064.bytecodes-macrolet
  (let ((fun-1                                 (lambda () :fun-1-nil))
        (fun-2 (let      ((fun-2-var    :var)) (lambda () fun-2-var)))
        (fun-3 (flet     ((fun-3-fun () :fun)) (lambda () (fun-3-fun))))
        (fun-4 (macrolet ((fun-4-mac () :mac)) (lambda () (fun-4-mac)))))
    (is (eq :fun-1-nil (funcall fun-1)))
    (is (eq :var (funcall fun-2)))
    (is (eq :fun (funcall fun-3)))
    (is (eq :mac (funcall fun-4)))
    (let ((fun-1 (compile nil fun-1))
          (fun-2 (compile nil fun-2))
          (fun-3 (compile nil fun-3))
          (fun-4 (compile nil fun-4)))
      (finishes (is (eq :fun-1-nil (funcall fun-1))))
      (finishes (is (eq :var (funcall fun-2)) "fun-2-var is bound in function lexenv."))
      (finishes (is (eq :fun (funcall fun-3)) "fun-3-fun is bound in function lexenv."))
      (finishes (is (eq :mac (funcall fun-4)) "fun-4-mac is bound in function lexenv.")))))
Edited by Daniel Kochmański