commit 3038d3dad552ca4c8cc791227fe703c4b7eb8012
parent b221526cb72abd39c6a2f090d167906b32496102
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Thu, 13 Jan 2011 22:02:49 +0100
Compilo : (+ 2 3) (lambda (x) x)
Diffstat:
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/lisp/compilation.lisp b/lisp/compilation.lisp
@@ -452,8 +452,8 @@ Attention : il y a quelques invariants qui ne sont pas présents dans cette vér
(mov (register r0) (memory ,(global-label-variable name)))))
((make-closure :fun $$ :vars $$*)
`(section code
- ;; On alloue 1+4+4 octets pour un objet closure
- (mov (constant ,(+ 1 4 4)) (register r1))
+ ;; On alloue 1+4+4 octets pour un objet closure, et 9*(length vars) pour les cons.
+ (mov (constant ,(+ 1 4 4 (* 9 (length vars)))) (register r1))
(push (register ip))
(jmp (constant ,(syslabel 'alloc-tas)))
;; set type = closure-object
@@ -461,8 +461,26 @@ Attention : il y a quelques invariants qui ne sont pas présents dans cette vér
;; set mot1 = adresse de la fonction
(mov (constant ,(global-label-variable fun)) (indexed 1 r0))
;; set mot2 = on construit une liste de longueur (length vars) en la remplissant avec les valeurs des vars.
- ;; TODO !!!
- ))
+ (mov (register r0) (register r1))
+
+ ,@(loop
+ for i from 0 below (- (length vars) 1)
+ append `((add (constant 9) (register r1))
+ (mov (register r1) (indexed ,(+ 5 (* 9 i)) r0))))
+ ;; nil final
+ (mov (constant ,(syslabel nil)) (indexed ,(+ 5 (* 9 (- (length vars) 1))) r0))
+ ,@(loop
+ for i from 1 to (length vars)
+ and name in vars
+ for not-captured = (code-label (make-symbol "NOT-CAPTURED"))
+ for assoc = (assoc name variables)
+ unless assoc do (error "compilo-3 : make-closure sur ~a, mais n'est pas présente dans les variables:~&~a" name variables)
+ append `((mov (indexed ,(cdr assoc) bp) (register r2))
+ (cmp (indirect-register r2) (constant ,(type-number 'captured-var)))
+ (jne (constant ,not-captured))
+ (mov (indexed 1 r2) (register r2))
+ ,not-captured
+ (mov (register r2) (indexed ,(+ 1 (* 9 i)) r0))))))
((make-captured-var :name $$)
`(section code
;; allouer 5 octets