From 396888f1b86c3281aa2985a28388f4daac89b107 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 17 Apr 2017 16:59:41 +0000 Subject: [PATCH] Bug fixes for listing inlinables --- scheme/cyclone/cgen.sld | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index a996d7c8..5b992b95 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -1333,9 +1333,8 @@ (cond ((not program?) (emit* "void c_" (lib:name->string lib-name) "_inlinable_lambdas(void *data, int argc, closure cont, object value){ ") - (emit* "make_pair(head, NULL, NULL);") (let ((pairs '()) - (head-pair "NULL")) + (head-pair #f)) (for-each (lambda (g) (let ((cvar-sym (mangle (gensym 'cvar))) @@ -1346,13 +1345,33 @@ (emits* "make_pair(" pair-sym ", find_or_add_symbol(\"" (symbol->string g) "\"), &" cvar-sym ");\n") - (set! pairs (cons pair-sym pairs)) - (set! head-pair pair-sym) - )) + (set! pairs (cons pair-sym pairs)))) *global-inlines*) - ;; TODO: need to link the pairs - (emit* "car(&head) = &" head-pair ";") - (emit* "(((closure)cont)->fn)(data, 1, cont, &head);") + ;; Link the pairs + (let loop ((code '()) + (ps pairs) + (cs (map (lambda (_) (mangle (gensym 'c))) pairs))) + (cond + ((null? ps) + (for-each + (lambda (str) + (emits str)) + code)) + ((null? (cdr ps)) + (if (not head-pair) + (set! head-pair (car cs))) + (loop (cons (string-append "make_pair(" (car cs) ", &" (car ps) ", NULL);\n") code) + (cdr ps) + (cdr cs))) + (else + (if (not head-pair) + (set! head-pair (car cs))) + (loop (cons (string-append "make_pair(" (car cs) ", &" (car ps) ", &" (cadr cs) ");\n") code) + (cdr ps) + (cdr cs))))) + (if head-pair + (emit* "(((closure)cont)->fn)(data, 1, cont, &" head-pair ");") + (emit* "(((closure)cont)->fn)(data, 1, cont, NULL);")) (emit* " } ")) ))