mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-25 13:05:05 +02:00
Full vector compilation
This commit is contained in:
parent
bc01c9dd19
commit
30619d8709
1 changed files with 41 additions and 7 deletions
42
cgen.scm
42
cgen.scm
|
@ -317,13 +317,47 @@
|
||||||
num-args)))
|
num-args)))
|
||||||
|
|
||||||
(define (c-compile-vector exp)
|
(define (c-compile-vector exp)
|
||||||
;; TODO: this is just a stub, does not allocate vector contents
|
(letrec ((cvar-name (mangle (gensym 'vec)))
|
||||||
(let ((cvar-name (mangle (gensym 'c))))
|
(len (vector-length exp))
|
||||||
|
;; Generate code for each member of the vector
|
||||||
|
(loop
|
||||||
|
(lambda (i code)
|
||||||
|
(if (= i len)
|
||||||
|
code
|
||||||
|
(let ((idx-code (c-compile-const (vector-ref exp i))))
|
||||||
|
(loop
|
||||||
|
(+ i 1)
|
||||||
|
(c-code/vars
|
||||||
|
;; The vector's C variable
|
||||||
|
(c:body code)
|
||||||
|
;; Allocations
|
||||||
|
(append
|
||||||
|
(c:allocs code) ;; Vector alloc
|
||||||
|
(c:allocs idx-code) ;; Member alloc at index i
|
||||||
|
(list ;; Assign this member to vector
|
||||||
|
(string-append
|
||||||
|
cvar-name ".elts[" (number->string i) "] = "
|
||||||
|
(c:body idx-code)
|
||||||
|
";")))))))))
|
||||||
|
)
|
||||||
|
(cond
|
||||||
|
((zero? len)
|
||||||
(c-code/vars
|
(c-code/vars
|
||||||
(string-append "&" cvar-name) ; Code is just the variable name
|
(string-append "&" cvar-name) ; Code is just the variable name
|
||||||
(list ; Allocate integer on the C stack
|
(list ; Allocate empty vector
|
||||||
(string-append
|
(string-append
|
||||||
"make_empty_vector(" cvar-name ");")))))
|
"make_empty_vector(" cvar-name ");"))))
|
||||||
|
(else
|
||||||
|
(let ((code
|
||||||
|
(c-code/vars
|
||||||
|
(string-append "&" cvar-name) ; Code body is just var name
|
||||||
|
(list ; Allocate the vector
|
||||||
|
(string-append
|
||||||
|
"make_empty_vector(" cvar-name ");"
|
||||||
|
cvar-name ".num_elt = " (number->string len) ";"
|
||||||
|
cvar-name ".elts = (object *)alloca(sizeof(object) * "
|
||||||
|
(number->string len) ");")))))
|
||||||
|
(loop 0 code))))))
|
||||||
|
|
||||||
;; c-compile-const : const-exp -> c-pair
|
;; c-compile-const : const-exp -> c-pair
|
||||||
;;
|
;;
|
||||||
|
|
Loading…
Add table
Reference in a new issue