WIP - passing AST lambda's to closure-convert

This commit is contained in:
Justin Ethier 2018-09-04 19:00:22 -04:00
parent 8f8df24b15
commit 7b76453591

View file

@ -1618,16 +1618,16 @@
(let ((fn (car exp)) (let ((fn (car exp))
(args (map cc (cdr exp)))) (args (map cc (cdr exp))))
(cond (cond
((lambda? fn) ((ast:lambda? fn)
(cond (cond
;; If the lambda argument is not used, flag so the C code is ;; If the lambda argument is not used, flag so the C code is
;; all generated within the same function ;; all generated within the same function
((and #f ((and #f
(> optimization-level 0) (> optimization-level 0)
(eq? (lambda-formals-type fn) 'args:fixed) (eq? (ast:lambda-formals-type fn) 'args:fixed)
(pair? (lambda-formals->list fn)) (pair? (ast:lambda-formals->list fn))
(with-var (with-var
(car (lambda-formals->list fn)) (car (ast:lambda-formals->list fn))
(lambda (var) (lambda (var)
(zero? (adbv:ref-count var)))) (zero? (adbv:ref-count var))))
;; Non-CPS args ;; Non-CPS args
@ -1640,12 +1640,12 @@
args)) args))
`(Cyc-seq `(Cyc-seq
,@args ,@args
,@(map cc (lambda->exp fn)))) ,@(map cc (ast:lambda-body fn))))
(else (else
(let* ((body (lambda->exp fn)) (let* ((body (ast:lambda-body fn))
(new-free-vars (new-free-vars
(difference (difference
(difference (free-vars body) (lambda-formals->list fn)) (difference (free-vars body) (ast:lambda-formals->list fn))
globals)) globals))
(new-free-vars? (> (length new-free-vars) 0))) (new-free-vars? (> (length new-free-vars) 0)))
(if new-free-vars? (if new-free-vars?
@ -1654,16 +1654,17 @@
`((%closure `((%closure
(lambda (lambda
,(list->lambda-formals ,(list->lambda-formals
(cons new-self-var (lambda-formals->list fn)) (cons new-self-var (ast:lambda-formals->list fn))
(lambda-formals-type fn)) (ast:lambda-formals-type fn))
,(convert (car body) new-self-var new-free-vars)) ,(convert (car body) new-self-var new-free-vars))
,@(map (lambda (v) (cc v)) ,@(map (lambda (v) (cc v))
new-free-vars)) new-free-vars))
,@args)) ,@args))
; No free vars, just create simple lambda ; No free vars, just create simple lambda
`((lambda ,(lambda->formals fn) `((lambda ,(ast:lambda-args fn)
,@(map cc body)) ,@(map cc body))
,@args)))))) ,@args))))))
((lambda? fn) (error `(Unexpected lambda in closure-convert ,exp)))
(else (else
(let ((f (cc fn))) (let ((f (cc fn)))
`((%closure-ref ,f 0) `((%closure-ref ,f 0)