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
This commit is contained in:
committed by
Evgeny Gavrin
parent
2aa04859ef
commit
7b90d54490
@@ -246,29 +246,47 @@ jsp_label_setup_continue_target (jsp_label_t *outermost_label_p, /**< the outerm
|
|||||||
} /* jsp_label_setup_continue_target */
|
} /* 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)
|
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);
|
if (!label_set_p->is_nested_jumpable_border)
|
||||||
label_set_p->is_nested_jumpable_border = true;
|
{
|
||||||
|
label_set_p->is_nested_jumpable_border = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
} /* jsp_label_raise_nested_jumpable_border */
|
} /* jsp_label_raise_nested_jumpable_border */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unmark current label, if any, as nested jumpable border
|
* Remove nested jumpable border from current label
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
jsp_label_remove_nested_jumpable_border (void)
|
jsp_label_remove_nested_jumpable_border (void)
|
||||||
{
|
{
|
||||||
if (label_set_p != NULL)
|
JERRY_ASSERT (label_set_p != NULL && label_set_p->is_nested_jumpable_border);
|
||||||
{
|
|
||||||
JERRY_ASSERT (label_set_p->is_nested_jumpable_border);
|
label_set_p->is_nested_jumpable_border = false;
|
||||||
label_set_p->is_nested_jumpable_border = false;
|
|
||||||
}
|
|
||||||
} /* jsp_label_remove_nested_jumpable_border */
|
} /* jsp_label_remove_nested_jumpable_border */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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_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_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 void jsp_label_remove_nested_jumpable_border (void);
|
||||||
|
|
||||||
extern jsp_label_t *jsp_label_mask_set (void);
|
extern jsp_label_t *jsp_label_mask_set (void);
|
||||||
|
|||||||
@@ -1985,7 +1985,7 @@ jsp_parse_for_in_statement (jsp_label_t *outermost_stmt_label_p, /**< outermost
|
|||||||
* labels associated with the statement) */
|
* labels associated with the statement) */
|
||||||
locus for_body_statement_loc) /**< locus of loop body 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);
|
current_token_must_be (TOK_OPEN_PAREN);
|
||||||
skip_newlines ();
|
skip_newlines ();
|
||||||
@@ -2068,7 +2068,10 @@ jsp_parse_for_in_statement (jsp_label_t *outermost_stmt_label_p, /**< outermost
|
|||||||
lexer_save_token (tok);
|
lexer_save_token (tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
jsp_label_remove_nested_jumpable_border ();
|
if (is_raised)
|
||||||
|
{
|
||||||
|
jsp_label_remove_nested_jumpable_border ();
|
||||||
|
}
|
||||||
} /* jsp_parse_for_in_statement */
|
} /* jsp_parse_for_in_statement */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2255,7 +2258,7 @@ parse_with_statement (void)
|
|||||||
}
|
}
|
||||||
const operand expr = parse_expression_inside_parens ();
|
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);
|
opcode_counter_t with_begin_oc = dump_with_for_rewrite (expr);
|
||||||
skip_newlines ();
|
skip_newlines ();
|
||||||
@@ -2263,7 +2266,10 @@ parse_with_statement (void)
|
|||||||
rewrite_with (with_begin_oc);
|
rewrite_with (with_begin_oc);
|
||||||
dump_with_end ();
|
dump_with_end ();
|
||||||
|
|
||||||
jsp_label_remove_nested_jumpable_border ();
|
if (is_raised)
|
||||||
|
{
|
||||||
|
jsp_label_remove_nested_jumpable_border ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2433,7 +2439,7 @@ parse_try_statement (void)
|
|||||||
{
|
{
|
||||||
assert_keyword (KW_TRY);
|
assert_keyword (KW_TRY);
|
||||||
|
|
||||||
jsp_label_raise_nested_jumpable_border ();
|
bool is_raised = jsp_label_raise_nested_jumpable_border ();
|
||||||
|
|
||||||
dump_try_for_rewrite ();
|
dump_try_for_rewrite ();
|
||||||
|
|
||||||
@@ -2470,7 +2476,10 @@ parse_try_statement (void)
|
|||||||
|
|
||||||
dump_end_try_catch_finally ();
|
dump_end_try_catch_finally ();
|
||||||
|
|
||||||
jsp_label_remove_nested_jumpable_border ();
|
if (is_raised)
|
||||||
|
{
|
||||||
|
jsp_label_remove_nested_jumpable_border ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -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 ) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user