fix optimizer bug that can attempt infinite unrolling of loops

This commit is contained in:
Matthew Flatt 2011-01-13 12:48:44 -07:00
parent 2097e944b7
commit 84237c2cf3
2 changed files with 9 additions and 4 deletions

View File

@ -2489,6 +2489,7 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data,
Scheme_Object *val; Scheme_Object *val;
int i, expected; int i, expected;
int *flags, flag; int *flags, flag;
Optimize_Info *sub_info;
expected = data->num_params; expected = data->num_params;
@ -2565,7 +2566,14 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data,
else else
lh->body = p; lh->body = p;
p = scheme_optimize_lets((Scheme_Object *)lh, info, 1, context); sub_info = scheme_optimize_info_add_frame(info, 0, 0, 0);
sub_info->inline_fuel >>= 1;
p = scheme_optimize_lets((Scheme_Object *)lh, sub_info, 1, context);
info->single_result = sub_info->single_result;
info->preserves_marks = sub_info->preserves_marks;
scheme_optimize_info_done(sub_info);
if (le_prev) { if (le_prev) {
*((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p; *((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p;

View File

@ -3281,9 +3281,6 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i
else else
rhs_info = body_info; rhs_info = body_info;
if (for_inline)
body_info->inline_fuel >>= 1;
body = head->body; body = head->body;
for (i = head->num_clauses; i--; ) { for (i = head->num_clauses; i--; ) {
pre_body = (Scheme_Compiled_Let_Value *)body; pre_body = (Scheme_Compiled_Let_Value *)body;