[njs] Fixed function redeclaration.

Dmitry Volyntsev xeioex at nginx.com
Tue Jan 25 13:38:41 UTC 2022


details:   https://hg.nginx.org/njs/rev/d29cddd07a32
branches:  
changeset: 1815:d29cddd07a32
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Tue Jan 25 13:18:20 2022 +0000
description:
Fixed function redeclaration.

Previously, the existing lambda structure was reused resulting in the
properties of the previously defined function was merged into a new one.

The bug was introduced in 66bd2cc7fd87 (0.7.0).

diffstat:

 src/njs_generator.c      |   8 +++-----
 src/njs_variable.c       |  41 ++++++++++++++++++++---------------------
 src/test/njs_unit_test.c |  10 ++++++++++
 3 files changed, 33 insertions(+), 26 deletions(-)

diffs (96 lines):

diff -r d776b59196c5 -r d29cddd07a32 src/njs_generator.c
--- a/src/njs_generator.c	Fri Jan 21 14:31:30 2022 +0000
+++ b/src/njs_generator.c	Tue Jan 25 13:18:20 2022 +0000
@@ -3684,11 +3684,9 @@ njs_generate_function_scope(njs_vm_t *vm
     lambda->nlocal = node->scope->items;
     lambda->temp = node->scope->temp;
 
-    if (node->scope->declarations != NULL) {
-        arr = node->scope->declarations;
-        lambda->declarations = arr->start;
-        lambda->ndeclarations = arr->items;
-    }
+    arr = node->scope->declarations;
+    lambda->declarations = (arr != NULL) ? arr->start : NULL;
+    lambda->ndeclarations = (arr != NULL) ? arr->items : 0;
 
     return NJS_OK;
 }
diff -r d776b59196c5 -r d29cddd07a32 src/njs_variable.c
--- a/src/njs_variable.c	Fri Jan 21 14:31:30 2022 +0000
+++ b/src/njs_variable.c	Tue Jan 25 13:18:20 2022 +0000
@@ -56,34 +56,33 @@ njs_variable_function_add(njs_parser_t *
         return NULL;
     }
 
-    if (var->index == NJS_INDEX_ERROR || !var->function) {
-        root = njs_function_scope(scope);
-        if (njs_slow_path(scope == NULL)) {
-            return NULL;
-        }
+    root = njs_function_scope(scope);
+    if (njs_slow_path(scope == NULL)) {
+        return NULL;
+    }
 
-        ctor = parser->node->token_type != NJS_TOKEN_ASYNC_FUNCTION_DECLARATION;
+    ctor = parser->node->token_type != NJS_TOKEN_ASYNC_FUNCTION_DECLARATION;
 
-        lambda = njs_function_lambda_alloc(parser->vm, ctor);
-        if (lambda == NULL) {
-            return NULL;
-        }
+    lambda = njs_function_lambda_alloc(parser->vm, ctor);
+    if (lambda == NULL) {
+        return NULL;
+    }
 
-        var->value.data.u.lambda = lambda;
+    njs_set_invalid(&var->value);
+    var->value.data.u.lambda = lambda;
 
-        declr = njs_variable_scope_function_add(parser, root);
-        if (njs_slow_path(declr == NULL)) {
-            return NULL;
-        }
+    declr = njs_variable_scope_function_add(parser, root);
+    if (njs_slow_path(declr == NULL)) {
+        return NULL;
+    }
 
-        var->index = njs_scope_index(root->type, root->items, NJS_LEVEL_LOCAL,
-                                     type);
+    var->index = njs_scope_index(root->type, root->items, NJS_LEVEL_LOCAL,
+                                 type);
 
-        declr->value = &var->value;
-        declr->index = var->index;
+    declr->value = &var->value;
+    declr->index = var->index;
 
-        root->items++;
-    }
+    root->items++;
 
     var->type = NJS_VARIABLE_FUNCTION;
     var->function = 1;
diff -r d776b59196c5 -r d29cddd07a32 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c	Fri Jan 21 14:31:30 2022 +0000
+++ b/src/test/njs_unit_test.c	Tue Jan 25 13:18:20 2022 +0000
@@ -10568,6 +10568,16 @@ static njs_unit_test_t  njs_test[] =
                  "myFoo(1,2);" ),
       njs_str("") },
 
+    { njs_str("function f(...rest) {};"
+              "function f(a, b) {return a + b};"
+              "f(1,2)"),
+      njs_str("3") },
+
+    { njs_str("function f() { function q() {} };"
+              "function f() { };"
+              "f()"),
+      njs_str("undefined") },
+
     /* arrow functions. */
 
     { njs_str("()"),



More information about the nginx-devel mailing list