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))
|
(struct b a (z w))
|
||||||
(test #t impersonator? (impersonate-struct (b 1 2 3 4) set-a-y! void)))
|
(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)
|
(report-errs)
|
||||||
|
|
|
@ -3302,8 +3302,12 @@ Scheme_Object *scheme_struct_to_vector(Scheme_Object *_s, Scheme_Object *unknown
|
||||||
--i;
|
--i;
|
||||||
if (SAME_OBJ((Scheme_Object *)s, _s))
|
if (SAME_OBJ((Scheme_Object *)s, _s))
|
||||||
elem = s->slots[i];
|
elem = s->slots[i];
|
||||||
else
|
else {
|
||||||
|
/* scheme_struct_ref() may trigger a GC; see "BEWARE" above */
|
||||||
|
array = NULL;
|
||||||
elem = scheme_struct_ref(_s, i);
|
elem = scheme_struct_ref(_s, i);
|
||||||
|
array = SCHEME_VEC_ELS(v);
|
||||||
|
}
|
||||||
array[1 + (--m)] = elem;
|
array[1 + (--m)] = elem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user