fix optimizer bug that can attempt infinite unrolling of loops
This commit is contained in:
parent
2097e944b7
commit
84237c2cf3
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user