From c7476fb1eda55f1d9d234c9f311157f0b0b0788b Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 3 Apr 2017 21:58:45 +0000 Subject: [PATCH] Emit code for define-c inlines --- scheme/cyclone/cgen.sld | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index f092b223..362c031d 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -823,10 +823,13 @@ (st:add-function! trace var))) (c-code/vars "" (list "")))) -;; TODO: not tested, does not work yet: -(define (c-compile-raw-global-lambda exp append-preamble cont trace) - (let* ((lambda-data - `(precompiled-lambda +(define (c-compile-raw-global-lambda exp append-preamble cont trace . inline?) + (let* ((precompiled-sym + (if (equal? inline? '(#t)) + 'precompiled-inline-lambda + 'precompiled-lambda)) + (lambda-data + `(,precompiled-sym ,(caddr exp) ;; Args ,(cadddr exp) ;; Body )) @@ -842,6 +845,21 @@ (num-args (- total-num-args 4)) ) + ;; Is the function also defined inline? + ;(trace:error `(JAE define-c ,exp)) + (cond + ((> (length exp) 4) + ;(trace:error `(JAE define-c inline detected)) + (let ((fnc-sym + (define-c->inline-var exp))) + ;(trace:error `(JAE define-c inline detected ,fnc-sym)) + (c-compile-raw-global-lambda + `(define-c ,fnc-sym ,@(cddddr exp)) + append-preamble + cont + trace + #t)))) ;; Inline this one + ;; Add this define-c (add-global (define->var exp) #t ;(lambda? body) @@ -1256,6 +1274,12 @@ (number->string (car l)) (cadadr l) " ;")) + ((equal? 'precompiled-inline-lambda (caadr l)) + (emit* + "static object __lambda_" + (number->string (car l)) + (cadadr l) + " ;")) (else (emit* "static void __lambda_" @@ -1279,6 +1303,15 @@ (car (cddadr l)) " }" )) + ((equal? 'precompiled-inline-lambda (caadr l)) + (emit* + "static object __lambda_" + (number->string (car l)) + (cadadr l) + " {" + (car (cddadr l)) + " }" + )) (else (emit ((caadr l) (string-append "__lambda_" (number->string (car l)))))))) lambdas)