From 601f1eea58ea281578d8b71fef25da2ad60f013b Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Wed, 24 Jun 2015 18:41:01 +0300 Subject: [PATCH] Introduce jsp_skip_braces function for skiping blocks, surrounded with braces. JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com --- jerry-core/parser/js/parser.cpp | 125 ++++++++++++++------------------ 1 file changed, 56 insertions(+), 69 deletions(-) diff --git a/jerry-core/parser/js/parser.cpp b/jerry-core/parser/js/parser.cpp index 8feed2bfb..c1e2c508c 100644 --- a/jerry-core/parser/js/parser.cpp +++ b/jerry-core/parser/js/parser.cpp @@ -67,8 +67,6 @@ static void parse_statement (jsp_label_t *outermost_stmt_label_p); static operand parse_assignment_expression (bool); static void parse_source_element_list (bool); static operand parse_argument_list (varg_list_type, operand, uint8_t *, operand *); -static void skip_braces (void); -static void skip_parens (void); static bool token_is (token_type tt) @@ -173,6 +171,55 @@ is_strict_mode (void) return scopes_tree_strict_mode (STACK_TOP (scopes)); } +/** + * Skip block, defined with braces of specified type + * + * Note: + * Missing corresponding brace is considered a syntax error + * + * Note: + * Opening brace of the block to skip should be set as current + * token when the routine is called + */ +static void +jsp_skip_braces (token_type brace_type) /**< type of the opening brace */ +{ + current_token_must_be (brace_type); + + token_type closing_bracket_type; + + if (brace_type == TOK_OPEN_PAREN) + { + closing_bracket_type = TOK_CLOSE_PAREN; + } + else if (brace_type == TOK_OPEN_BRACE) + { + closing_bracket_type = TOK_CLOSE_BRACE; + } + else + { + JERRY_ASSERT (brace_type == TOK_OPEN_SQUARE); + closing_bracket_type = TOK_CLOSE_SQUARE; + } + + skip_newlines (); + + while (!token_is (closing_bracket_type) + && !token_is (TOK_EOF)) + { + if (token_is (TOK_OPEN_PAREN) + || token_is (TOK_OPEN_BRACE) + || token_is (TOK_OPEN_SQUARE)) + { + jsp_skip_braces (tok.type); + } + + skip_newlines (); + } + + current_token_must_be (closing_bracket_type); +} /* jsp_skip_braces */ + /* property_name : Identifier | Keyword @@ -1964,7 +2011,7 @@ parse_while_statement (jsp_label_t *outermost_stmt_label_p) /**< outermost (firs token_after_newlines_must_be (TOK_OPEN_PAREN); const locus cond_loc = tok.loc; - skip_parens (); + jsp_skip_braces (TOK_OPEN_PAREN); dump_jump_to_end_for_rewrite (); @@ -2020,7 +2067,7 @@ skip_case_clause_body (void) { if (token_is (TOK_OPEN_BRACE)) { - skip_braces (); + jsp_skip_braces (TOK_OPEN_BRACE); } skip_newlines (); } @@ -2565,73 +2612,13 @@ skip_optional_name_and_parens (void) } } -static void -skip_braces (void) -{ - current_token_must_be (TOK_OPEN_BRACE); - - uint8_t nesting_level = 1; - while (nesting_level > 0) - { - skip_newlines (); - if (token_is (TOK_OPEN_BRACE)) - { - nesting_level++; - } - else if (token_is (TOK_CLOSE_BRACE)) - { - nesting_level--; - } - } -} - static void skip_function (void) { skip_newlines (); skip_optional_name_and_parens (); skip_newlines (); - skip_braces (); -} - -static void -skip_squares (void) -{ - current_token_must_be (TOK_OPEN_SQUARE); - - uint8_t nesting_level = 1; - while (nesting_level > 0) - { - skip_newlines (); - if (token_is (TOK_OPEN_SQUARE)) - { - nesting_level++; - } - else if (token_is (TOK_CLOSE_SQUARE)) - { - nesting_level--; - } - } -} - -static void -skip_parens (void) -{ - current_token_must_be (TOK_OPEN_PAREN); - - uint8_t nesting_level = 1; - while (nesting_level > 0) - { - skip_newlines (); - if (token_is (TOK_OPEN_PAREN)) - { - nesting_level++; - } - else if (token_is (TOK_CLOSE_PAREN)) - { - nesting_level--; - } - } + jsp_skip_braces (TOK_OPEN_BRACE); } static bool @@ -2670,15 +2657,15 @@ preparse_var_decls (void) } else if (token_is (TOK_OPEN_BRACE)) { - skip_braces (); + jsp_skip_braces (TOK_OPEN_BRACE); } else if (token_is (TOK_OPEN_SQUARE)) { - skip_squares (); + jsp_skip_braces (TOK_OPEN_SQUARE); } else if (token_is (TOK_OPEN_PAREN)) { - skip_parens (); + jsp_skip_braces (TOK_OPEN_PAREN); } skip_token (); } @@ -2739,7 +2726,7 @@ preparse_scope (bool is_global) } else if (token_is (TOK_OPEN_BRACE)) { - skip_braces (); + jsp_skip_braces (TOK_OPEN_BRACE); } else {