- (names (map car bindings))
- (exprs (map cadr bindings))
-
- ; recursive let bindings: build environment as we go
- (inner-env (fold-left
- (lambda (env name expr offset)
- (codegen-expr expr inner-si env)
- (emit "movq %rax, ~a(%rbp)" offset)
- (cons (cons name offset) env))
- env names exprs stack-offsets)))
+
+ (get-offset (lambda (n) (cdr (assoc n stack-offsets))))
+
+ [inner-env
+ (fold-left
+ (lambda (env comps)
+ (let ([scc-env
+ (fold-left
+ (lambda (acc name)
+ (cons (cons name (get-offset name))
+ acc))
+ env
+ comps)])
+ (for-each
+ (lambda (name)
+ (let ([expr (cadr (assoc name bindings))])
+ (emit "## generating ~a with scc-env ~a" name scc-env)
+ (if (self-captive-closure? name expr)
+ ; if self-captive, insert a flag into the environment to let
+ ; codegen-closure realise this!
+ (codegen-expr expr
+ inner-si
+ (cons (cons name 'self-captive)
+ scc-env))
+ (codegen-expr expr inner-si scc-env))
+ (emit "movq %rax, ~a(%rbp)" (get-offset name))))
+ comps)
+ scc-env))
+ env (reverse (sccs (graph bindings))))])
+