]> git.kaiwu.me - njs.git/commitdiff
Improved njs_lexer_rollback().
authorhongzhidao <hongzhidao@gmail.com>
Sat, 27 Apr 2019 01:04:24 +0000 (09:04 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Sat, 27 Apr 2019 01:04:24 +0000 (09:04 +0800)
njs/njs_lexer.c
njs/njs_lexer.h
njs/test/njs_unit_test.c

index 1998b03ae6c523be0c35fd4adb87970733d8d6d6..b05a60cd742fe96280f2b2e4d468d535fdd2ece3 100644 (file)
@@ -307,11 +307,6 @@ 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)) {
@@ -319,7 +314,14 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer)
         }
     }
 
-    lexer->lexer_token = njs_lexer_token_pop(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;
 
     return njs_lexer_token_name_resolve(lexer, lexer->lexer_token);
 }
index bf705cf272a24777abc74e465720fcc851691f91..03f9303abbedcdd57f895b13bd778e5c4d7efa69 100644 (file)
@@ -264,7 +264,6 @@ 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); \
-        (lexer)->lexer_token = NULL;                                           \
     } while (0)
 
 
index ebe5dbc130f35acacff375618be7492bb3f4fed8..4640996cad3641635b2da43fcca15c9a4cec847c 100644 (file)
@@ -2157,6 +2157,12 @@ static njs_unit_test_t  njs_test[] =
 
     /* automatic semicolon insertion. */
 
+    { nxt_string("(a\n--"),
+      nxt_string("SyntaxError: Unexpected token \"--\" in 2") },
+
+    { nxt_string("(a\n++"),
+      nxt_string("SyntaxError: Unexpected token \"++\" in 2") },
+
     { nxt_string("var x = 0, y = 2; x\n--\ny; [x,y]"),
       nxt_string("0,1") },