Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1555839211 -28800
- # Node ID 63f799045de72192ff08f3d35dcda4825a74a689
- # Parent 8f87e3ef4a4d884b32418836ae5dfeca1f322be0
- Fixed unit tests.
- diff -r 8f87e3ef4a4d -r 63f799045de7 njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Fri Apr 19 17:24:29 2019 +0300
- +++ b/njs/test/njs_unit_test.c Sun Apr 21 17:33:31 2019 +0800
- @@ -12747,7 +12747,7 @@ njs_externals_init(njs_vm_t *vm)
- static nxt_int_t
- njs_unit_test(njs_unit_test_t tests[], size_t num, nxt_bool_t disassemble,
- - nxt_bool_t verbose)
- + nxt_bool_t verbose, nxt_bool_t module)
- {
- u_char *start;
- njs_vm_t *vm, *nvm;
- @@ -12765,11 +12765,13 @@ njs_unit_test(njs_unit_test_t tests[], s
- for (i = 0; i < num; i++) {
- if (verbose) {
- - nxt_printf("\"%V\"\n", &njs_test[i].script);
- + nxt_printf("\"%V\"\n", &tests[i].script);
- }
- nxt_memzero(&options, sizeof(njs_vm_opt_t));
- + options.module = module;
- +
- vm = njs_vm_create(&options);
- if (vm == NULL) {
- nxt_printf("njs_vm_create() failed\n");
- @@ -12781,9 +12783,9 @@ njs_unit_test(njs_unit_test_t tests[], s
- goto done;
- }
- - start = njs_test[i].script.start;
- -
- - ret = njs_vm_compile(vm, &start, start + njs_test[i].script.length);
- + start = tests[i].script.start;
- +
- + ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
- if (ret == NXT_OK) {
- if (disassemble) {
- @@ -12810,7 +12812,7 @@ njs_unit_test(njs_unit_test_t tests[], s
- }
- }
- - success = nxt_strstr_eq(&njs_test[i].ret, &s);
- + success = nxt_strstr_eq(&tests[i].ret, &s);
- if (success) {
- if (nvm != NULL) {
- @@ -12825,7 +12827,7 @@ njs_unit_test(njs_unit_test_t tests[], s
- }
- nxt_printf("njs(\"%V\")\nexpected: \"%V\"\n got: \"%V\"\n",
- - &njs_test[i].script, &njs_test[i].ret, &s);
- + &tests[i].script, &tests[i].ret, &s);
- goto done;
- }
- @@ -12869,7 +12871,7 @@ njs_timezone_optional_test(nxt_bool_t di
- if (memcmp(buf, "+1245", size) == 0) {
- ret = njs_unit_test(njs_tz_test, nxt_nitems(njs_tz_test), disassemble,
- - verbose);
- + verbose, 0);
- if (ret != NXT_OK) {
- return ret;
- }
- @@ -12883,6 +12885,7 @@ njs_timezone_optional_test(nxt_bool_t di
- return NXT_OK;
- }
- +
- static nxt_int_t
- njs_regexp_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
- {
- @@ -12910,7 +12913,7 @@ njs_regexp_optional_test(nxt_bool_t disa
- if (re1 == NULL && re2 != NULL) {
- ret = njs_unit_test(njs_regexp_test, nxt_nitems(njs_regexp_test),
- - disassemble, verbose);
- + disassemble, verbose, 0);
- if (ret != NXT_OK) {
- return ret;
- }
- @@ -13056,8 +13059,6 @@ done:
- }
- -
- -
- static nxt_int_t
- njs_vm_object_alloc_test(njs_vm_t * vm, nxt_bool_t disassemble,
- nxt_bool_t verbose)
- @@ -13269,7 +13270,8 @@ main(int argc, char **argv)
- (void) putenv((char *) "TZ=UTC");
- tzset();
- - ret = njs_unit_test(njs_test, nxt_nitems(njs_test), disassemble, verbose);
- + ret = njs_unit_test(njs_test, nxt_nitems(njs_test),
- + disassemble, verbose, 0);
- if (ret != NXT_OK) {
- return ret;
- }
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1555839385 -28800
- # Node ID cc633dc472092279be535d7b6a4ae0725fa6dec7
- # Parent 63f799045de72192ff08f3d35dcda4825a74a689
- Restricted function declaration to top level or inside a block.
- diff -r 63f799045de7 -r cc633dc47209 njs/njs_parser.c
- --- a/njs/njs_parser.c Sun Apr 21 17:33:31 2019 +0800
- +++ b/njs/njs_parser.c Sun Apr 21 17:36:25 2019 +0800
- @@ -492,6 +492,12 @@ njs_parser_block(njs_vm_t *vm, njs_parse
- {
- 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;
- diff -r 63f799045de7 -r cc633dc47209 njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Sun Apr 21 17:33:31 2019 +0800
- +++ b/njs/test/njs_unit_test.c Sun Apr 21 17:36:25 2019 +0800
- @@ -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") },
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1555841518 -28800
- # Node ID a40cfd4e03ce07a796b54cd8658c99ff6d1d6d5d
- # Parent cc633dc472092279be535d7b6a4ae0725fa6dec7
- Added block scoped function definitions support.
- diff -r cc633dc47209 -r a40cfd4e03ce njs/njs_parser.c
- --- a/njs/njs_parser.c Sun Apr 21 17:36:25 2019 +0800
- +++ b/njs/njs_parser.c Sun Apr 21 18:11:58 2019 +0800
- @@ -203,6 +203,7 @@ njs_parser_scope_begin(njs_vm_t *vm, njs
- } else {
- if (type == NJS_SCOPE_GLOBAL) {
- type += NJS_INDEX_GLOBAL_OFFSET;
- + scope->module = vm->options.module;
- }
- scope->next_index[0] = type;
- diff -r cc633dc47209 -r a40cfd4e03ce njs/njs_variable.c
- --- a/njs/njs_variable.c Sun Apr 21 17:36:25 2019 +0800
- +++ b/njs/njs_variable.c Sun Apr 21 18:11:58 2019 +0800
- @@ -9,6 +9,9 @@
- #include <string.h>
- +static njs_variable_t *njs_variable_scope_add(njs_vm_t *vm,
- + njs_parser_scope_t *scope, nxt_lvlhsh_query_t *lhq,
- + njs_variable_type_t type);
- static njs_ret_t njs_variable_reference_resolve(njs_vm_t *vm,
- njs_variable_reference_t *vr, njs_parser_scope_t *node_scope);
- static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name,
- @@ -45,7 +48,6 @@ njs_variable_t *
- njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
- uint32_t hash, njs_variable_type_t type)
- {
- - nxt_int_t ret;
- njs_variable_t *var;
- nxt_lvlhsh_query_t lhq;
- @@ -53,36 +55,68 @@ njs_variable_add(njs_vm_t *vm, njs_parse
- lhq.key = *name;
- lhq.proto = &njs_variables_hash_proto;
- - if (type >= NJS_VARIABLE_VAR) {
- - /*
- - * A "var" and "function" declarations are
- - * stored in function or global scope.
- - */
- - while (scope->type == NJS_SCOPE_BLOCK) {
- - scope = scope->parent;
- - }
- + var = njs_variable_scope_add(vm, scope, &lhq, type);
- + if (nxt_slow_path(var == NULL)) {
- + return NULL;
- }
- - if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
- - var = lhq.value;
- + if (type == NJS_VARIABLE_VAR && scope->type == NJS_SCOPE_BLOCK) {
- + /* A "var" declaration is stored in function or global scope. */
- + do {
- + scope = scope->parent;
- - if (type == NJS_VARIABLE_FUNCTION) {
- - var->type = type;
- + var = njs_variable_scope_add(vm, scope, &lhq, type);
- + if (nxt_slow_path(var == NULL)) {
- + return NULL;
- + }
- +
- + } while (scope->type == NJS_SCOPE_BLOCK);
- + }
- +
- + if (type == NJS_VARIABLE_FUNCTION) {
- + var->type = type;
- + }
- +
- + return var;
- +}
- +
- +
- +static njs_variable_t *
- +njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope,
- + nxt_lvlhsh_query_t *lhq, njs_variable_type_t type)
- +{
- + nxt_int_t ret;
- + njs_variable_t *var;
- +
- + if (nxt_lvlhsh_find(&scope->variables, lhq) == NXT_OK) {
- + var = lhq->value;
- +
- + if (!scope->module && scope->type != NJS_SCOPE_BLOCK) {
- + return var;
- + }
- +
- + if (type == NJS_VARIABLE_FUNCTION
- + || var->type == NJS_VARIABLE_FUNCTION)
- + {
- + njs_parser_syntax_error(vm, vm->parser,
- + "\"%V\" has already been declared",
- + &lhq->key);
- + return NULL;
- }
- return var;
- }
- - var = njs_variable_alloc(vm, &lhq.key, type);
- + var = njs_variable_alloc(vm, &lhq->key, type);
- if (nxt_slow_path(var == NULL)) {
- - return var;
- + return NULL;
- }
- - lhq.replace = 0;
- - lhq.value = var;
- - lhq.pool = vm->mem_pool;
- + lhq->replace = 0;
- + lhq->value = var;
- + lhq->pool = vm->mem_pool;
- - ret = nxt_lvlhsh_insert(&scope->variables, &lhq);
- + ret = nxt_lvlhsh_insert(&scope->variables, lhq);
- if (nxt_fast_path(ret == NXT_OK)) {
- return var;
- @@ -459,6 +493,13 @@ njs_variable_reference_resolve(njs_vm_t
- if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
- vr->variable = lhq.value;
- + if (scope->type == NJS_SCOPE_BLOCK
- + && vr->variable->type == NJS_VARIABLE_VAR)
- + {
- + scope = scope->parent;
- + continue;
- + }
- +
- if (scope->type == NJS_SCOPE_SHIM) {
- scope = previous;
- diff -r cc633dc47209 -r a40cfd4e03ce njs/test/module/declaration_exception.js
- --- /dev/null Thu Jan 01 00:00:00 1970 +0000
- +++ b/njs/test/module/declaration_exception.js Sun Apr 21 18:11:58 2019 +0800
- @@ -0,0 +1,10 @@
- +
- +function f() {
- + return 1;
- +}
- +
- +function f() {
- + return 2;
- +}
- +
- +export default f;
- diff -r cc633dc47209 -r a40cfd4e03ce njs/test/njs_expect_test.exp
- --- a/njs/test/njs_expect_test.exp Sun Apr 21 17:36:25 2019 +0800
- +++ b/njs/test/njs_expect_test.exp Sun Apr 21 18:11:58 2019 +0800
- @@ -699,6 +699,8 @@ njs_test {
- "undefined\r\n"}
- {"import ref from 'ref_exception.js'\r\n"
- "ReferenceError: \"undeclared\" is not defined in ref_exception.js:1"}
- + {"import m from 'declaration_exception.js'\r\n"
- + "SyntaxError: \"f\" has already been declared in declaration_exception.js:6"}
- {"import m from 'loading_exception.js'\r\n"
- "Error: loading exception\r\n at module \\(loading_exception.js:1\\)"}
- {"import lib3 from 'lib1.js'\r\n"
- diff -r cc633dc47209 -r a40cfd4e03ce njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Sun Apr 21 17:36:25 2019 +0800
- +++ b/njs/test/njs_unit_test.c Sun Apr 21 18:11:58 2019 +0800
- @@ -5746,6 +5746,21 @@ static njs_unit_test_t njs_test[] =
- { 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 1; } { function f() { return 2; } } f()"),
- + nxt_string("1") },
- +
- + { nxt_string("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
- + nxt_string("1") },
- +
- + { nxt_string("{ var f; function f() {} }"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("{ function f() {} var f; }"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("{ function f() {} { var f }}"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- { nxt_string("function f() { return f() } f()"),
- nxt_string("RangeError: Maximum call stack size exceeded") },
- @@ -12002,6 +12017,25 @@ static njs_unit_test_t njs_test[] =
- };
- +static njs_unit_test_t njs_module_test[] =
- +{
- + { nxt_string("function f(){return 2}; var f; f()"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("function f(){return 2}; var f = 1; f()"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("var f = 1; function f() {};"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +
- + { nxt_string("{ var f = 1; } function f() {};"),
- + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
- +};
- +
- +
- static njs_unit_test_t njs_tz_test[] =
- {
- { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
- @@ -12870,6 +12904,23 @@ done:
- static nxt_int_t
- +njs_module_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
- +{
- + nxt_int_t ret;
- +
- + ret = njs_unit_test(njs_module_test, nxt_nitems(njs_module_test),
- + disassemble, verbose, 1);
- + if (ret != NXT_OK) {
- + return ret;
- + }
- +
- + nxt_printf("njs module tests passed\n");
- +
- + return NXT_OK;
- +}
- +
- +
- +static nxt_int_t
- njs_timezone_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
- {
- size_t size;
- @@ -13297,6 +13348,11 @@ main(int argc, char **argv)
- return ret;
- }
- + ret = njs_module_optional_test(disassemble, verbose);
- + if (ret != NXT_OK) {
- + return ret;
- + }
- +
- ret = njs_timezone_optional_test(disassemble, verbose);
- if (ret != NXT_OK) {
- return ret;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement