From e98cfeae5b7547a5c8cca94dcb82417e1b9fcdae Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 23 Jul 2017 08:21:33 -0600 Subject: [PATCH] chaperone-vector: adjust contract-error reporting The convention is to check argumen contracts indpendently first, then raise an eror there's a mismatch among pairs of objects. --- racket/src/racket/src/vector.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/racket/src/racket/src/vector.c b/racket/src/racket/src/vector.c index e836592b35..14c1457ff0 100644 --- a/racket/src/racket/src/vector.c +++ b/racket/src/racket/src/vector.c @@ -950,13 +950,16 @@ static Scheme_Object *do_chaperone_vector(const char *name, int is_impersonator, } else { /* allow false for interposition procedures */ - scheme_check_proc_arity2(name, 3 + (pass_self ? 1 : 0), 1, argc, argv,1); + scheme_check_proc_arity2(name, 3 + (pass_self ? 1 : 0), 1, argc, argv, 1); + scheme_check_proc_arity2(name, 3 + (pass_self ? 1 : 0), 2, argc, argv, 1); - if (SCHEME_PROCP(argv[1])) { - scheme_check_proc_arity(name, 3 + (pass_self ? 1 : 0), 2, argc, argv); - } - else if (!SCHEME_FALSEP(argv[2])) { - scheme_wrong_contract(name, "#f", 2, argc, argv); + /* but only allow `#f` if both are `#f` */ + if (SCHEME_FALSEP(argv[1]) != SCHEME_FALSEP(argv[2])) { + scheme_contract_error(name, + "accessor and mutator wrapper must be both `#f` or neither `#f`", + "accessor wrapper", 1, argv[1], + "mutator wrapper", 1, argv[2], + NULL); } }