1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Fix multi-arity dispatch in GOOPS

* module/oop/goops.scm (multiple-arity-dispatcher): Fix dispatch for
  max-arity+1 when a generic is already in multiple-arity dispatch.
  Fixes #24454.
* test-suite/tests/goops.test ("dispatch"): Add test.
This commit is contained in:
Andy Wingo 2017-02-22 23:07:27 +01:00
parent 4dcc97288d
commit c7fb87cd6e
2 changed files with 12 additions and 1 deletions

View file

@ -1333,7 +1333,7 @@ function."
#`(case-lambda
#,@(build-clauses #'(arg ...))
(args (apply miss args)))))))
(arity-case (vector-length fv) 20 dispatch
(arity-case (1- (vector-length fv)) 20 dispatch
(lambda args
(let ((nargs (length args)))
(if (< nargs (vector-length fv))

View file

@ -690,3 +690,14 @@
(class (<a>) (slot) #:name '<static-sub> #:static-slot-allocation? #t))
(pass-if-equal "non-static subclass" '(a d)
(map slot-definition-name (class-slots (class (<a>) (d) #:name '<ad>))))))
(with-test-prefix "dispatch"
(pass-if-equal "multi-arity dispatch" 0
(eval '(begin
(define-method (dispatch (x <number>) . args) 0)
(dispatch 1)
(dispatch 1 2)
;; By now "dispatch" is forced into multi-arity mode. Test
;; that the multi-arity dispatcher works:
(dispatch 1 2 3))
(current-module))))