From 0262beb351f4a8cc8797872d14242bb307904d3e Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 19 Apr 2017 00:12:49 +0000 Subject: [PATCH] Do not try to inline large lambda bodies If a lambda body contains more than one expression it must be compiled using CPS, so the inline code must reject it as a possible candidate. --- scheme/cyclone/transforms.sld | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 2652d58b..b2411e5e 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -1272,11 +1272,17 @@ (equal? 'args:fixed (lambda-formals-type (car (define->exp expr))))) (call/cc (lambda (k) - (scan - (car (lambda->exp - (car (define->exp expr)))) - (lambda () (k #f))) ;; Fail with #f - (k #t)))) ;; Scanned fine, return #t + (let* ((define-body (car (define->exp expr))) + (lambda-body (lambda->exp define-body))) + (cond + ((> (length lambda-body) 1) + (k #f)) ;; Fail with more than one expression in lambda body, + ;; because CPS is required to compile that. + (else + (scan + (car lambda-body) + (lambda () (k #f))) ;; Fail with #f + (k #t))))))) ;; Scanned fine, return #t (else #f))) ;; ;; Helpers to syntax check primitive calls