fix bytecode compiler bug related to 3-D code and delayed closure-body loading

svn: r8222
This commit is contained in:
Matthew Flatt 2008-01-05 16:05:05 +00:00
parent 652715c2d5
commit 8cbe9a6da9
2 changed files with 12 additions and 11 deletions

View File

@ -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)

View File

@ -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);