fix memory-management bug in struct->vector

Closes PR 15410
This commit is contained in:
Matthew Flatt 2017-02-25 08:32:08 -07:00
parent 481dc9b0e8
commit 3c563484c6
2 changed files with 18 additions and 1 deletions

View File

@ -2583,6 +2583,19 @@
(struct b a (z w))
(test #t impersonator? (impersonate-struct (b 1 2 3 4) set-a-y! void)))
;; ----------------------------------------
;; Make sure `struct->vector` doesnt' have memory-management issues
;; with impersonated structs:
(let ()
(struct s (x y z) #:mutable #:transparent)
(test #(struct:s 1 2 3)
struct->vector
(impersonate-struct (s 1 2 3)
s-x (lambda (s v) (collect-garbage 'minor) v)
s-y (lambda (s v) (collect-garbage 'minor) v)
s-z (lambda (s v) (collect-garbage 'minor) v))))
;; ----------------------------------------
(report-errs)

View File

@ -3302,8 +3302,12 @@ Scheme_Object *scheme_struct_to_vector(Scheme_Object *_s, Scheme_Object *unknown
--i;
if (SAME_OBJ((Scheme_Object *)s, _s))
elem = s->slots[i];
else
else {
/* scheme_struct_ref() may trigger a GC; see "BEWARE" above */
array = NULL;
elem = scheme_struct_ref(_s, i);
array = SCHEME_VEC_ELS(v);
}
array[1 + (--m)] = elem;
}
}