]> git.kaiwu.me - njs.git/commitdiff
Making njs_lexer_rollback() more generic.
authorhongzhidao <hongzhidao@gmail.com>
Mon, 29 Apr 2019 05:31:16 +0000 (13:31 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Mon, 29 Apr 2019 05:31:16 +0000 (13:31 +0800)
njs/njs_lexer.c
njs/njs_lexer.h
njs/njs_parser_expression.c

index b05a60cd742fe96280f2b2e4d468d535fdd2ece3..c1b3d55128b1c3fe9d67daa854419b59e1a029d9 100644 (file)
@@ -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, &lt->link);
+
+    return NXT_OK;
+}
+
+
 static njs_token_t
 njs_lexer_token_name_resolve(njs_lexer_t *lexer, njs_lexer_token_t *lt)
 {
index 03f9303abbedcdd57f895b13bd778e5c4d7efa69..30d0a55428006a69337ad4aceed2c26f7df235ca 100644 (file)
@@ -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_ */
index 198eed5b9b1700a1bbb0cae5d29e0e344b9b9c56..95ab481c3786448a25b4d07df10b5eccdba86f62 100644 (file)
@@ -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;
     }