fix internal abuse of vectors
Using NULL in a vector slot can crash bracktrace printing; replace it with `#f'.
This commit is contained in:
parent
54c8b51c32
commit
e73be4a9ae
|
@ -1026,7 +1026,7 @@ static Scheme_Object *do_chaperone_prop_accessor(const char *who, Scheme_Object
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SCHEME_VECTORP(px->redirects)
|
if (!SCHEME_VECTORP(px->redirects)
|
||||||
|| !(SCHEME_VEC_ELS(px->redirects)[0]))
|
|| SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[0]))
|
||||||
arg = px->prev;
|
arg = px->prev;
|
||||||
else {
|
else {
|
||||||
ht = (Scheme_Hash_Tree *)SCHEME_VEC_ELS(px->redirects)[0];
|
ht = (Scheme_Hash_Tree *)SCHEME_VEC_ELS(px->redirects)[0];
|
||||||
|
@ -1918,7 +1918,7 @@ static Scheme_Object *chaperone_struct_ref(const char *who, Scheme_Object *o, in
|
||||||
Scheme_Object *a[2], *red, *orig;
|
Scheme_Object *a[2], *red, *orig;
|
||||||
|
|
||||||
if (!SCHEME_VECTORP(px->redirects)
|
if (!SCHEME_VECTORP(px->redirects)
|
||||||
|| !(SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + i])) {
|
|| SCHEME_FALSEP(SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + i])) {
|
||||||
o = px->prev;
|
o = px->prev;
|
||||||
} else {
|
} else {
|
||||||
#ifdef DO_STACK_CHECK
|
#ifdef DO_STACK_CHECK
|
||||||
|
@ -1975,7 +1975,7 @@ static void chaperone_struct_set(const char *who, Scheme_Object *o, int i, Schem
|
||||||
if (SCHEME_VECTORP(px->redirects)) {
|
if (SCHEME_VECTORP(px->redirects)) {
|
||||||
half = (SCHEME_VEC_SIZE(px->redirects) - PRE_REDIRECTS) >> 1;
|
half = (SCHEME_VEC_SIZE(px->redirects) - PRE_REDIRECTS) >> 1;
|
||||||
red = SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + half + i];
|
red = SCHEME_VEC_ELS(px->redirects)[PRE_REDIRECTS + half + i];
|
||||||
if (red) {
|
if (SCHEME_TRUEP(red)) {
|
||||||
a[0] = o;
|
a[0] = o;
|
||||||
a[1] = v;
|
a[1] = v;
|
||||||
v = _scheme_apply(red, 2, a);
|
v = _scheme_apply(red, 2, a);
|
||||||
|
@ -5144,7 +5144,7 @@ static Scheme_Object *do_chaperone_struct(const char *name, int is_impersonator,
|
||||||
|
|
||||||
if (SCHEME_STRUCTP(val)) {
|
if (SCHEME_STRUCTP(val)) {
|
||||||
stype = ((Scheme_Structure *)val)->stype;
|
stype = ((Scheme_Structure *)val)->stype;
|
||||||
redirects = scheme_make_vector(PRE_REDIRECTS + 2 * stype->num_slots, NULL);
|
redirects = scheme_make_vector(PRE_REDIRECTS + 2 * stype->num_slots, scheme_false);
|
||||||
} else {
|
} else {
|
||||||
stype = NULL;
|
stype = NULL;
|
||||||
redirects = NULL;
|
redirects = NULL;
|
||||||
|
@ -5232,7 +5232,7 @@ static Scheme_Object *do_chaperone_struct(const char *name, int is_impersonator,
|
||||||
kind,
|
kind,
|
||||||
a[0],
|
a[0],
|
||||||
argv[0]);
|
argv[0]);
|
||||||
if (SCHEME_VEC_ELS(redirects)[PRE_REDIRECTS + offset + pi->field])
|
if (SCHEME_TRUEP(SCHEME_VEC_ELS(redirects)[PRE_REDIRECTS + offset + pi->field]))
|
||||||
scheme_raise_exn(MZEXN_FAIL_CONTRACT,
|
scheme_raise_exn(MZEXN_FAIL_CONTRACT,
|
||||||
"%s: given %s is for the same field as a previous %s argument: %V",
|
"%s: given %s is for the same field as a previous %s argument: %V",
|
||||||
name,
|
name,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user