fix bytecode compiler bug related to 3-D code and delayed closure-body loading
svn: r8222
This commit is contained in:
parent
652715c2d5
commit
8cbe9a6da9
|
@ -1031,6 +1031,17 @@ static Scheme_Object *try_apply(Scheme_Object *f, Scheme_Object *args)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int foldable_body(Scheme_Object *f)
|
||||||
|
{
|
||||||
|
Scheme_Closure_Data *d;
|
||||||
|
|
||||||
|
d = SCHEME_COMPILED_CLOS_CODE(f);
|
||||||
|
|
||||||
|
scheme_delay_load_closure(d);
|
||||||
|
|
||||||
|
return (SCHEME_TYPE(d->code) > _scheme_values_types_);
|
||||||
|
}
|
||||||
|
|
||||||
static Scheme_Object *make_application(Scheme_Object *v)
|
static Scheme_Object *make_application(Scheme_Object *v)
|
||||||
{
|
{
|
||||||
Scheme_Object *o;
|
Scheme_Object *o;
|
||||||
|
@ -1060,8 +1071,7 @@ static Scheme_Object *make_application(Scheme_Object *v)
|
||||||
|| (SCHEME_CLSD_PRIMP(f)
|
|| (SCHEME_CLSD_PRIMP(f)
|
||||||
&& (((Scheme_Closed_Primitive_Proc *)f)->pp.flags & SCHEME_PRIM_IS_FOLDING))
|
&& (((Scheme_Closed_Primitive_Proc *)f)->pp.flags & SCHEME_PRIM_IS_FOLDING))
|
||||||
|| (SAME_TYPE(SCHEME_TYPE(f), scheme_closure_type)
|
|| (SAME_TYPE(SCHEME_TYPE(f), scheme_closure_type)
|
||||||
&& ((SCHEME_CLOSURE_DATA_FLAGS(SCHEME_COMPILED_CLOS_CODE(f)))
|
&& (foldable_body(f)))) {
|
||||||
& CLOS_FOLDABLE))) {
|
|
||||||
f = try_apply(f, SCHEME_CDR(v));
|
f = try_apply(f, SCHEME_CDR(v));
|
||||||
|
|
||||||
if (f)
|
if (f)
|
||||||
|
|
|
@ -1408,9 +1408,6 @@ scheme_resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info,
|
||||||
data->code = bcode;
|
data->code = bcode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SCHEME_TYPE(data->code) > _scheme_compiled_values_types_)
|
|
||||||
SCHEME_CLOSURE_DATA_FLAGS(data) |= CLOS_FOLDABLE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((closure_size == 1)
|
if ((closure_size == 1)
|
||||||
|
@ -8068,12 +8065,6 @@ static Scheme_Object *read_compiled_closure(Scheme_Object *obj)
|
||||||
data->closure_size = SCHEME_SVEC_LEN(v);
|
data->closure_size = SCHEME_SVEC_LEN(v);
|
||||||
data->closure_map = SCHEME_SVEC_VEC(v);
|
data->closure_map = SCHEME_SVEC_VEC(v);
|
||||||
|
|
||||||
if (SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_FOLDABLE)
|
|
||||||
SCHEME_CLOSURE_DATA_FLAGS(data) -= CLOS_FOLDABLE;
|
|
||||||
|
|
||||||
if (SCHEME_TYPE(data->code) > _scheme_values_types_)
|
|
||||||
SCHEME_CLOSURE_DATA_FLAGS(data) |= CLOS_FOLDABLE;
|
|
||||||
|
|
||||||
/* If the closure is empty, create the closure now */
|
/* If the closure is empty, create the closure now */
|
||||||
if (!data->closure_size)
|
if (!data->closure_size)
|
||||||
return scheme_make_closure(NULL, (Scheme_Object *)data, 0);
|
return scheme_make_closure(NULL, (Scheme_Object *)data, 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user