From: hongzhidao Date: Sun, 17 Mar 2019 14:11:09 +0000 (+0300) Subject: Fixed njs_parser_peek_token(). X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=550946b1aa2d847561f04ca830eeb7b083368693;p=njs.git Fixed njs_parser_peek_token(). --- diff --git a/njs/njs_lexer.h b/njs/njs_lexer.h index eaaf321c..caae37b2 100644 --- a/njs/njs_lexer.h +++ b/njs/njs_lexer.h @@ -247,12 +247,16 @@ typedef struct { nxt_int_t njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file, u_char *start, u_char *end); njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer); -njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset); +njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, + size_t offset); nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash); void njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt); -#define njs_lexer_rollback(lexer) \ - (lexer)->start = (lexer)->prev_start +#define njs_lexer_rollback(lexer) \ + do { \ + nxt_queue_insert_head(&(lexer)->preread, &(lexer)->lexer_token->link); \ + (lexer)->lexer_token = NULL; \ + } while (0) #endif /* _NJS_LEXER_H_INCLUDED_ */ diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 9b408e76..5babf67f 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -332,6 +332,8 @@ static njs_token_t njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { + size_t offset; + parser->node = NULL; switch (token) { @@ -374,12 +376,6 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser, default: - if (token == NJS_TOKEN_NAME - && njs_parser_peek_token(vm, parser, 0) == NJS_TOKEN_COLON) - { - return njs_parser_labelled_statement(vm, parser); - } - switch (token) { case NJS_TOKEN_VAR: token = njs_parser_var_statement(vm, parser); @@ -398,6 +394,14 @@ njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser, token = njs_parser_brk_statement(vm, parser, token); break; + case NJS_TOKEN_NAME: + offset = 0; + if (njs_parser_peek_token(vm, parser, &offset) == NJS_TOKEN_COLON) { + return njs_parser_labelled_statement(vm, parser); + } + + /* Fall through. */ + default: token = njs_parser_expression(vm, parser, token); break; diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 0797f219..476fc2e3 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -100,10 +100,6 @@ void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node, njs_value_type_t type, const char *fmt, ...); -#define njs_parser_peek_token(vm, parser, offset) \ - njs_lexer_peek_token(vm, (parser)->lexer, offset) - - #define njs_parser_is_lvalue(node) \ ((node)->token == NJS_TOKEN_NAME || (node)->token == NJS_TOKEN_PROPERTY) @@ -128,11 +124,19 @@ njs_parser_token(njs_vm_t *vm, njs_parser_t *parser) do { token = njs_lexer_token(vm, parser->lexer); + } while (nxt_slow_path(token == NJS_TOKEN_LINE_END)); + + return token; +} - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } +nxt_inline njs_token_t +njs_parser_peek_token(njs_vm_t *vm, njs_parser_t *parser, size_t *offset) +{ + njs_token_t token; + + do { + token = njs_lexer_peek_token(vm, parser->lexer, (*offset)++); } while (nxt_slow_path(token == NJS_TOKEN_LINE_END)); return token; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 1c1e26dc..32012846 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -2058,6 +2058,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("var a; a = 0; ++ \n a"), nxt_string("1") }, + { nxt_string("var a; a = 0\n ++a"), + nxt_string("1") }, + { nxt_string("a = 0; a \n ++"), nxt_string("SyntaxError: Unexpected end of input in 2") }, @@ -2508,6 +2511,18 @@ static njs_unit_test_t njs_test[] = { nxt_string("a: throw 'a'"), nxt_string("a") }, + { nxt_string("a\n:\n1"), + nxt_string("1") }, + + { nxt_string("a\n\n:1"), + nxt_string("1") }, + + { nxt_string("a:\n\n1"), + nxt_string("1") }, + + { nxt_string("a:\n\n"), + nxt_string("SyntaxError: Unexpected end of input in 3") }, + { nxt_string("a : var n = 0; b :++n"), nxt_string("1") },