From ca3757367d6d9985a728b04ddddca0c30c5d1222 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 10 Feb 2014 06:48:03 -0700 Subject: [PATCH] fix checking of attempt to impersonte non-struct via mutator --- pkgs/racket-pkgs/racket-test/tests/racket/chaperone.rktl | 6 ++++++ racket/src/racket/src/struct.c | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/chaperone.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/chaperone.rktl index 8eb17cd9c1..9252a64fa2 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/chaperone.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/chaperone.rktl @@ -1508,4 +1508,10 @@ ;; ---------------------------------------- +(let () + (struct s ([a #:mutable])) + (err/rt-test (impersonate-struct 5 set-s-a! (lambda (a b) b)))) + +;; ---------------------------------------- + (report-errs) diff --git a/racket/src/racket/src/struct.c b/racket/src/racket/src/struct.c index 642c2cb06d..01f6b61328 100644 --- a/racket/src/racket/src/struct.c +++ b/racket/src/racket/src/struct.c @@ -5458,7 +5458,10 @@ static Scheme_Object *do_chaperone_struct(const char *name, int is_impersonator, if (SCHEME_CHAPERONEP(proc)) proc = SCHEME_CHAPERONE_VAL(proc); if (SCHEME_TRUEP(struct_setter_p(1, a))) { kind = "mutator"; - offset = stype->num_slots; + if (stype) + offset = stype->num_slots; + else + offset = 0; } else if (SCHEME_TRUEP(struct_getter_p(1, a))) { kind = "accessor"; offset = 0;