www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 891c9556a9e76f63c19e910907d291cd2101cd1a
parent 1c406e92854e732446a94dcaa7fa7d61e81f9f77
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Thu, 13 Jan 2011 16:39:25 +0100

Le make-closure et le funcall sont encore au brouillon, mais on a tout.

Diffstat:
Mlisp/compilation.lisp | 29++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/lisp/compilation.lisp b/lisp/compilation.lisp @@ -344,6 +344,8 @@ Attention : il y a quelques invariants qui ne sont pas présents dans cette vér `(section code ,(code-label name))) ((jump :dest $$) `(section code (jmp ,(code-label name)))) + ;; TODO : cas particulier funcall car + ;; TODO : cas particulier funcall cdr ((funcall :fun _ :params _*) `(section code (push (register ip)) @@ -380,15 +382,27 @@ Attention : il y a quelques invariants qui ne sont pas présents dans cette vér ;; allways set cdr to nil, in case the gc came by : ;; mov constant-nil r0[+5] ;; mov r0 r1 - + ;; On calcule la fonction : ;; push r1 (compilo-3 fun) + + ;; Facultatif : + ;; On teste si le premier octet de *r0 est bien closure-object (sait-on jamais…) + ;; mov [r0] r1 + ;; cmp (constante ...) r1 + ;; jneq (syslabel invalid closure object) + ;; Fin facultatif - ;; TODO : gérer la closure - - ;; push ip - ;; jmp r0 + ;; On récupère la closure + ;; mov r0[+5] r1 + ;; push r1 ;; on push la closure + ;; TODO !!! la closure et les paramètres sont dans le mauvais ordre ! corriger ça dans le préambule de la fonction + ;; On récupère la fonction + ;; mov r0[+1] r0 + ;; On appelle la fonction + ;; push ip + ;; jmp r0 ;; calculer les paramètres un à un @@ -417,9 +431,10 @@ Attention : il y a quelques invariants qui ne sont pas présents dans cette vér ,(compilo-3 value) (mov (register r0) (memory ,(global-label-variable name))))) ((make-closure :fun $$ :vars $$*) - ;; On alloue 5 octets pour un objet closure + ;; On alloue 1+4+4 octets pour un objet closure ;; set type = closure-object - ;; set valeur = on construit une liste de longueur (length vars) en la remplissant avec les valeurs des vars. + ;; set mot1 = adresse de la fonction + ;; set mot2 = on construit une liste de longueur (length vars) en la remplissant avec les valeurs des vars. t) ((make-captured-var :name $$) `(section code