From a006c661a194672c2d8f5730d3c207dd083ddbf0 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 24 Jul 2019 16:36:58 +0100 Subject: [PATCH] More WIP on closures --- codegen.scm | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/codegen.scm b/codegen.scm index b403939..571f1ef 100644 --- a/codegen.scm +++ b/codegen.scm @@ -105,18 +105,22 @@ (set! cur-lambda (+ 1 cur-lambda)) (format "_lambda~a" (- cur-lambda 1))) +; a closure on the heap looks like: +; 0-x x+0 x+4 x+12 x+20 +; label #vars var1.... var2.... var3.... (define (codegen-closure label captured si env) -;; (define (codegen-closure label captured si env) -;; (let* ((stack-offsets (map (lambda (x) (- si (* x wordsize)))) -;; (range 0 (length captured))) -;; (inner-si (- si (* (length captured) wordsize)))) -;; (for-each (lambda (var-name new-offset) -;; (emit "movq ~a(%rbp), ~a(%rbp)" ; todo: do we need to copy this? -;; (cdr (assoc var-name env)) -;; new-offset)) -;; captured -;; stack-offsets) -;; ) + (let* ((heap-offsets (range 4 (length captured))) ; 4, 12, 20, etc. + (inner-si (- si (* (length captured) wordsize)))) + (emit "movl $~a, (heap_start)") + (emit "add $4, (heap_start)") + (for-each (lambda (var-name new-offset) + (emit "movq ~a(%rbp), ~a(heap_start)" ; todo: do we need to copy this? + (cdr (assoc var-name env)) + new-offset) + (emit "add $8, (heap_start)") + captured + stack-offsets) +) ; for now we can only call closures (define (codegen-call closure args si env) ; (codegen-expr closure si env) -- 2.30.2