From 7b90d54490f53eb501644b6c76ca28549411c88f Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 29 Jun 2015 19:01:47 +0300 Subject: [PATCH] Fix raise of several nested jumpable borders at one label. Related issue: #164 JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com --- jerry-core/parser/js/jsp-label.cpp | 40 +++++++++++++++++------- jerry-core/parser/js/jsp-label.h | 2 +- jerry-core/parser/js/parser.cpp | 21 +++++++++---- tests/jerry/regression-test-issue-164.js | 22 +++++++++++++ 4 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 tests/jerry/regression-test-issue-164.js diff --git a/jerry-core/parser/js/jsp-label.cpp b/jerry-core/parser/js/jsp-label.cpp index a546b3ce4..4b8d2fffb 100644 --- a/jerry-core/parser/js/jsp-label.cpp +++ b/jerry-core/parser/js/jsp-label.cpp @@ -246,29 +246,47 @@ jsp_label_setup_continue_target (jsp_label_t *outermost_label_p, /**< the outerm } /* jsp_label_setup_continue_target */ /** - * Mark current label, if any, as nested jumpable border + * Add nested jumpable border at current label, if there is any. + * + * @return true - if the border is added (in the case, it should be removed + * using jsp_label_remove_nested_jumpable_border, when parse of + * the corresponding statement would be finished), + * false - otherwise, new border is not raised, because there are no labels, + * or current label already contains a border. */ -void +bool jsp_label_raise_nested_jumpable_border (void) { - if (label_set_p != NULL) + bool is_any_label = (label_set_p != NULL); + + if (is_any_label) { - JERRY_ASSERT (!label_set_p->is_nested_jumpable_border); - label_set_p->is_nested_jumpable_border = true; + if (!label_set_p->is_nested_jumpable_border) + { + label_set_p->is_nested_jumpable_border = true; + + return true; + } + else + { + return false; + } + } + else + { + return false; } } /* jsp_label_raise_nested_jumpable_border */ /** - * Unmark current label, if any, as nested jumpable border + * Remove nested jumpable border from current label */ void jsp_label_remove_nested_jumpable_border (void) { - if (label_set_p != NULL) - { - JERRY_ASSERT (label_set_p->is_nested_jumpable_border); - label_set_p->is_nested_jumpable_border = false; - } + JERRY_ASSERT (label_set_p != NULL && label_set_p->is_nested_jumpable_border); + + label_set_p->is_nested_jumpable_border = false; } /* jsp_label_remove_nested_jumpable_border */ /** diff --git a/jerry-core/parser/js/jsp-label.h b/jerry-core/parser/js/jsp-label.h index d37ef4304..503902dc8 100644 --- a/jerry-core/parser/js/jsp-label.h +++ b/jerry-core/parser/js/jsp-label.h @@ -77,7 +77,7 @@ extern jsp_label_t *jsp_label_find (jsp_label_type_flag_t type_mask, token id, b extern void jsp_label_add_jump (jsp_label_t *label_p, bool is_simply_jumpable, bool is_break); extern void jsp_label_setup_continue_target (jsp_label_t *outermost_label_p, opcode_counter_t tgt_oc); -extern void jsp_label_raise_nested_jumpable_border (void); +extern bool jsp_label_raise_nested_jumpable_border (void); extern void jsp_label_remove_nested_jumpable_border (void); extern jsp_label_t *jsp_label_mask_set (void); diff --git a/jerry-core/parser/js/parser.cpp b/jerry-core/parser/js/parser.cpp index 46a129a8e..5d93fad7c 100644 --- a/jerry-core/parser/js/parser.cpp +++ b/jerry-core/parser/js/parser.cpp @@ -1985,7 +1985,7 @@ jsp_parse_for_in_statement (jsp_label_t *outermost_stmt_label_p, /**< outermost * labels associated with the statement) */ locus for_body_statement_loc) /**< locus of loop body statement */ { - jsp_label_raise_nested_jumpable_border (); + bool is_raised = jsp_label_raise_nested_jumpable_border (); current_token_must_be (TOK_OPEN_PAREN); skip_newlines (); @@ -2068,7 +2068,10 @@ jsp_parse_for_in_statement (jsp_label_t *outermost_stmt_label_p, /**< outermost lexer_save_token (tok); } - jsp_label_remove_nested_jumpable_border (); + if (is_raised) + { + jsp_label_remove_nested_jumpable_border (); + } } /* jsp_parse_for_in_statement */ /** @@ -2255,7 +2258,7 @@ parse_with_statement (void) } const operand expr = parse_expression_inside_parens (); - jsp_label_raise_nested_jumpable_border (); + bool is_raised = jsp_label_raise_nested_jumpable_border (); opcode_counter_t with_begin_oc = dump_with_for_rewrite (expr); skip_newlines (); @@ -2263,7 +2266,10 @@ parse_with_statement (void) rewrite_with (with_begin_oc); dump_with_end (); - jsp_label_remove_nested_jumpable_border (); + if (is_raised) + { + jsp_label_remove_nested_jumpable_border (); + } } static void @@ -2433,7 +2439,7 @@ parse_try_statement (void) { assert_keyword (KW_TRY); - jsp_label_raise_nested_jumpable_border (); + bool is_raised = jsp_label_raise_nested_jumpable_border (); dump_try_for_rewrite (); @@ -2470,7 +2476,10 @@ parse_try_statement (void) dump_end_try_catch_finally (); - jsp_label_remove_nested_jumpable_border (); + if (is_raised) + { + jsp_label_remove_nested_jumpable_border (); + } } static void diff --git a/tests/jerry/regression-test-issue-164.js b/tests/jerry/regression-test-issue-164.js new file mode 100644 index 000000000..4c6547428 --- /dev/null +++ b/tests/jerry/regression-test-issue-164.js @@ -0,0 +1,22 @@ +// Copyright 2015 Samsung Electronics Co., Ltd. +// Copyright 2015 University of Szeged. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var v_1 = { }; + +for (i = 0; i < 1; i++) { + with ( v_1 ) { + with ( v_1 ) { } + } +}