fix bug in vector->immutable-vector on 0-sized vector
svn: r7748
This commit is contained in:
parent
4f8d89dcb2
commit
28a1f1f60a
|
@ -614,13 +614,19 @@ Scheme_Object *scheme_make_raw_pair(Scheme_Object *car, Scheme_Object *cdr)
|
|||
return cons;
|
||||
}
|
||||
|
||||
#ifdef MZ_PRECISE_GC
|
||||
# define cons(car, cdr) GC_malloc_pair(car, cdr)
|
||||
#else
|
||||
# define cons(car, cdr) scheme_make_pair(car, cdr)
|
||||
#endif
|
||||
|
||||
Scheme_Object *scheme_build_list(int size, Scheme_Object **argv)
|
||||
{
|
||||
Scheme_Object *pair = scheme_null;
|
||||
int i;
|
||||
|
||||
for (i = size; i--; ) {
|
||||
pair = scheme_make_pair(argv[i], pair);
|
||||
pair = cons(argv[i], pair);
|
||||
}
|
||||
|
||||
return pair;
|
||||
|
@ -632,7 +638,7 @@ Scheme_Object *scheme_build_list_offset(int size, Scheme_Object **argv, int delt
|
|||
int i;
|
||||
|
||||
for (i = size; i-- > delta; ) {
|
||||
pair = scheme_make_pair(argv[i], pair);
|
||||
pair = cons(argv[i], pair);
|
||||
}
|
||||
|
||||
return pair;
|
||||
|
@ -644,7 +650,7 @@ Scheme_Object *scheme_alloc_list(int size)
|
|||
int i;
|
||||
|
||||
for (i = size; i--; ) {
|
||||
pair = scheme_make_pair(scheme_false, pair);
|
||||
pair = cons(scheme_false, pair);
|
||||
}
|
||||
|
||||
return pair;
|
||||
|
@ -694,7 +700,7 @@ scheme_named_map_1(char *name, Scheme_Object *(*fun)(Scheme_Object*, Scheme_Obje
|
|||
Scheme_Object *v;
|
||||
v = SCHEME_STX_CAR(lst);
|
||||
v = fun(v, form);
|
||||
pr = scheme_make_pair(v, scheme_null);
|
||||
pr = cons(v, scheme_null);
|
||||
if (last)
|
||||
SCHEME_CDR(last) = pr;
|
||||
else
|
||||
|
@ -764,7 +770,7 @@ mpair_p_prim (int argc, Scheme_Object *argv[])
|
|||
static Scheme_Object *
|
||||
cons_prim (int argc, Scheme_Object *argv[])
|
||||
{
|
||||
return scheme_make_pair(argv[0], argv[1]);
|
||||
return cons(argv[0], argv[1]);
|
||||
}
|
||||
|
||||
static Scheme_Object *
|
||||
|
@ -902,29 +908,26 @@ list_p_prim (int argc, Scheme_Object *argv[])
|
|||
|
||||
#define NORMAL_LIST_INIT() l = scheme_null
|
||||
#define STAR_LIST_INIT() --argc; l = argv[argc]
|
||||
#ifndef MZ_PRECISE_GC
|
||||
# define GC_malloc_pair scheme_make_pair
|
||||
#endif
|
||||
|
||||
#define LIST_BODY(INIT, scheme_make_pair) \
|
||||
#define LIST_BODY(INIT) \
|
||||
int i; \
|
||||
Scheme_Object *l; \
|
||||
INIT; \
|
||||
for (i = argc ; i--; ) { \
|
||||
l = scheme_make_pair(argv[i], l); \
|
||||
l = cons(argv[i], l); \
|
||||
} \
|
||||
return l
|
||||
|
||||
static Scheme_Object *
|
||||
list_prim (int argc, Scheme_Object *argv[])
|
||||
{
|
||||
LIST_BODY(NORMAL_LIST_INIT(), GC_malloc_pair);
|
||||
LIST_BODY(NORMAL_LIST_INIT());
|
||||
}
|
||||
|
||||
static Scheme_Object *
|
||||
list_star_prim (int argc, Scheme_Object *argv[])
|
||||
{
|
||||
LIST_BODY(STAR_LIST_INIT(), GC_malloc_pair);
|
||||
LIST_BODY(STAR_LIST_INIT());
|
||||
}
|
||||
|
||||
static Scheme_Object *
|
||||
|
@ -965,7 +968,7 @@ scheme_append (Scheme_Object *lst1, Scheme_Object *lst2)
|
|||
|
||||
first = last = NULL;
|
||||
while (SCHEME_PAIRP(lst1)) {
|
||||
v = scheme_make_pair(SCHEME_CAR(lst1), scheme_null);
|
||||
v = cons(SCHEME_CAR(lst1), scheme_null);
|
||||
if (!first)
|
||||
first = v;
|
||||
else
|
||||
|
@ -1021,7 +1024,7 @@ reverse_prim (int argc, Scheme_Object *argv[])
|
|||
while (!SCHEME_NULLP (lst)) {
|
||||
if (!SCHEME_PAIRP(lst))
|
||||
scheme_wrong_type("reverse", "proper list", 0, argc, argv);
|
||||
last = scheme_make_pair (SCHEME_CAR (lst), last);
|
||||
last = cons(SCHEME_CAR (lst), last);
|
||||
lst = SCHEME_CDR (lst);
|
||||
|
||||
SCHEME_USE_FUEL(1);
|
||||
|
@ -1658,7 +1661,7 @@ static Scheme_Object *do_map_hash_table(int argc,
|
|||
p[1] = (Scheme_Object *)bucket->val;
|
||||
if (keep) {
|
||||
v = _scheme_apply(f, 2, p);
|
||||
v = scheme_make_pair(v, scheme_null);
|
||||
v = cons(v, scheme_null);
|
||||
if (last)
|
||||
SCHEME_CDR(last) = v;
|
||||
else
|
||||
|
@ -1679,7 +1682,7 @@ static Scheme_Object *do_map_hash_table(int argc,
|
|||
p[1] = hash->vals[i];
|
||||
if (keep) {
|
||||
v = _scheme_apply(f, 2, p);
|
||||
v = scheme_make_pair(v, scheme_null);
|
||||
v = cons(v, scheme_null);
|
||||
if (last)
|
||||
SCHEME_CDR(last) = v;
|
||||
else
|
||||
|
|
|
@ -287,6 +287,12 @@ vector_to_list (int argc, Scheme_Object *argv[])
|
|||
return scheme_vector_to_list(argv[0]);
|
||||
}
|
||||
|
||||
#ifdef MZ_PRECISE_GC
|
||||
# define cons(car, cdr) GC_malloc_pair(car, cdr)
|
||||
#else
|
||||
# define cons(car, cdr) scheme_make_pair(car, cdr)
|
||||
#endif
|
||||
|
||||
Scheme_Object *
|
||||
scheme_vector_to_list (Scheme_Object *vec)
|
||||
{
|
||||
|
@ -297,13 +303,13 @@ scheme_vector_to_list (Scheme_Object *vec)
|
|||
|
||||
if (i < 0xFFF) {
|
||||
for (; i--; ) {
|
||||
pair = scheme_make_pair(SCHEME_VEC_ELS(vec)[i], pair);
|
||||
pair = cons(SCHEME_VEC_ELS(vec)[i], pair);
|
||||
}
|
||||
} else {
|
||||
for (; i--; ) {
|
||||
if (!(i & 0xFFF))
|
||||
SCHEME_USE_FUEL(0xFFF);
|
||||
pair = scheme_make_pair(SCHEME_VEC_ELS(vec)[i], pair);
|
||||
pair = cons(SCHEME_VEC_ELS(vec)[i], pair);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -364,7 +370,7 @@ static Scheme_Object *vector_to_immutable (int argc, Scheme_Object *argv[])
|
|||
ovec = argv[0];
|
||||
len = SCHEME_VEC_SIZE(ovec);
|
||||
if (!len)
|
||||
return vec;
|
||||
return ovec;
|
||||
|
||||
vec = scheme_make_vector(len, NULL);
|
||||
for (i = 0; i < len; i++) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user