~ chicken-core (chicken-5) 877ddd9e7df963653ccc29c83bed12a9fa7cf045
commit 877ddd9e7df963653ccc29c83bed12a9fa7cf045
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Apr 7 12:45:58 2020 +0200
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Sun Apr 12 19:14:53 2020 +0200
Check known call argument count in analysis phase
This was done in the optimizer previously but will be disabled with -O0.
See also #1689
Signed-off-by: Peter Bex <peter@more-magic.net>
diff --git a/core.scm b/core.scm
index a490915a..272a1f77 100644
--- a/core.scm
+++ b/core.scm
@@ -2122,7 +2122,17 @@
(grow 1)
(let ([fun (car subs)])
(when (eq? '##core#variable (node-class fun))
- (let ((name (first (node-parameters fun))))
+ (let* ((name (first (node-parameters fun)))
+ (val (db-get db name 'value)))
+ (when (and first-analysis
+ val
+ (not (db-get db name 'unknown))
+ (eq? '##core#lambda (node-class val))
+ (not (llist-match? (third (node-parameters val))
+ (cdr subs))))
+ (quit-compiling
+ "known procedure called with wrong number of arguments: `~A'"
+ (real-name name)))
(collect! db name 'call-sites (cons here n))))
(walk (first subs) env localenv fullenv here)
(walkeach (cdr subs) env localenv fullenv here)))
diff --git a/optimizer.scm b/optimizer.scm
index bcf0148f..92634de0 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -1649,10 +1649,6 @@
(cond [(eq? fnvar (first fnp))
(set! ksites (alist-cons #f n ksites))
(cond [(eq? kvar (first arg0p))
- (unless (= argc (length (cdr subs)))
- (quit-compiling
- "known procedure called recursively with wrong number of arguments: `~A'"
- fnvar) )
(node-class-set! n '##core#recurse)
(node-parameters-set! n (list #t id))
(node-subexpressions-set! n (cddr subs)) ]
@@ -1660,10 +1656,6 @@
=> (lambda (a)
(let* ([klam (cdr a)]
[kbody (first (node-subexpressions klam))] )
- (unless (= argc (length (cdr subs)))
- (quit-compiling
- "known procedure called recursively with wrong number of arguments: `~A'"
- fnvar) )
(node-class-set! n 'let)
(node-parameters-set! n (take (third (node-parameters klam)) 1))
(node-subexpressions-set!
Trap