]> git.kaiwu.me - njs.git/commitdiff
Duplicate function names are disabled. 0.1.0
authorIgor Sysoev <igor@sysoev.ru>
Fri, 22 Jul 2016 11:38:06 +0000 (14:38 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Fri, 22 Jul 2016 11:38:06 +0000 (14:38 +0300)
njs/njs_parser.c
njs/njs_parser.h
njs/njs_variable.c
njs/njs_variable.h
njs/test/njs_unit_test.c

index dce0ef5dbc937859c9024924d30d0255a3cb869e..20a00d1ac6a69ad84e44506d11328a8c3fb6e2df 100644 (file)
@@ -290,7 +290,6 @@ njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 static njs_token_t
 njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser)
 {
-    nxt_uint_t         level;
     njs_token_t        token;
     njs_value_t        *value;
     njs_variable_t     *var;
@@ -313,7 +312,7 @@ njs_parser_function_declaration(njs_vm_t *vm, njs_parser_t *parser)
         return NJS_TOKEN_ILLEGAL;
     }
 
-    var = njs_parser_variable(vm, parser, &level);
+    var = njs_parser_name_alloc(vm, parser);
     if (nxt_slow_path(var == NULL)) {
         return NJS_TOKEN_ERROR;
     }
@@ -2241,6 +2240,7 @@ njs_parser_error(njs_vm_t *vm, njs_parser_t *parser, njs_parser_error_t err)
         "SyntaxError: Invalid Unicode code point \"%.*s\" in %u",
         "SyntaxError: Unterminated RegExp \"%.*s\" in %u",
         "SyntaxError: Invalid RegExp flags \"%.*s\" in %u",
+        "SyntaxError: Duplicate declaration \"%.*s\" in %u",
     };
 
     msg = errors[err];
index a40b4ae4478847e5f406a40182c71ee1bf43a12e..359e92f13a6be6179c8b3f2325a67da64cc49777 100644 (file)
@@ -324,6 +324,7 @@ typedef enum {
     NJS_PARSER_ERROR_UNICODE,
     NJS_PARSER_ERROR_UNTERMINATED_REGEXP,
     NJS_PARSER_ERROR_REGEXP_FLAGS,
+    NJS_PARSER_ERROR_DUPLICATE_DECLARATION,
 } njs_parser_error_t;
 
 
index 7ad8c6b868f5ddfaa30f3081c34fbca539294c49..46c34d88d175390222e22fbb6355c4b7b75559b6 100644 (file)
@@ -53,6 +53,37 @@ static const nxt_lvlhsh_proto_t  njs_variables_hash_proto
 };
 
 
+njs_variable_t *
+njs_parser_name_alloc(njs_vm_t *vm, njs_parser_t *parser)
+{
+    nxt_int_t           ret;
+    njs_variable_t      *var;
+    nxt_lvlhsh_query_t  lhq;
+
+    var = njs_variable_alloc(vm, parser, &parser->lexer->text);
+    if (nxt_slow_path(var == NULL)) {
+        return NULL;
+    }
+
+    lhq.key_hash = parser->lexer->key_hash;
+    lhq.key = parser->lexer->text;
+    lhq.replace = 0;
+    lhq.value = var;
+    lhq.proto = &njs_variables_hash_proto;
+    lhq.pool = vm->mem_cache_pool;
+
+    ret = nxt_lvlhsh_insert(&parser->variables_hash, &lhq);
+
+    if (nxt_fast_path(ret == NXT_OK)) {
+        return var;
+    }
+
+    (void) njs_parser_error(vm, parser, NJS_PARSER_ERROR_DUPLICATE_DECLARATION);
+
+    return NULL;
+}
+
+
 njs_variable_t *
 njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser, nxt_uint_t *level)
 {
index edb500d934d25d124be5645c8c925091b793fd55..0d02d139a8e4b46b19ccfa05cc2126974b5c6e6c 100644 (file)
@@ -26,6 +26,7 @@ typedef struct {
 } njs_variable_t;
 
 
+njs_variable_t *njs_parser_name_alloc(njs_vm_t *vm, njs_parser_t *parser);
 njs_variable_t *njs_parser_variable(njs_vm_t *vm, njs_parser_t *parser,
     nxt_uint_t *level);
 njs_value_t *njs_variable_value(njs_parser_t *parser, njs_index_t index);
index ca2f95db7abe197eee19a713eca9e1e899653af3..d678e6fb89b16936f4276cf3fa14a5dcc6aae220 100644 (file)
@@ -67,6 +67,15 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var a = 1; var b; a"),
       nxt_string("1") },
 
+    { nxt_string("function f(){} function f(){}"),
+      nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") },
+
+    { nxt_string("var f = 1; function f() {}"),
+      nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") },
+
+    { nxt_string("function f() {} var f = 1; f"),
+      nxt_string("1") },
+
     /* Numbers. */
 
     { nxt_string("999999999999999999999"),