WIP, eliminating more unused lambda's

This commit is contained in:
Justin Ethier 2017-07-07 14:14:16 +00:00
parent 2fd88a15e6
commit 8ed042573a

View file

@ -1468,33 +1468,47 @@
((app? exp) ((app? exp)
(let ((fn (car exp)) (let ((fn (car exp))
(args (map cc (cdr exp)))) (args (map cc (cdr exp))))
(if (lambda? fn) (cond
(let* ((body (lambda->exp fn)) ((lambda? fn)
(new-free-vars (cond
(difference ;; If the lambda argument is not used, flag so the C code is
(difference (free-vars body) (lambda-formals->list fn)) ;; all generated within the same function
globals)) ((and (eq? (lambda-formals-type fn) 'args:fixed)
(new-free-vars? (> (length new-free-vars) 0))) (with-var
(if new-free-vars? (car (lambda-formals->list fn))
; Free vars, create a closure for them (lambda (var)
(let* ((new-self-var (gensym 'self))) (zero? (adbv:ref-count var)))))
`((%closure `(Cyc-seq
(lambda ,@args
,(list->lambda-formals ,@(map cc (lambda->exp fn))))
(cons new-self-var (lambda-formals->list fn)) (else
(lambda-formals-type fn)) (let* ((body (lambda->exp fn))
,(convert (car body) new-self-var new-free-vars)) (new-free-vars
,@(map (lambda (v) (cc v)) (difference
new-free-vars)) (difference (free-vars body) (lambda-formals->list fn))
,@args)) globals))
; No free vars, just create simple lambda (new-free-vars? (> (length new-free-vars) 0)))
`((lambda ,(lambda->formals fn) (if new-free-vars?
,@(map cc body)) ; Free vars, create a closure for them
,@args))) (let* ((new-self-var (gensym 'self)))
`((%closure
(lambda
,(list->lambda-formals
(cons new-self-var (lambda-formals->list fn))
(lambda-formals-type fn))
,(convert (car body) new-self-var new-free-vars))
,@(map (lambda (v) (cc v))
new-free-vars))
,@args))
; No free vars, just create simple lambda
`((lambda ,(lambda->formals fn)
,@(map cc body))
,@args))))))
(else
(let ((f (cc fn))) (let ((f (cc fn)))
`((%closure-ref ,f 0) `((%closure-ref ,f 0)
,f ,f
,@args))))) ,@args))))))
(else (else
(error "unhandled exp: " exp)))) (error "unhandled exp: " exp))))
(cc exp)) (cc exp))