mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-24 05:21:20 -08:00
Add regression tests for recent bugs / problems.
Bug with bclosure is not fixed yet.
This commit is contained in:
parent
d9da8648cd
commit
2f01e576a2
1 changed files with 70 additions and 0 deletions
|
|
@ -1331,3 +1331,73 @@
|
|||
(GO :G124)))))
|
||||
(compile 'fooman)
|
||||
(finishes (fooman)))
|
||||
|
||||
;;; Date 2018-02-10
|
||||
;;; Description
|
||||
;;;
|
||||
;;; Compiler macros do not get shadowed by lexical function bindings.
|
||||
;;;
|
||||
;;; Spec: http://www.lispworks.com/documentation/HyperSpec/Body/03_bba.htm
|
||||
;;; Bug https://gitlab.com/embeddable-common-lisp/ecl/issues/83
|
||||
;;; Bug https://gitlab.com/embeddable-common-lisp/ecl/issues/237
|
||||
(test cmp.0063.lexical-macrolet
|
||||
(defun foo () :function)
|
||||
(define-compiler-macro foo () :compiler-macro)
|
||||
(let ((result (funcall (compile nil '(lambda ()
|
||||
(macrolet ((foo () :macrolet))
|
||||
(foo)))))))
|
||||
(is (eq :macrolet result) "Expected :MACROLET, got ~s." result)))
|
||||
|
||||
;;; 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.
|
||||
;;;
|
||||
;;; Bug https://gitlab.com/embeddable-common-lisp/ecl/issues/429
|
||||
(test cmp.0064.bytecmp-compile-bclosure
|
||||
(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 (ext::bc-compile nil fun-1))
|
||||
(fun-2 (ext::bc-compile nil fun-2))
|
||||
(fun-3 (ext::bc-compile nil fun-3))
|
||||
(fun-4 (ext::bc-compile nil fun-4)))
|
||||
(is (eq :fun-1-nil (funcall fun-1)))
|
||||
(is (eq :var (ignore-errors (funcall fun-2))) "fun-2-var from lexenv is not used.")
|
||||
(is (eq :fun (ignore-errors (funcall fun-3))) "fun-3-fun from lexenv is not used.")
|
||||
(is (eq :mac (ignore-errors (funcall fun-4))) "fun-4-mac from lexenv is not used."))))
|
||||
|
||||
(test cmp.0065.cmp-compile-bclosure
|
||||
(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)))
|
||||
(is (eq :fun-1-nil (funcall fun-1)))
|
||||
(is (eq :var (ignore-errors (funcall fun-2))) "fun-2-var from lexenv is not used.")
|
||||
(is (eq :fun (ignore-errors (funcall fun-3))) "fun-3-fun from lexenv is not used.")
|
||||
(is (eq :mac (ignore-errors (funcall fun-4))) "fun-4-mac from lexenv is not used."))))
|
||||
|
||||
;;; Date 2018-02-12
|
||||
;;; Description
|
||||
;;;
|
||||
;;; bytecmp always makes flet functions closures even if lexenv is empty.
|
||||
(test cmp.0066.bytecodes-flet-closure
|
||||
(let ((fun-1 (flet ((a () 1)) #'a))
|
||||
(fun-2 (let ((b 3)) ; this make break if we replace B with a constant
|
||||
(flet ((a () b)) #'a))))
|
||||
(is (null (nth-value 1 (function-lambda-expression fun-1))))
|
||||
(is (nth-value 1 (function-lambda-expression fun-2)))))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue