]> git.kaiwu.me - njs.git/commitdiff
Fixed function redeclaration in CLI when interactive mode is on.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 7 Dec 2021 13:15:19 +0000 (13:15 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 7 Dec 2021 13:15:19 +0000 (13:15 +0000)
The issue was introduced in 0a2a0b5a74f4 (0.6.0).

src/njs_generator.c
src/njs_parser.c
src/njs_variable.h
src/test/njs_unit_test.c

index e0fb30d0a89db1045db7e42061a57d845443158c..1c608f2b0417d24bc84c1e279663f96638d9cc66 100644 (file)
@@ -3583,11 +3583,7 @@ njs_generate_function_declaration(njs_vm_t *vm, njs_generator_t *generator,
         return njs_generator_stack_pop(vm, generator, NULL);
     }
 
-    if (njs_is_function(&var->value)) {
-        lambda = njs_function(&var->value)->u.lambda;
-    } else {
-        lambda = var->value.data.u.lambda;
-    }
+    lambda = njs_variable_lambda(var);
 
     lex_entry = njs_lexer_entry(node->u.reference.unique_id);
     if (njs_slow_path(lex_entry == NULL)) {
index 4f2aa3070513f5acc4e707372f50dbdec395d829..9bfbf24016962d619bf0133668a1deedacbe1334 100644 (file)
@@ -6747,7 +6747,7 @@ njs_parser_function_declaration(njs_parser_t *parser, njs_lexer_token_t *token,
         return NJS_ERROR;
     }
 
-    node->u.value.data.u.lambda = var->value.data.u.lambda;
+    node->u.value.data.u.lambda = njs_variable_lambda(var);
 
     node->left = (njs_parser_node_t *) unique_id;
 
index 56d54e95646fc99ec45ec1e1928476659b5ca60a..db309f7d565346e820c1ec9b01298f6629ba4797 100644 (file)
@@ -93,6 +93,17 @@ njs_variable_node_alloc(njs_vm_t *vm, njs_variable_t *var, uintptr_t key)
     return node;
 }
 
+njs_inline njs_function_lambda_t *
+njs_variable_lambda(njs_variable_t * var)
+{
+    if (njs_is_function(&var->value)) {
+        /* may be set by generator in njs_generate_function_declaration(). */
+        return njs_function(&var->value)->u.lambda;
+    }
+
+    return var->value.data.u.lambda;
+}
+
 
 njs_inline void
 njs_variable_node_free(njs_vm_t *vm, njs_variable_node_t *node)
index c11b47ed9c5d9db47edb659a6ae89f12ba761366..6683ccc7e99de7ca7c5213af21e3289a6b3ae4de 100644 (file)
@@ -21408,6 +21408,14 @@ static njs_unit_test_t  njs_shell_test[] =
               "Number.prototype.test" ENTER),
       njs_str("test") },
 
+    { njs_str("function f(a) {return a}" ENTER
+              "function f(a) {return a}; f(2)" ENTER),
+      njs_str("2") },
+
+    { njs_str("function f() {return 1}" ENTER
+              "function f(a) {return 1}; f(2)" ENTER),
+      njs_str("1") },
+
     { njs_str("try {(new Function('function foo(){return 1}; ()=>{}breakhere'))} catch (e) {}" ENTER
               "foo()" ENTER),
       njs_str("ReferenceError: \"foo\" is not defined\n"