From 5eb8a62a68fed5c34b30606fa34dad62a0dad8c4 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Mon, 20 Oct 2008 08:40:04 +0000 Subject: [PATCH] Make check_unreachable() more tail recursion friendly. [r23021] --- parser.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/parser.c b/parser.c index fa85c3c..e0550ad 100644 --- a/parser.c +++ b/parser.c @@ -5320,34 +5320,35 @@ static void check_unreachable(statement_t const* const stmt) case STATEMENT_GOTO: case STATEMENT_ASM: case STATEMENT_LEAVE: - break; + return; case STATEMENT_COMPOUND: - if (stmt->compound.statements) - check_unreachable(stmt->compound.statements); - break; + for (statement_t const *s = stmt->compound.statements; s != NULL; s = s->base.next) { + check_unreachable(s); + } + return; case STATEMENT_IF: check_unreachable(stmt->ifs.true_statement); if (stmt->ifs.false_statement != NULL) check_unreachable(stmt->ifs.false_statement); - break; + return; case STATEMENT_SWITCH: check_unreachable(stmt->switchs.body); - break; + return; case STATEMENT_LABEL: check_unreachable(stmt->label.statement); - break; + return; case STATEMENT_CASE_LABEL: check_unreachable(stmt->case_label.statement); - break; + return; case STATEMENT_WHILE: check_unreachable(stmt->whiles.body); - break; + return; case STATEMENT_DO_WHILE: check_unreachable(stmt->do_while.body); @@ -5358,7 +5359,7 @@ static void check_unreachable(statement_t const* const stmt) "condition of do-while-loop is unreachable"); } } - break; + return; case STATEMENT_FOR: { for_statement_t const* const fors = &stmt->fors; @@ -5384,18 +5385,18 @@ static void check_unreachable(statement_t const* const stmt) } check_unreachable(fors->body); - break; + return; } case STATEMENT_MS_TRY: { ms_try_statement_t const *const ms_try = &stmt->ms_try; check_unreachable(ms_try->try_statement); check_unreachable(ms_try->final_statement); + return; } } - if (stmt->base.next) - check_unreachable(stmt->base.next); + panic("unhandled statement"); } static void parse_external_declaration(void) @@ -9684,7 +9685,7 @@ expression_statment: case T_do: statement = parse_do(); break; case T_for: statement = parse_for(); break; case T_goto: statement = parse_goto(); break; - case T_if: statement = parse_if (); break; + case T_if: statement = parse_if(); break; case T_return: statement = parse_return(); break; case T_switch: statement = parse_switch(); break; case T_while: statement = parse_while(); break; -- 2.20.1