From f7fe5dbf11b10efcaa8fba8d18b64d52c2189aff Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 9 Feb 2021 22:39:57 -0500 Subject: [PATCH] Unpack args array --- scheme/cyclone/cgen.sld | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index c4435c49..97f50281 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -1813,7 +1813,28 @@ "(void *data, " arg-argc formals* ")")))) - (c-arg-unpacking formals) + (c-arg-unpacking ;; Unpack args array into locals + (cond + ;; TODO: how to unpack varargs + (cps? + (let ((i 0) + (cstr "") + (args (string-split formals #\,))) + (for-each + (lambda (arg) + (set! cstr (string-append + cstr + arg + " = args[" + (number->string i) + "];" + )) + (set! i (+ i 1))) + (if has-closure? + (cdr args) + args)) + cstr)) + (else ""))) (env-closure (lambda->env exp)) (body (c-compile-exp (car (ast:lambda-body exp)) ; car ==> assume single expr in lambda body after CPS @@ -1827,7 +1848,7 @@ (string-append "static " return-type " " name c-formals " {\n" - "UNPACKED: " c-arg-unpacking + c-arg-unpacking "\n" preamble (if (ast:lambda-varargs? exp)