WIP, working through immutable objects

This commit is contained in:
Justin Ethier 2019-05-15 22:57:40 -04:00
parent daa8f92f0c
commit 8c7bd7f96b

View file

@ -384,7 +384,7 @@
trace trace
cps?)) cps?))
;; Core forms: ;; Core forms:
((const? exp) (c-compile-const exp (alloca? ast-id trace))) ((const? exp) (c-compile-const exp (alloca? ast-id trace) #f)) ;; TODO: OK to hardcode immutable to false here??
((prim? exp) ((prim? exp)
;; TODO: this needs to be more refined, probably w/a lookup table ;; TODO: this needs to be more refined, probably w/a lookup table
(c-code (string-append "primitive_" (mangle exp)))) (c-code (string-append "primitive_" (mangle exp))))
@ -444,7 +444,7 @@
((null? args) ((null? args)
(c-code "NULL")) (c-code "NULL"))
((not (pair? args)) ((not (pair? args))
(c-compile-const args use-alloca)) (c-compile-const args use-alloca immutable))
(else (else
(let* ((cvar-name (mangle (gensym 'c))) (let* ((cvar-name (mangle (gensym 'c)))
(cell (create-cons (cell (create-cons
@ -461,7 +461,7 @@
(_c-compile-scalars args) (_c-compile-scalars args)
num-args))) num-args)))
(define (c-compile-vector exp use-alloca) (define (c-compile-vector exp use-alloca immutable)
(letrec ((cvar-name (mangle (gensym 'vec))) (letrec ((cvar-name (mangle (gensym 'vec)))
(len (vector-length exp)) (len (vector-length exp))
(ev-name (mangle (gensym 'e))) (ev-name (mangle (gensym 'e)))
@ -478,7 +478,7 @@
(lambda (i code) (lambda (i code)
(if (= i len) (if (= i len)
code code
(let ((idx-code (c-compile-const (vector-ref exp i) use-alloca))) (let ((idx-code (c-compile-const (vector-ref exp i) use-alloca immutable)))
(loop (loop
(+ i 1) (+ i 1)
(c-code/vars (c-code/vars
@ -499,7 +499,8 @@
(string-append addr-op cvar-name) ; Code is just the variable name (string-append addr-op cvar-name) ; Code is just the variable name
(list ; Allocate empty vector (list ; Allocate empty vector
(string-append (string-append
c-make-macro "(" cvar-name ");")))) c-make-macro "(" cvar-name ");"
(c-set-immutable-field cvar-name use-alloca immutable)))))
(else (else
(let ((code (let ((code
(c-code/vars (c-code/vars
@ -509,7 +510,9 @@
elem-decl elem-decl
c-make-macro "(" cvar-name ");" c-make-macro "(" cvar-name ");"
cvar-name deref-op "num_elements = " (number->string len) ";" cvar-name deref-op "num_elements = " (number->string len) ";"
cvar-name deref-op "elements = (object *)" ev-name ";"))))) cvar-name deref-op "elements = (object *)" ev-name ";"
(c-set-immutable-field cvar-name use-alloca immutable)
)))))
(loop 0 code)))))) (loop 0 code))))))
(define (c-compile-bytevector exp use-alloca) (define (c-compile-bytevector exp use-alloca)
@ -610,7 +613,7 @@
((pair? exp) ((pair? exp)
(c-compile-scalars exp use-alloca immutable)) (c-compile-scalars exp use-alloca immutable))
((vector? exp) ((vector? exp)
(c-compile-vector exp use-alloca)) (c-compile-vector exp use-alloca immutable))
((bytevector? exp) ((bytevector? exp)
(c-compile-bytevector exp use-alloca)) (c-compile-bytevector exp use-alloca))
((bignum? exp) ((bignum? exp)