From fa6fb56192f3f8807b1f1334aa0ff4cbd1a8167d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 18 Oct 2012 11:02:06 -0600 Subject: [PATCH] fix check for constructor of struct setter of immutable field Merge to v5.3.1 (cherry picked from commit b912d0f0590bed9a007a732fde6a4679c08c12d1) --- src/racket/src/struct.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/racket/src/struct.c b/src/racket/src/struct.c index fa8820983c..bfa0c73ffd 100644 --- a/src/racket/src/struct.c +++ b/src/racket/src/struct.c @@ -3828,10 +3828,18 @@ make_struct_proc(Scheme_Struct_Type *struct_type, 2 + need_pos, 2 + need_pos, 0); if (need_pos) flags |= SCHEME_PRIM_STRUCT_TYPE_INDEXLESS_SETTER; - else if (struct_type->immutables && struct_type->immutables[field_num]) - flags |= SCHEME_PRIM_STRUCT_TYPE_BROKEN_INDEXED_SETTER; - else - flags |= SCHEME_PRIM_STRUCT_TYPE_INDEXED_SETTER; + else { + flags |= SCHEME_PRIM_STRUCT_TYPE_INDEXED_SETTER; + + if (struct_type->immutables) { + if (struct_type->name_pos) + field_num -= struct_type->parent_types[struct_type->name_pos - 1]->num_slots; + if (struct_type->immutables[field_num]) { + flags -= SCHEME_PRIM_STRUCT_TYPE_INDEXED_SETTER; + flags |= SCHEME_PRIM_STRUCT_TYPE_BROKEN_INDEXED_SETTER; + } + } + } /* See note above: if (need_pos) struct_type->mutator = p; */ }