~ chicken-core (chicken-5) 8f19d852ce9f08fd3a14e616948cef5a41dbfb06
commit 8f19d852ce9f08fd3a14e616948cef5a41dbfb06 Author: Peter Bex <peter.bex@xs4all.nl> AuthorDate: Mon Jan 23 18:39:34 2012 +0100 Commit: Christian Kellermann <ckeen@pestilenz.org> CommitDate: Mon Jan 23 19:03:15 2012 +0100 Limit depth for procedure nesting reports to ensure linear scaling of compilation times on input file size. Signed-off-by: Christian Kellermann <ckeen@pestilenz.org> diff --git a/support.scm b/support.scm index 191ae7ce..fe859403 100644 --- a/support.scm +++ b/support.scm @@ -1398,6 +1398,9 @@ (define (set-real-name! name rname) (##sys#hash-table-set! real-name-table name rname) ) +;; Arbitrary limit to prevent runoff into exponential behavior +(define real-name-max-depth 20) + (define (real-name var . db) (define (resolve n) (let ([n2 (##sys#hash-table-ref real-name-table n)]) @@ -1409,15 +1412,20 @@ (cond [(not rn) (##sys#symbol->qualified-string var)] [(pair? db) (let ([db (car db)]) - (let loop ([nesting (list (##sys#symbol->qualified-string rn))] + (let loop ([nesting (list (##sys#symbol->qualified-string rn))] + [depth 0] [container (get db var 'contained-in)] ) - (if container - (let ([rc (resolve container)]) - (if (eq? rc container) - (string-intersperse (reverse nesting) " in ") - (loop (cons (symbol->string rc) nesting) - (get db container 'contained-in) ) ) ) - (string-intersperse (reverse nesting) " in ")) ) ) ] + (cond + ((> depth real-name-max-depth) + (string-intersperse (reverse (cons "..." nesting)) " in ")) + (container + (let ([rc (resolve container)]) + (if (eq? rc container) + (string-intersperse (reverse nesting) " in ") + (loop (cons (symbol->string rc) nesting) + (fx+ depth 1) + (get db container 'contained-in) ) ) )) + (else (string-intersperse (reverse nesting) " in "))) ) ) ] [else (##sys#symbol->qualified-string rn)] ) ) ) (define (real-name2 var db)Trap