Kludge up wrong-number-of-arguments error parsing for entities.
authorTaylor R Campbell <campbell@mumble.net>
Wed, 8 Jun 2011 17:15:40 +0000 (17:15 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 8 Jun 2011 17:15:40 +0000 (17:15 +0000)
Before:

   (min)
   ;The procedure #[compiled-procedure 11 (min "arith" #x16) #x1b1a #x1c8ac2] has been called with 1 argument; it requires at least 2 arguments.

After:

   (min)
   ;The procedure #[arity-dispatched-procedure 11 min] has been called with 0 arguments; it requires at least 1 argument.

Screw cases be damned.

src/runtime/uerror.scm

index 874f92f6900592181dd734cf907071eed31cecaa..7387ad1773a07158fbe2e6094bf2a1f169f29449 100644 (file)
@@ -933,11 +933,20 @@ USA.
     (lambda (continuation)
       (let ((frame (continuation/first-subproblem continuation)))
        (if (apply-frame? frame)
-           (let ((operator (apply-frame/operator frame)))
-             (signal continuation
-                     operator
-                     (procedure-arity operator)
-                     (apply-frame/operands frame))))))))
+           ;; This is a heuristic kludge.  It can break down:
+           ;;   (let ((p (lambda (x y) 0)))
+           ;;     (p (make-entity p 0)))
+           ;; But without the kludge, (min) gives a confusing error,
+           ;; which is probably more common than this pathological
+           ;; case.
+           (let loop ((operator (apply-frame/operator frame))
+                      (operands (apply-frame/operands frame)))
+             (if (and (pair? operands)
+                      (entity? (car operands))
+                      (eq? operator (entity-procedure (car operands))))
+                 (loop (car operands) (cdr operands))
+                 (let ((arity (procedure-arity operator)))
+                   (signal continuation operator arity operands)))))))))
 
 (define-error-handler 'FLOATING-OVERFLOW
   (let ((signal