Added c-compile-closure-element-ref

This commit is contained in:
Justin Ethier 2018-09-19 13:31:36 -04:00
parent 7cb83e17d8
commit bd8e5cb1de

View file

@ -869,12 +869,17 @@
((equal? '%closure-ref fun) ((equal? '%closure-ref fun)
(c-code (apply string-append (list (c-code (apply string-append (list
"(" (c-compile-closure-element-ref
;; TODO: probably not the ideal solution, but works for now ast-id
"(closureN)" (car args)
(mangle (car args)) (number->string (- (cadr args) 1)))
")->elements[" ;"("
(number->string (- (cadr args) 1))"]")))) ;;; TODO: probably not the ideal solution, but works for now
;"(closureN)"
;(mangle (car args))
;")->elements["
;(number->string (- (cadr args) 1))"]"
))))
;; TODO: may not be good enough, closure app could be from an element ;; TODO: may not be good enough, closure app could be from an element
((tagged-list? '%closure-ref fun) ((tagged-list? '%closure-ref fun)
@ -1214,6 +1219,14 @@
(check (cdr lis)) (check (cdr lis))
(check lis)))) (check lis))))
;; c-compile-closure-element-ref :: integer -> symbol -> integer -> string
;;
;; Compile a reference to an element of a closure.
(define (c-compile-closure-element-ref ast-id var idx)
(string-append
"((closureN)" (mangle var) ")->elements[" idx "]"))
;; c-compile-closure : closure-exp (string -> void) -> string ;; c-compile-closure : closure-exp (string -> void) -> string
;; ;;
;; This function compiles closures generated earlier in the ;; This function compiles closures generated earlier in the
@ -1236,8 +1249,10 @@
(if (tagged-list? '%closure-ref free-var) (if (tagged-list? '%closure-ref free-var)
(let ((var (cadr free-var)) (let ((var (cadr free-var))
(idx (number->string (- (caddr free-var) 1)))) (idx (number->string (- (caddr free-var) 1))))
(string-append (c-compile-closure-element-ref (ast:lambda-id lam) var idx)
"((closureN)" (mangle var) ")->elements[" idx "]")) ;(string-append
; "((closureN)" (mangle var) ")->elements[" idx "]")
)
(mangle free-var))) (mangle free-var)))
(closure->fv exp))) ; Note these are not necessarily symbols, but in cc form (closure->fv exp))) ; Note these are not necessarily symbols, but in cc form
(cv-name (mangle (gensym 'c))) (cv-name (mangle (gensym 'c)))