From c4c713535e651c3db8fe833294ed4b12f0473997 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 2 Oct 2014 21:35:39 +0400 Subject: [PATCH] Fix insert_semicolon --- .gitignore | 2 ++ src/libjsparser/lexer.c | 43 +++++++++++++++++++++++----------------- src/libjsparser/lexer.h | 1 + src/libjsparser/parser.c | 13 +++++++++--- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index ef0ba35df..fc3e1faa9 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ nbproject *.swp *~ js.files +jerry.error +jerry.passed core vgcore.* **.orig diff --git a/src/libjsparser/lexer.c b/src/libjsparser/lexer.c index a2e13ff53..1655194b1 100644 --- a/src/libjsparser/lexer.c +++ b/src/libjsparser/lexer.c @@ -20,7 +20,7 @@ #include "stack.h" #include "opcodes.h" -static token saved_token; +static token saved_token, prev_token, sent_token; static token empty_token = { .type = TOK_EMPTY, @@ -1233,16 +1233,17 @@ lexer_next_token (void) } #endif /* __TARGET_HOST_x64 */ - token tok = lexer_next_token_private (); + prev_token = sent_token; + sent_token = lexer_next_token_private (); #ifdef __TARGET_HOST_x64 - if (tok.type == TOK_NEWLINE) + if (sent_token.type == TOK_NEWLINE) { dump_current_line (); - return tok; + return sent_token; } #endif /* __TARGET_HOST_x64 */ - return tok; + return sent_token; } void @@ -1251,25 +1252,18 @@ lexer_save_token (token tok) saved_token = tok; } +token +lexer_prev_token (void) +{ + return prev_token; +} + void lexer_dump_buffer_state (void) { __printf ("%s\n", buffer); } -void -lexer_init (const char *source, size_t source_size, bool show_opcodes) -{ - saved_token = empty_token; - allow_dump_lines = show_opcodes; - buffer_size = source_size; - lexer_set_source (source); - - STACK_INIT (lp_string, strings); - STACK_INIT (ecma_number_t, numbers); - STACK_INIT (idx_t, num_ids); -} - void lexer_run_first_pass (void) { @@ -1282,6 +1276,19 @@ lexer_run_first_pass (void) lexer_rewind (); } +void +lexer_init (const char *source, size_t source_size, bool show_opcodes) +{ + saved_token = prev_token = sent_token = empty_token; + allow_dump_lines = show_opcodes; + buffer_size = source_size; + lexer_set_source (source); + + STACK_INIT (lp_string, strings); + STACK_INIT (ecma_number_t, numbers); + STACK_INIT (idx_t, num_ids); +} + void lexer_free (void) { diff --git a/src/libjsparser/lexer.h b/src/libjsparser/lexer.h index b71292666..2ccc71e53 100644 --- a/src/libjsparser/lexer.h +++ b/src/libjsparser/lexer.h @@ -152,6 +152,7 @@ void lexer_run_first_pass (void); token lexer_next_token (void); void lexer_save_token (token); +token lexer_prev_token (void); void lexer_dump_buffer_state (void); diff --git a/src/libjsparser/parser.c b/src/libjsparser/parser.c index f69d62e40..213ad4aee 100644 --- a/src/libjsparser/parser.c +++ b/src/libjsparser/parser.c @@ -2764,9 +2764,16 @@ parse_try_statement (void) static void insert_semicolon (void) { - TODO (/*Uncomment when skip_newlines will be fixed. */) - // skip_token (); - // JERRY_ASSERT (token_is (TOK_SEMICOLON) || token_is (TOK_NEWLINE)); + // We cannot use TOK (), since we may use lexer_save_token + skip_token (); + if (lexer_prev_token ().type == TOK_NEWLINE) + { + return; + } + if (!token_is (TOK_SEMICOLON)) + { + parser_fatal (ERR_PARSER); + } } /* statement