]> git.kaiwu.me - njs.git/commitdiff
Restricted function declaration to top level or inside a block.
authorhongzhidao <hongzhidao@gmail.com>
Sun, 21 Apr 2019 09:36:25 +0000 (17:36 +0800)
committerhongzhidao <hongzhidao@gmail.com>
Sun, 21 Apr 2019 09:36:25 +0000 (17:36 +0800)
njs/njs_parser.c
njs/test/njs_unit_test.c

index e40c7478a30039f370a4bef48be87323b4b6165e..54b6c16dd081c9b5e9063f6144610fa6d363bc50 100644 (file)
@@ -492,6 +492,12 @@ njs_parser_block(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
 {
     njs_parser_node_t  *node;
 
+    if (token == NJS_TOKEN_FUNCTION) {
+        njs_parser_syntax_error(vm, parser,
+              "Functions can only be declared at top level or inside a block");
+        return NJS_TOKEN_ILLEGAL;
+    }
+
     token = njs_parser_statement(vm, parser, token);
     if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
index 5a267f61f8cb4b9e92ab22b206dd588869ef420c..230e2b9a42940dd4e8cd483d21ba0d1315fc36dc 100644 (file)
@@ -5725,6 +5725,27 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("\n{\nreturn;\n}"),
       nxt_string("SyntaxError: Illegal return statement in 3") },
 
+    { nxt_string("if (1) function f(){}"),
+      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { nxt_string("if (1) { function f(){}}"),
+      nxt_string("undefined") },
+
+    { nxt_string("while (1) function f() { }"),
+      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { nxt_string("while (1) { break; function f(){}}"),
+      nxt_string("undefined") },
+
+    { nxt_string("for (;;) function f() { }"),
+      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
+    { nxt_string("for (;;) { break; function f(){}}"),
+      nxt_string("undefined") },
+
+    { nxt_string("do function f() { } while (0)"),
+      nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
+
     { nxt_string("function f() { return f() } f()"),
       nxt_string("RangeError: Maximum call stack size exceeded") },