From 84237c2cf37e0a11d5e04bdfb833457f5d95bc92 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 13 Jan 2011 12:48:44 -0700 Subject: [PATCH] fix optimizer bug that can attempt infinite unrolling of loops --- src/racket/src/eval.c | 10 +++++++++- src/racket/src/syntax.c | 3 --- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/racket/src/eval.c b/src/racket/src/eval.c index 05df396514..720f617d64 100644 --- a/src/racket/src/eval.c +++ b/src/racket/src/eval.c @@ -2489,6 +2489,7 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data, Scheme_Object *val; int i, expected; int *flags, flag; + Optimize_Info *sub_info; expected = data->num_params; @@ -2565,7 +2566,14 @@ static Scheme_Object *apply_inlined(Scheme_Object *p, Scheme_Closure_Data *data, else 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) { *((Scheme_Object **)(((char *)le_prev) + prev_offset)) = p; diff --git a/src/racket/src/syntax.c b/src/racket/src/syntax.c index 4177c6bf2b..c8cb77bc01 100644 --- a/src/racket/src/syntax.c +++ b/src/racket/src/syntax.c @@ -3281,9 +3281,6 @@ scheme_optimize_lets(Scheme_Object *form, Optimize_Info *info, int for_inline, i else rhs_info = body_info; - if (for_inline) - body_info->inline_fuel >>= 1; - body = head->body; for (i = head->num_clauses; i--; ) { pre_body = (Scheme_Compiled_Let_Value *)body;