From bf41fee58d931d732397a7d1f9878e14b89632fe Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 12 Dec 2019 11:59:27 -0700 Subject: [PATCH] fix argument check for `instantiate-linklet` Closes #2962 --- .../tests/racket/core-tests.rktl | 1 + .../tests/racket/linklet.rktl | 26 +++++++++++++++++++ racket/src/cs/linklet.sls | 10 +++++++ racket/src/racket/src/linklet.c | 2 +- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 pkgs/racket-test-core/tests/racket/linklet.rktl diff --git a/pkgs/racket-test-core/tests/racket/core-tests.rktl b/pkgs/racket-test-core/tests/racket/core-tests.rktl index ba61e0ff09..9af4f6e2b2 100644 --- a/pkgs/racket-test-core/tests/racket/core-tests.rktl +++ b/pkgs/racket-test-core/tests/racket/core-tests.rktl @@ -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") diff --git a/pkgs/racket-test-core/tests/racket/linklet.rktl b/pkgs/racket-test-core/tests/racket/linklet.rktl new file mode 100644 index 0000000000..96120be381 --- /dev/null +++ b/pkgs/racket-test-core/tests/racket/linklet.rktl @@ -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) diff --git a/racket/src/cs/linklet.sls b/racket/src/cs/linklet.sls index 0bf648d271..5a5cc3f91d 100644 --- a/racket/src/cs/linklet.sls +++ b/racket/src/cs/linklet.sls @@ -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 diff --git a/racket/src/racket/src/linklet.c b/racket/src/racket/src/linklet.c index e5b3ae29d4..cb4c270d0a 100644 --- a/racket/src/racket/src/linklet.c +++ b/racket/src/racket/src/linklet.c @@ -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);