fix argument check for instantiate-linklet

Closes #2962
This commit is contained in:
Matthew Flatt 2019-12-12 11:59:27 -07:00
parent 387f90ed92
commit bf41fee58d
4 changed files with 38 additions and 1 deletions

View File

@ -11,6 +11,7 @@
(load-relative "letrec.rktl")
(load-relative "procs.rktl")
(load-relative "stx.rktl")
(load-relative "linklet.rktl")
(load-relative "module.rktl")
(load-relative "submodule.rktl")
(load-relative "stxparam.rktl")

View File

@ -0,0 +1,26 @@
(load-relative "loadtest.rktl")
(Section 'linklet)
(require racket/linklet)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(let ()
(define l (compile-linklet '(linklet
()
()
4)))
(test #t linklet? l)
(test #t instance? (instantiate-linklet l '()))
(test 4 instantiate-linklet l '() (make-instance 'l))
(err/rt-test (instantiate-linklet l) exn:fail:contract:arity?)
(err/rt-test (instantiate-linklet l '#()))
(err/rt-test (instantiate-linklet l (list 5)))
(err/rt-test (instantiate-linklet l '() 5)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs)

View File

@ -697,8 +697,18 @@
[(linklet import-instances target-instance)
(instantiate-linklet linklet import-instances target-instance #f)]
[(linklet import-instances target-instance use-prompt?)
(unless (linklet? linklet)
(raise-argument-error 'instantiate-linklet "linklet?" linklet))
(let loop ([l import-instances])
(unless (null? l)
(if (and (pair? l)
(instance? (car l)))
(loop (cdr l))
(raise-argument-error 'instantiate-linklet "(listof instance?)" import-instances))))
(cond
[target-instance
(unless (instance? target-instance)
(raise-argument-error 'instantiate-linklet "(or/c instance? #f)" target-instance))
;; Instantiate into the given instance and return the
;; result of the linklet body:
(with-continuation-mark

View File

@ -593,7 +593,7 @@ static Scheme_Object *instantiate_linklet(int argc, Scheme_Object **argv)
scheme_wrong_contract("instantiate-linklet", "linklet?", 0, argc, argv);
l = argv[1];
while (!SCHEME_NULLP(l)) {
while (SCHEME_PAIRP(l)) {
if (!SAME_TYPE(SCHEME_TYPE(SCHEME_CAR(l)), scheme_instance_type))
break;
l = SCHEME_CDR(l);