]> git.kaiwu.me - njs.git/commitdiff
Reserverd words can be used as property names.
authorIgor Sysoev <igor@sysoev.ru>
Wed, 20 Apr 2016 15:30:31 +0000 (18:30 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 20 Apr 2016 15:30:31 +0000 (18:30 +0300)
njs/njs_lexer.c
njs/njs_parser.c
njs/njs_parser.h
njs/njs_parser_expression.c
njs/test/njs_unit_test.c

index d3d5cb6672de1bd69c3d0a4ab2f686544e12982a..211086e5f71f09d9f7f9eca4651bb7324442a219 100644 (file)
@@ -465,6 +465,10 @@ njs_lexer_word(njs_lexer_t *lexer, u_char c)
     lexer->start = p;
     lexer->text.len = p - lexer->text.data;
 
+    if (lexer->property) {
+        return NJS_TOKEN_NAME;
+    }
+
     return njs_lexer_keyword(lexer);
 }
 
index 32e627216ba74dc249933620b27349405ffb54b2..f277aea82f8b392a14d85ba152243d4ec386a433 100644 (file)
@@ -1380,6 +1380,21 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser)
 }
 
 
+njs_token_t
+njs_parser_property_token(njs_parser_t *parser)
+{
+    njs_token_t  token;
+
+    parser->lexer->property = 1;
+
+    token = njs_parser_token(parser);
+
+    parser->lexer->property = 0;
+
+    return token;
+}
+
+
 njs_token_t
 njs_parser_token(njs_parser_t *parser)
 {
@@ -1711,7 +1726,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj)
     left = NULL;
 
     for ( ;; ) {
-        token = njs_parser_token(parser);
+        token = njs_parser_property_token(parser);
 
         switch (token) {
 
index f8347d1d17f8e3b34bb3fe8fc2c60b4083db96ac..976d2ab5812c3b2acd3a4d4cd7a01fa6b96b8d61 100644 (file)
@@ -183,6 +183,7 @@ typedef enum {
 typedef struct {
     njs_token_t                     token:8;
     njs_token_t                     prev_token:8;
+    uint8_t                         property;      /* 1 bit */
     uint32_t                        key_hash;
 
     nxt_str_t                       text;
@@ -328,6 +329,7 @@ njs_token_t njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
 njs_token_t njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token);
+njs_token_t njs_parser_property_token(njs_parser_t *parser);
 njs_token_t njs_parser_token(njs_parser_t *parser);
 nxt_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value);
 njs_index_t njs_parser_index(njs_parser_t *parser, uint32_t scope);
index 11bc6d8b6108e5bfa587e97a133ad557bd949a4a..c3536c2d67118bd635d4d998f8156fe18ae3755c 100644 (file)
@@ -999,7 +999,6 @@ static njs_token_t
 njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
-    njs_token_t        next;
     njs_parser_node_t  *node;
 
     for ( ;; ) {
@@ -1019,21 +1018,26 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
         node->u.operation = njs_vmcode_property_get;
         node->left = parser->node;
 
-        next = njs_parser_token(parser);
-        if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
-            return next;
-        }
-
         if (token == NJS_TOKEN_DOT) {
 
-            if (next != NJS_TOKEN_NAME) {
+            token = njs_parser_property_token(parser);
+            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return token;
+            }
+
+            if (token != NJS_TOKEN_NAME) {
                 return NJS_TOKEN_ILLEGAL;
             }
 
-            token = njs_parser_property_name(vm, parser, next);
+            token = njs_parser_property_name(vm, parser, token);
 
         } else {
-            token = njs_parser_property_brackets(vm, parser, next);
+            token = njs_parser_token(parser);
+            if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                return token;
+            }
+
+            token = njs_parser_property_brackets(vm, parser, token);
         }
 
         if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
index 01038d656377e661cc99b3386053632c08eb6388..052abebd72cfd92d08475d503fd5c44e32b02cb0 100644 (file)
@@ -1938,6 +1938,12 @@ static njs_unit_test_t  njs_test[] =
                  "var o = { a: 5, '[object Object]': 7 }; o[n]"),
       nxt_string("7") },
 
+    { nxt_string("var o = {}; o.new = 'OK'; o.new"),
+      nxt_string("OK") },
+
+    { nxt_string("var o = { new: 'OK'}; o.new"),
+      nxt_string("OK") },
+
     /* Arrays */
 
     /* Empty array to primitive. */