This commit is contained in:
Justin Ethier 2021-02-02 22:58:00 -05:00
parent e1082710fe
commit 02fdcd2532

View file

@ -2092,7 +2092,7 @@
;; Emit inlinable function list ;; Emit inlinable function list
(cond (cond
((not program?) ((not program?)
(emit* "void c_" (lib:name->string lib-name) "_inlinable_lambdas(void *data, object clo, object k, int argc, object *args){ ") (emit* "void c_" (lib:name->string lib-name) "_inlinable_lambdas(void *data, object clo, int argc, object *args){ ")
(let ((pairs '()) (let ((pairs '())
(head-pair #f)) (head-pair #f))
(for-each (for-each
@ -2125,28 +2125,23 @@
(loop (cons (string-append "make_pair(" (car cs) ", &" (car ps) ", &" (cadr cs) ");\n") code) (loop (cons (string-append "make_pair(" (car cs) ", &" (car ps) ", &" (cadr cs) ");\n") code)
(cdr ps) (cdr ps)
(cdr cs))))) (cdr cs)))))
;cargs TODO: (emit* "object buf[1];"); (emit* "object buf[1]; object cont = args[0]");
(if head-pair (if head-pair
;TODO: need to change these function calls over (emit* "buf[0] = &" head-pair "; (((closure)cont)->fn)(data, cont, 1, buf);")
;also, go back and check our changes, I think there is at least one other direct closure call we need to update (emit* "buf[0] = NULL; (((closure)cont)->fn)(data, cont 1, buf);"))
;;
;; TODO: yes, just search for all ->fn calls
;;
(emit* "(((closure)k)->fn)(data, k, 1, &" head-pair ");")
(emit* "(((closure)k)->fn)(data, k, 1, NULL);"))
(emit* " } ")))) (emit* " } "))))
;; Emit entry point ;; Emit entry point
(cond (cond
(program? (program?
(emit "static void c_entry_pt_first_lambda(void *data, object clo, object k, int argc, object *args);") (emit "static void c_entry_pt_first_lambda(void *data, object clo, int argc, object *args);")
(for-each (for-each
(lambda (lib-name) (lambda (lib-name)
(emit* "extern void c_" (lib:name->string lib-name) "_entry_pt(void *data, object clo, object k, int argc, object* args);")) (emit* "extern void c_" (lib:name->string lib-name) "_entry_pt(void *data, object clo, int argc, object* args);"))
required-libs) required-libs)
(emit "static void c_entry_pt(void *data, object clo, object k, int argc, object *args) { ")) (emit "static void c_entry_pt(void *data, object clo, int argc, object *args) { "))
(else (else
(emit* "void c_" (lib:name->string lib-name) "_entry_pt_first_lambda(void *data, object clo, object k, int argc, object *args){ ") (emit* "void c_" (lib:name->string lib-name) "_entry_pt_first_lambda(void *data, object clo, int argc, object *args){ ")
)) ))
;; Set global-changed indicator ;; Set global-changed indicator
@ -2283,12 +2278,13 @@
;; Start cont chain, but do not assume closcall1 macro was defined ;; Start cont chain, but do not assume closcall1 macro was defined
"(" this-clo ".fn)(data, 0, &" this-clo ", &" this-clo ");") "(" this-clo ".fn)(data, 0, &" this-clo ", &" this-clo ");")
(emit "}") (emit "}")
(emit "static void c_entry_pt_first_lambda(void *data, object clo, object k, int argc, object *args) {") (emit "static void c_entry_pt_first_lambda(void *data, object clo, int argc, object *args) {")
(emit compiled-program) (emit compiled-program)
(emit ";"))) (emit ";")))
(else (else
;; Do not use closcall1 macro as it might not have been defined ;; Do not use closcall1 macro as it might not have been defined
(emit "cont = ((closure1_type *)cont)->element;") (emit "cont = ((closure1_type *)cont)->element;")
TODO:
(emit* (emit*
"(((closure)" "(((closure)"
(cgen:mangle-global (lib:name->symbol lib-name)) (cgen:mangle-global (lib:name->symbol lib-name))