fix memory-management bug in struct->vector
Closes PR 15410
This commit is contained in:
parent
481dc9b0e8
commit
3c563484c6
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user