From: hongzhidao Date: Mon, 29 Apr 2019 05:31:16 +0000 (+0800) Subject: Making njs_lexer_rollback() more generic. X-Git-Tag: 0.3.2~35 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=9809349350d8f33222546bb066dc592ae605694c;p=njs.git Making njs_lexer_rollback() more generic. --- diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c index b05a60cd..c1b3d551 100644 --- a/njs/njs_lexer.c +++ b/njs/njs_lexer.c @@ -307,6 +307,11 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer) lexer->prev_start = lexer->start; + if (lexer->lexer_token != NULL) { + lexer->prev_token = lexer->lexer_token->token; + nxt_mp_free(vm->mem_pool, lexer->lexer_token); + } + if (nxt_queue_is_empty(&lexer->preread)) { lt = njs_lexer_token_push(vm, lexer); if (nxt_slow_path(lt == NULL)) { @@ -314,14 +319,7 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer) } } - lt = njs_lexer_token_pop(lexer); - - if (lexer->lexer_token != NULL && lexer->lexer_token != lt) { - lexer->prev_token = lexer->lexer_token->token; - nxt_mp_free(vm->mem_pool, lexer->lexer_token); - } - - lexer->lexer_token = lt; + lexer->lexer_token = njs_lexer_token_pop(lexer); return njs_lexer_token_name_resolve(lexer, lexer->lexer_token); } @@ -399,6 +397,24 @@ njs_lexer_token_pop(njs_lexer_t *lexer) } +nxt_int_t +njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer) +{ + njs_lexer_token_t *lt; + + lt = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_lexer_token_t)); + if (nxt_slow_path(lt == NULL)) { + return NXT_ERROR; + } + + *lt = *lexer->lexer_token; + + nxt_queue_insert_head(&lexer->preread, <->link); + + return NXT_OK; +} + + static njs_token_t njs_lexer_token_name_resolve(njs_lexer_t *lexer, njs_lexer_token_t *lt) { diff --git a/njs/njs_lexer.h b/njs/njs_lexer.h index 03f9303a..30d0a554 100644 --- a/njs/njs_lexer.h +++ b/njs/njs_lexer.h @@ -258,13 +258,9 @@ nxt_int_t njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file, 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); +nxt_int_t njs_lexer_rollback(njs_vm_t *vm, njs_lexer_t *lexer); 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) \ - do { \ - nxt_queue_insert_head(&(lexer)->preread, &(lexer)->lexer_token->link); \ - } while (0) - #endif /* _NJS_LEXER_H_INCLUDED_ */ diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c index 198eed5b..95ab481c 100644 --- a/njs/njs_parser_expression.c +++ b/njs/njs_parser_expression.c @@ -682,6 +682,7 @@ static njs_token_t njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { + nxt_int_t ret; njs_parser_node_t *node; njs_vmcode_operation_t operation; @@ -709,7 +710,11 @@ njs_parser_post_inc_dec_expression(njs_vm_t *vm, njs_parser_t *parser, /* Automatic semicolon insertion. */ if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) { - njs_lexer_rollback(parser->lexer); + ret = njs_lexer_rollback(vm, parser->lexer); + if (nxt_slow_path(ret != NXT_OK)) { + return NJS_TOKEN_ERROR; + } + return NJS_TOKEN_SEMICOLON; }