From 8eb447d11b3a67f87fdd69fe7f80ff0d851e3d47 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Fri, 14 Sep 2018 15:17:07 -0400 Subject: [PATCH] Added c-macro-return-direct-with-closure --- scheme/cyclone/cgen.sld | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index 8a408290..87b9d194 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -125,7 +125,10 @@ (vector-ref *c-call-arity* arity)) (emit (c-macro-closcall arity)) (emit (c-macro-return-closcall arity)) - (emit (c-macro-return-direct arity)))) + (emit (c-macro-return-direct arity)) + (emit (c-macro-return-direct-with-closure arity)) + ) + ) (emit-c-arity-macros (+ arity 1)))) (define (c-macro-return-closcall num-args) @@ -163,6 +166,26 @@ " (_fn)(td, " n ", (closure)_fn" args "); \\\n" " }}\n"))) +(define (c-macro-return-direct-with-closure num-args) + (let ((args (c-macro-n-prefix num-args ",a")) + (n (number->string num-args)) + (arry-assign (c-macro-array-assign num-args "buf" "a"))) + (string-append + ;"/* Check for GC, then call C function directly */\n" + "#define return_direct_with_clo" n "(td, clo, _clo_fn, _fn" args ") { \\\n" + " char top; \\\n" + " if (stack_overflow(&top, (((gc_thread_data *)data)->stack_limit))) { \\\n" +;; " object buf[" n "]; " arry-assign " \\\n" +;; " mclosure0(c1, (function_type) _clo_fn); \\\n" +;; " GC(td, &c1, buf, " n "); \\\n" +;; " return; \\\n" + " object buf[" n "]; " arry-assign "\\\n" + " GC(td, clo, buf, " n "); \\\n" + " return; \\\n" + " } else { \\\n" + " (_fn)(td, " n ", (closure)(clo)" args "); \\\n" + " }}\n"))) + (define (c-macro-closcall num-args) (let ((args (c-macro-n-prefix num-args ",a")) (n (number->string num-args))