mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Add test try_catch_finally.js. Fix parser and interpreter
This commit is contained in:
parent
51b7dc0d69
commit
70cc5128cc
@ -40,7 +40,7 @@ opfunc_is_true_jmp_down (opcode_t opdata, /**< operation data */
|
||||
|
||||
if (ecma_is_value_true (to_bool_completion.u.value))
|
||||
{
|
||||
JERRY_ASSERT (offset != 0 && (int_data->pos + offset < MAX_OPCODES));
|
||||
JERRY_ASSERT (offset != 0 && ((uint32_t) int_data->pos + offset < MAX_OPCODES));
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos + offset);
|
||||
}
|
||||
else
|
||||
@ -73,7 +73,7 @@ opfunc_is_true_jmp_up (opcode_t opdata, /**< operation data */
|
||||
|
||||
if (ecma_is_value_true (to_bool_completion.u.value))
|
||||
{
|
||||
JERRY_ASSERT (offset != 0 && int_data->pos >= offset);
|
||||
JERRY_ASSERT (offset != 0 && (uint32_t) int_data->pos >= offset);
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos - offset);
|
||||
}
|
||||
else
|
||||
@ -112,7 +112,7 @@ opfunc_is_false_jmp_down (opcode_t opdata, /**< operation data */
|
||||
|
||||
if (!ecma_is_value_true (to_bool_completion.u.value))
|
||||
{
|
||||
JERRY_ASSERT (offset != 0 && (int_data->pos + offset < MAX_OPCODES));
|
||||
JERRY_ASSERT (offset != 0 && ((uint32_t) int_data->pos + offset < MAX_OPCODES));
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos + offset);
|
||||
}
|
||||
else
|
||||
@ -145,7 +145,7 @@ opfunc_is_false_jmp_up (opcode_t opdata, /**< operation data */
|
||||
|
||||
if (!ecma_is_value_true (to_bool_completion.u.value))
|
||||
{
|
||||
JERRY_ASSERT (offset != 0 && int_data->pos >= offset);
|
||||
JERRY_ASSERT (offset != 0 && (uint32_t) int_data->pos >= offset);
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos - offset);
|
||||
}
|
||||
else
|
||||
@ -173,7 +173,7 @@ opfunc_jmp_down (opcode_t opdata, /**< operation data */
|
||||
const opcode_counter_t offset = calc_opcode_counter_from_idx_idx (opdata.data.jmp_down.opcode_1,
|
||||
opdata.data.jmp_down.opcode_2);
|
||||
|
||||
JERRY_ASSERT (offset != 0 && (int_data->pos + offset < MAX_OPCODES));
|
||||
JERRY_ASSERT (offset != 0 && ((uint32_t) int_data->pos + offset < MAX_OPCODES));
|
||||
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos + offset);
|
||||
|
||||
@ -192,7 +192,7 @@ opfunc_jmp_up (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
const opcode_counter_t offset = calc_opcode_counter_from_idx_idx (opdata.data.jmp_up.opcode_1,
|
||||
opdata.data.jmp_up.opcode_2);
|
||||
JERRY_ASSERT (offset != 0 && int_data->pos >= offset);
|
||||
JERRY_ASSERT (offset != 0 && (uint32_t) int_data->pos >= offset);
|
||||
|
||||
int_data->pos = (opcode_counter_t) (int_data->pos - offset);
|
||||
|
||||
|
||||
@ -87,10 +87,11 @@ opfunc_try (opcode_t opdata, /**< operation data */
|
||||
int_data->lex_env_p = old_env_p;
|
||||
|
||||
ecma_deref_object (catch_env_p);
|
||||
|
||||
JERRY_ASSERT ((!ecma_is_completion_value_empty (try_completion) && int_data->pos < catch_end_oc)
|
||||
|| (ecma_is_completion_value_empty (try_completion) && int_data->pos == catch_end_oc));
|
||||
}
|
||||
|
||||
JERRY_ASSERT ((!ecma_is_completion_value_empty (try_completion) && int_data->pos < catch_end_oc)
|
||||
|| (ecma_is_completion_value_empty (try_completion) && int_data->pos == catch_end_oc));
|
||||
int_data->pos = catch_end_oc;
|
||||
}
|
||||
|
||||
|
||||
@ -427,6 +427,20 @@ token_after_newlines_must_be_keyword (keyword kw)
|
||||
CHECK_USAGE (IDX) \
|
||||
} while (0)
|
||||
|
||||
#define REWRITE_TRY(OC) \
|
||||
do { \
|
||||
DECLARE_USAGE (IDX) \
|
||||
JERRY_STATIC_ASSERT (sizeof (idx_t) == 1); \
|
||||
PUSH (IDX, (idx_t) ((OPCODE_COUNTER ()) >> JERRY_BITSINBYTE)); \
|
||||
PUSH (IDX, (idx_t) ((OPCODE_COUNTER ()) & ((1 << JERRY_BITSINBYTE) - 1))); \
|
||||
JERRY_ASSERT ((OPCODE_COUNTER ()) \
|
||||
== calc_opcode_counter_from_idx_idx (HEAD (IDX, 2), HEAD (IDX, 1))); \
|
||||
OPCODE()=getop_try (HEAD (IDX, 2), HEAD (IDX, 1)); \
|
||||
serializer_rewrite_opcode ((OC), OPCODE()); \
|
||||
DROP (IDX, 2); \
|
||||
CHECK_USAGE (IDX) \
|
||||
} while (0)
|
||||
|
||||
static void
|
||||
integer_zero (void)
|
||||
{
|
||||
@ -1111,17 +1125,17 @@ parse_primary_expression (void)
|
||||
case TOK_STRING:
|
||||
{
|
||||
parse_literal ();
|
||||
goto cleanup;
|
||||
break;
|
||||
}
|
||||
case TOK_OPEN_SQUARE:
|
||||
{
|
||||
parse_array_literal ();
|
||||
goto cleanup;
|
||||
break;
|
||||
}
|
||||
case TOK_OPEN_BRACE:
|
||||
{
|
||||
parse_object_literal ();
|
||||
goto cleanup;
|
||||
break;
|
||||
}
|
||||
case TOK_OPEN_PAREN:
|
||||
{
|
||||
@ -1130,7 +1144,7 @@ parse_primary_expression (void)
|
||||
{
|
||||
parse_expression ();
|
||||
token_after_newlines_must_be (TOK_CLOSE_PAREN);
|
||||
goto cleanup;
|
||||
break;
|
||||
}
|
||||
/* FALLTHRU */
|
||||
}
|
||||
@ -2104,7 +2118,7 @@ parse_statement_list (void)
|
||||
if (token_is (TOK_CLOSE_BRACE))
|
||||
{
|
||||
lexer_save_token (TOK ());
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2295,6 +2309,7 @@ parse_catch_clause (void)
|
||||
DUMP_OPCODE_3 (meta, OPCODE_META_TYPE_CATCH_EXCEPTION_IDENTIFIER, HEAD (IDX, 1), INVALID_VALUE);
|
||||
|
||||
token_after_newlines_must_be (TOK_OPEN_BRACE);
|
||||
skip_newlines ();
|
||||
parse_statement_list ();
|
||||
next_token_must_be (TOK_CLOSE_BRACE);
|
||||
|
||||
@ -2322,6 +2337,7 @@ parse_finally_clause (void)
|
||||
DUMP_OPCODE_3 (meta, OPCODE_META_TYPE_FINALLY, INVALID_VALUE, INVALID_VALUE);
|
||||
|
||||
token_after_newlines_must_be (TOK_OPEN_BRACE);
|
||||
skip_newlines ();
|
||||
parse_statement_list ();
|
||||
next_token_must_be (TOK_CLOSE_BRACE);
|
||||
|
||||
@ -2344,13 +2360,14 @@ parse_try_statement (void)
|
||||
assert_keyword (KW_TRY);
|
||||
|
||||
PUSH (U16, OPCODE_COUNTER ())
|
||||
DUMP_OPCODE_2 (try, HEAD (U16, 1) + 1, INVALID_VALUE);
|
||||
DUMP_OPCODE_2 (try, INVALID_VALUE, INVALID_VALUE);
|
||||
|
||||
token_after_newlines_must_be (TOK_OPEN_BRACE);
|
||||
skip_newlines ();
|
||||
parse_statement_list ();
|
||||
next_token_must_be (TOK_CLOSE_BRACE);
|
||||
|
||||
REWRITE_OPCODE_2 (HEAD (U16, 1), try, HEAD (U16, 1) + 1, opcode_counter);
|
||||
REWRITE_TRY (HEAD (U16, 1));
|
||||
|
||||
token_after_newlines_must_be (TOK_KEYWORD);
|
||||
if (is_keyword (KW_CATCH))
|
||||
@ -2561,6 +2578,7 @@ parse_statement (void)
|
||||
insert_semicolon ();
|
||||
|
||||
DUMP_OPCODE_1 (throw, HEAD (IDX, 1));
|
||||
DROP (IDX, 1);
|
||||
goto cleanup;
|
||||
}
|
||||
if (is_keyword (KW_TRY))
|
||||
|
||||
39
tests/jerry/try_catch_finally.js
Normal file
39
tests/jerry/try_catch_finally.js
Normal file
@ -0,0 +1,39 @@
|
||||
// Copyright 2014 Samsung Electronics Co., Ltd.
|
||||
//
|
||||
// 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 was_catch = false, was_finally = false;
|
||||
|
||||
try {
|
||||
} catch (err) {
|
||||
was_catch = true;
|
||||
} finally {
|
||||
was_finally = true;
|
||||
}
|
||||
|
||||
assert (!was_catch && was_finally);
|
||||
|
||||
was_catch = false;
|
||||
was_finally = false;
|
||||
|
||||
try {
|
||||
throw 1;
|
||||
assert (0);
|
||||
} catch (err) {
|
||||
assert (err === 1);
|
||||
was_catch = true;
|
||||
} finally {
|
||||
was_finally = true;
|
||||
}
|
||||
|
||||
assert (was_catch && was_finally);
|
||||
Loading…
x
Reference in New Issue
Block a user