From: Igor Sysoev Date: Mon, 7 Dec 2015 08:59:33 +0000 (+0300) Subject: The "return" statement without arguments fixed. X-Git-Tag: 0.1.0~106 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=861c819419b753e9042e65569d6b3243708d153b;p=njs.git The "return" statement without arguments fixed. --- diff --git a/njs/njs_generator.c b/njs/njs_generator.c index 1c232009..27a1c56e 100644 --- a/njs/njs_generator.c +++ b/njs/njs_generator.c @@ -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; diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 93b16477..3db099f2 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -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); } diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index ab955d4c..facd48a5 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") },