]> git.kaiwu.me - njs.git/commitdiff
The "return" statement without arguments fixed.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 7 Dec 2015 08:59:33 +0000 (11:59 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 7 Dec 2015 08:59:33 +0000 (11:59 +0300)
njs/njs_generator.c
njs/njs_parser.c
njs/test/njs_unit_test.c

index 1c23200921730258010b732ecf1165cc3a2018bb..27a1c56ebe024104798e65472dcde05af3e7d6e2 100644 (file)
@@ -1570,6 +1570,7 @@ njs_generate_return_statement(njs_vm_t *vm, njs_parser_t *parser,
     njs_parser_node_t *node)
 {
     nxt_int_t          ret;
+    njs_index_t        index;
     njs_vmcode_stop_t  *code;
 
     ret = njs_generator(vm, parser, node->right);
@@ -1579,8 +1580,16 @@ njs_generate_return_statement(njs_vm_t *vm, njs_parser_t *parser,
         code->code.operation = njs_vmcode_return;
         code->code.operands = NJS_VMCODE_1OPERAND;
         code->code.retval = NJS_VMCODE_NO_RETVAL;
-        code->retval = node->right->index;
-        node->index = node->right->index;
+
+        if (node->right != NULL) {
+            index = node->right->index;
+
+        } else {
+            index = njs_value_index(vm, parser, &njs_value_void);
+        }
+
+        code->retval = index;
+        node->index = index;
     }
 
     return ret;
index 93b1647761289e8cb38dbfcc1c9645c1e7bb2f2a..3db099f22dedad8d39aaca9110a5a5c42fa572e4 100644 (file)
@@ -583,37 +583,44 @@ njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser)
     njs_token_t        token;
     njs_parser_node_t  *node;
 
-    token = njs_parser_token(parser);
-    if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
-        return token;
-    }
-
     node = njs_parser_node_alloc(vm);
     if (nxt_slow_path(node == NULL)) {
         return NJS_TOKEN_ERROR;
     }
 
     node->token = NJS_TOKEN_RETURN;
+    parser->node = node;
+    parser->code_size += sizeof(njs_vmcode_stop_t);
 
-    token = njs_parser_expression(vm, parser, token);
+    token = njs_lexer_token(parser->lexer);
     if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
         return token;
     }
 
-    if (parser->node->token == NJS_TOKEN_FUNCTION) {
-        /* TODO: test closure */
-    }
+    switch (token) {
 
-    node->right = parser->node;
-    parser->node = node;
+    case NJS_TOKEN_SEMICOLON:
+    case NJS_TOKEN_LINE_END:
+        return njs_parser_token(parser);
 
-    parser->code_size += sizeof(njs_vmcode_stop_t);
+    case NJS_TOKEN_CLOSE_BRACE:
+        return token;
+
+    default:
+        token = njs_parser_expression(vm, parser, token);
+        if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+            return token;
+        }
+
+        if (parser->node->token == NJS_TOKEN_FUNCTION) {
+            /* TODO: test closure */
+        }
+
+        node->right = parser->node;
+        parser->node = node;
 
-    if (token != NJS_TOKEN_SEMICOLON) {
         return token;
     }
-
-    return njs_parser_token(parser);
 }
 
 
index ab955d4cb4feb77b0e243968182237f9c3bcf69e..facd48a56bbbd7a3e2d3f8db89e036de9b4afe78 100644 (file)
@@ -2323,6 +2323,18 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("function f() {} f()"),
       nxt_string("undefined") },
 
+    { nxt_string("function f() {;} f()"),
+      nxt_string("undefined") },
+
+    { nxt_string("function f(){return} f()"),
+      nxt_string("undefined") },
+
+    { nxt_string("function f(){return;} f()"),
+      nxt_string("undefined") },
+
+    { nxt_string("function f(){return\n1} f()"),
+      nxt_string("undefined") },
+
     { nxt_string("function f(a) { return a + 1 } b = f(2)"),
       nxt_string("3") },