Advertisement
Guest User

Untitled

a guest
May 1st, 2019
676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.63 KB | None | 0 0
  1. # HG changeset patch
  2. # User hongzhidao <hongzhidao@gmail.com>
  3. # Date 1555839211 -28800
  4. # Node ID 63f799045de72192ff08f3d35dcda4825a74a689
  5. # Parent 8f87e3ef4a4d884b32418836ae5dfeca1f322be0
  6. Fixed unit tests.
  7.  
  8. diff -r 8f87e3ef4a4d -r 63f799045de7 njs/test/njs_unit_test.c
  9. --- a/njs/test/njs_unit_test.c Fri Apr 19 17:24:29 2019 +0300
  10. +++ b/njs/test/njs_unit_test.c Sun Apr 21 17:33:31 2019 +0800
  11. @@ -12747,7 +12747,7 @@ njs_externals_init(njs_vm_t *vm)
  12.  
  13. static nxt_int_t
  14. njs_unit_test(njs_unit_test_t tests[], size_t num, nxt_bool_t disassemble,
  15. - nxt_bool_t verbose)
  16. + nxt_bool_t verbose, nxt_bool_t module)
  17. {
  18. u_char *start;
  19. njs_vm_t *vm, *nvm;
  20. @@ -12765,11 +12765,13 @@ njs_unit_test(njs_unit_test_t tests[], s
  21. for (i = 0; i < num; i++) {
  22.  
  23. if (verbose) {
  24. - nxt_printf("\"%V\"\n", &njs_test[i].script);
  25. + nxt_printf("\"%V\"\n", &tests[i].script);
  26. }
  27.  
  28. nxt_memzero(&options, sizeof(njs_vm_opt_t));
  29.  
  30. + options.module = module;
  31. +
  32. vm = njs_vm_create(&options);
  33. if (vm == NULL) {
  34. nxt_printf("njs_vm_create() failed\n");
  35. @@ -12781,9 +12783,9 @@ njs_unit_test(njs_unit_test_t tests[], s
  36. goto done;
  37. }
  38.  
  39. - start = njs_test[i].script.start;
  40. -
  41. - ret = njs_vm_compile(vm, &start, start + njs_test[i].script.length);
  42. + start = tests[i].script.start;
  43. +
  44. + ret = njs_vm_compile(vm, &start, start + tests[i].script.length);
  45.  
  46. if (ret == NXT_OK) {
  47. if (disassemble) {
  48. @@ -12810,7 +12812,7 @@ njs_unit_test(njs_unit_test_t tests[], s
  49. }
  50. }
  51.  
  52. - success = nxt_strstr_eq(&njs_test[i].ret, &s);
  53. + success = nxt_strstr_eq(&tests[i].ret, &s);
  54.  
  55. if (success) {
  56. if (nvm != NULL) {
  57. @@ -12825,7 +12827,7 @@ njs_unit_test(njs_unit_test_t tests[], s
  58. }
  59.  
  60. nxt_printf("njs(\"%V\")\nexpected: \"%V\"\n got: \"%V\"\n",
  61. - &njs_test[i].script, &njs_test[i].ret, &s);
  62. + &tests[i].script, &tests[i].ret, &s);
  63.  
  64. goto done;
  65. }
  66. @@ -12869,7 +12871,7 @@ njs_timezone_optional_test(nxt_bool_t di
  67.  
  68. if (memcmp(buf, "+1245", size) == 0) {
  69. ret = njs_unit_test(njs_tz_test, nxt_nitems(njs_tz_test), disassemble,
  70. - verbose);
  71. + verbose, 0);
  72. if (ret != NXT_OK) {
  73. return ret;
  74. }
  75. @@ -12883,6 +12885,7 @@ njs_timezone_optional_test(nxt_bool_t di
  76. return NXT_OK;
  77. }
  78.  
  79. +
  80. static nxt_int_t
  81. njs_regexp_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
  82. {
  83. @@ -12910,7 +12913,7 @@ njs_regexp_optional_test(nxt_bool_t disa
  84.  
  85. if (re1 == NULL && re2 != NULL) {
  86. ret = njs_unit_test(njs_regexp_test, nxt_nitems(njs_regexp_test),
  87. - disassemble, verbose);
  88. + disassemble, verbose, 0);
  89. if (ret != NXT_OK) {
  90. return ret;
  91. }
  92. @@ -13056,8 +13059,6 @@ done:
  93. }
  94.  
  95.  
  96. -
  97. -
  98. static nxt_int_t
  99. njs_vm_object_alloc_test(njs_vm_t * vm, nxt_bool_t disassemble,
  100. nxt_bool_t verbose)
  101. @@ -13269,7 +13270,8 @@ main(int argc, char **argv)
  102. (void) putenv((char *) "TZ=UTC");
  103. tzset();
  104.  
  105. - ret = njs_unit_test(njs_test, nxt_nitems(njs_test), disassemble, verbose);
  106. + ret = njs_unit_test(njs_test, nxt_nitems(njs_test),
  107. + disassemble, verbose, 0);
  108. if (ret != NXT_OK) {
  109. return ret;
  110. }
  111. # HG changeset patch
  112. # User hongzhidao <hongzhidao@gmail.com>
  113. # Date 1555839385 -28800
  114. # Node ID cc633dc472092279be535d7b6a4ae0725fa6dec7
  115. # Parent 63f799045de72192ff08f3d35dcda4825a74a689
  116. Restricted function declaration to top level or inside a block.
  117.  
  118. diff -r 63f799045de7 -r cc633dc47209 njs/njs_parser.c
  119. --- a/njs/njs_parser.c Sun Apr 21 17:33:31 2019 +0800
  120. +++ b/njs/njs_parser.c Sun Apr 21 17:36:25 2019 +0800
  121. @@ -492,6 +492,12 @@ njs_parser_block(njs_vm_t *vm, njs_parse
  122. {
  123. njs_parser_node_t *node;
  124.  
  125. + if (token == NJS_TOKEN_FUNCTION) {
  126. + njs_parser_syntax_error(vm, parser,
  127. + "Functions can only be declared at top level or inside a block");
  128. + return NJS_TOKEN_ILLEGAL;
  129. + }
  130. +
  131. token = njs_parser_statement(vm, parser, token);
  132. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  133. return token;
  134. diff -r 63f799045de7 -r cc633dc47209 njs/test/njs_unit_test.c
  135. --- a/njs/test/njs_unit_test.c Sun Apr 21 17:33:31 2019 +0800
  136. +++ b/njs/test/njs_unit_test.c Sun Apr 21 17:36:25 2019 +0800
  137. @@ -5725,6 +5725,27 @@ static njs_unit_test_t njs_test[] =
  138. { nxt_string("\n{\nreturn;\n}"),
  139. nxt_string("SyntaxError: Illegal return statement in 3") },
  140.  
  141. + { nxt_string("if (1) function f(){}"),
  142. + nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
  143. +
  144. + { nxt_string("if (1) { function f(){}}"),
  145. + nxt_string("undefined") },
  146. +
  147. + { nxt_string("while (1) function f() { }"),
  148. + nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
  149. +
  150. + { nxt_string("while (1) { break; function f(){}}"),
  151. + nxt_string("undefined") },
  152. +
  153. + { nxt_string("for (;;) function f() { }"),
  154. + nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
  155. +
  156. + { nxt_string("for (;;) { break; function f(){}}"),
  157. + nxt_string("undefined") },
  158. +
  159. + { nxt_string("do function f() { } while (0)"),
  160. + nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
  161. +
  162. { nxt_string("function f() { return f() } f()"),
  163. nxt_string("RangeError: Maximum call stack size exceeded") },
  164.  
  165. # HG changeset patch
  166. # User hongzhidao <hongzhidao@gmail.com>
  167. # Date 1555841518 -28800
  168. # Node ID a40cfd4e03ce07a796b54cd8658c99ff6d1d6d5d
  169. # Parent cc633dc472092279be535d7b6a4ae0725fa6dec7
  170. Added block scoped function definitions support.
  171.  
  172. diff -r cc633dc47209 -r a40cfd4e03ce njs/njs_parser.c
  173. --- a/njs/njs_parser.c Sun Apr 21 17:36:25 2019 +0800
  174. +++ b/njs/njs_parser.c Sun Apr 21 18:11:58 2019 +0800
  175. @@ -203,6 +203,7 @@ njs_parser_scope_begin(njs_vm_t *vm, njs
  176. } else {
  177. if (type == NJS_SCOPE_GLOBAL) {
  178. type += NJS_INDEX_GLOBAL_OFFSET;
  179. + scope->module = vm->options.module;
  180. }
  181.  
  182. scope->next_index[0] = type;
  183. diff -r cc633dc47209 -r a40cfd4e03ce njs/njs_variable.c
  184. --- a/njs/njs_variable.c Sun Apr 21 17:36:25 2019 +0800
  185. +++ b/njs/njs_variable.c Sun Apr 21 18:11:58 2019 +0800
  186. @@ -9,6 +9,9 @@
  187. #include <string.h>
  188.  
  189.  
  190. +static njs_variable_t *njs_variable_scope_add(njs_vm_t *vm,
  191. + njs_parser_scope_t *scope, nxt_lvlhsh_query_t *lhq,
  192. + njs_variable_type_t type);
  193. static njs_ret_t njs_variable_reference_resolve(njs_vm_t *vm,
  194. njs_variable_reference_t *vr, njs_parser_scope_t *node_scope);
  195. static njs_variable_t *njs_variable_alloc(njs_vm_t *vm, nxt_str_t *name,
  196. @@ -45,7 +48,6 @@ njs_variable_t *
  197. njs_variable_add(njs_vm_t *vm, njs_parser_scope_t *scope, nxt_str_t *name,
  198. uint32_t hash, njs_variable_type_t type)
  199. {
  200. - nxt_int_t ret;
  201. njs_variable_t *var;
  202. nxt_lvlhsh_query_t lhq;
  203.  
  204. @@ -53,36 +55,68 @@ njs_variable_add(njs_vm_t *vm, njs_parse
  205. lhq.key = *name;
  206. lhq.proto = &njs_variables_hash_proto;
  207.  
  208. - if (type >= NJS_VARIABLE_VAR) {
  209. - /*
  210. - * A "var" and "function" declarations are
  211. - * stored in function or global scope.
  212. - */
  213. - while (scope->type == NJS_SCOPE_BLOCK) {
  214. - scope = scope->parent;
  215. - }
  216. + var = njs_variable_scope_add(vm, scope, &lhq, type);
  217. + if (nxt_slow_path(var == NULL)) {
  218. + return NULL;
  219. }
  220.  
  221. - if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
  222. - var = lhq.value;
  223. + if (type == NJS_VARIABLE_VAR && scope->type == NJS_SCOPE_BLOCK) {
  224. + /* A "var" declaration is stored in function or global scope. */
  225. + do {
  226. + scope = scope->parent;
  227.  
  228. - if (type == NJS_VARIABLE_FUNCTION) {
  229. - var->type = type;
  230. + var = njs_variable_scope_add(vm, scope, &lhq, type);
  231. + if (nxt_slow_path(var == NULL)) {
  232. + return NULL;
  233. + }
  234. +
  235. + } while (scope->type == NJS_SCOPE_BLOCK);
  236. + }
  237. +
  238. + if (type == NJS_VARIABLE_FUNCTION) {
  239. + var->type = type;
  240. + }
  241. +
  242. + return var;
  243. +}
  244. +
  245. +
  246. +static njs_variable_t *
  247. +njs_variable_scope_add(njs_vm_t *vm, njs_parser_scope_t *scope,
  248. + nxt_lvlhsh_query_t *lhq, njs_variable_type_t type)
  249. +{
  250. + nxt_int_t ret;
  251. + njs_variable_t *var;
  252. +
  253. + if (nxt_lvlhsh_find(&scope->variables, lhq) == NXT_OK) {
  254. + var = lhq->value;
  255. +
  256. + if (!scope->module && scope->type != NJS_SCOPE_BLOCK) {
  257. + return var;
  258. + }
  259. +
  260. + if (type == NJS_VARIABLE_FUNCTION
  261. + || var->type == NJS_VARIABLE_FUNCTION)
  262. + {
  263. + njs_parser_syntax_error(vm, vm->parser,
  264. + "\"%V\" has already been declared",
  265. + &lhq->key);
  266. + return NULL;
  267. }
  268.  
  269. return var;
  270. }
  271.  
  272. - var = njs_variable_alloc(vm, &lhq.key, type);
  273. + var = njs_variable_alloc(vm, &lhq->key, type);
  274. if (nxt_slow_path(var == NULL)) {
  275. - return var;
  276. + return NULL;
  277. }
  278.  
  279. - lhq.replace = 0;
  280. - lhq.value = var;
  281. - lhq.pool = vm->mem_pool;
  282. + lhq->replace = 0;
  283. + lhq->value = var;
  284. + lhq->pool = vm->mem_pool;
  285.  
  286. - ret = nxt_lvlhsh_insert(&scope->variables, &lhq);
  287. + ret = nxt_lvlhsh_insert(&scope->variables, lhq);
  288.  
  289. if (nxt_fast_path(ret == NXT_OK)) {
  290. return var;
  291. @@ -459,6 +493,13 @@ njs_variable_reference_resolve(njs_vm_t
  292. if (nxt_lvlhsh_find(&scope->variables, &lhq) == NXT_OK) {
  293. vr->variable = lhq.value;
  294.  
  295. + if (scope->type == NJS_SCOPE_BLOCK
  296. + && vr->variable->type == NJS_VARIABLE_VAR)
  297. + {
  298. + scope = scope->parent;
  299. + continue;
  300. + }
  301. +
  302. if (scope->type == NJS_SCOPE_SHIM) {
  303. scope = previous;
  304.  
  305. diff -r cc633dc47209 -r a40cfd4e03ce njs/test/module/declaration_exception.js
  306. --- /dev/null Thu Jan 01 00:00:00 1970 +0000
  307. +++ b/njs/test/module/declaration_exception.js Sun Apr 21 18:11:58 2019 +0800
  308. @@ -0,0 +1,10 @@
  309. +
  310. +function f() {
  311. + return 1;
  312. +}
  313. +
  314. +function f() {
  315. + return 2;
  316. +}
  317. +
  318. +export default f;
  319. diff -r cc633dc47209 -r a40cfd4e03ce njs/test/njs_expect_test.exp
  320. --- a/njs/test/njs_expect_test.exp Sun Apr 21 17:36:25 2019 +0800
  321. +++ b/njs/test/njs_expect_test.exp Sun Apr 21 18:11:58 2019 +0800
  322. @@ -699,6 +699,8 @@ njs_test {
  323. "undefined\r\n"}
  324. {"import ref from 'ref_exception.js'\r\n"
  325. "ReferenceError: \"undeclared\" is not defined in ref_exception.js:1"}
  326. + {"import m from 'declaration_exception.js'\r\n"
  327. + "SyntaxError: \"f\" has already been declared in declaration_exception.js:6"}
  328. {"import m from 'loading_exception.js'\r\n"
  329. "Error: loading exception\r\n at module \\(loading_exception.js:1\\)"}
  330. {"import lib3 from 'lib1.js'\r\n"
  331. diff -r cc633dc47209 -r a40cfd4e03ce njs/test/njs_unit_test.c
  332. --- a/njs/test/njs_unit_test.c Sun Apr 21 17:36:25 2019 +0800
  333. +++ b/njs/test/njs_unit_test.c Sun Apr 21 18:11:58 2019 +0800
  334. @@ -5746,6 +5746,21 @@ static njs_unit_test_t njs_test[] =
  335. { nxt_string("do function f() { } while (0)"),
  336. nxt_string("SyntaxError: Functions can only be declared at top level or inside a block in 1") },
  337.  
  338. + { nxt_string("function f() { return 1; } { function f() { return 2; } } f()"),
  339. + nxt_string("1") },
  340. +
  341. + { nxt_string("function f() { return 1; } { function f() { return 2; } { function f() { return 3; } }} f()"),
  342. + nxt_string("1") },
  343. +
  344. + { nxt_string("{ var f; function f() {} }"),
  345. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  346. +
  347. + { nxt_string("{ function f() {} var f; }"),
  348. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  349. +
  350. + { nxt_string("{ function f() {} { var f }}"),
  351. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  352. +
  353. { nxt_string("function f() { return f() } f()"),
  354. nxt_string("RangeError: Maximum call stack size exceeded") },
  355.  
  356. @@ -12002,6 +12017,25 @@ static njs_unit_test_t njs_test[] =
  357. };
  358.  
  359.  
  360. +static njs_unit_test_t njs_module_test[] =
  361. +{
  362. + { nxt_string("function f(){return 2}; var f; f()"),
  363. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  364. +
  365. + { nxt_string("function f(){return 2}; var f = 1; f()"),
  366. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  367. +
  368. + { nxt_string("function f(){return 1}; function f(){return 2}; f()"),
  369. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  370. +
  371. + { nxt_string("var f = 1; function f() {};"),
  372. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  373. +
  374. + { nxt_string("{ var f = 1; } function f() {};"),
  375. + nxt_string("SyntaxError: \"f\" has already been declared in 1") },
  376. +};
  377. +
  378. +
  379. static njs_unit_test_t njs_tz_test[] =
  380. {
  381. { nxt_string("var d = new Date(1); d = d + ''; d.slice(0, 33)"),
  382. @@ -12870,6 +12904,23 @@ done:
  383.  
  384.  
  385. static nxt_int_t
  386. +njs_module_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
  387. +{
  388. + nxt_int_t ret;
  389. +
  390. + ret = njs_unit_test(njs_module_test, nxt_nitems(njs_module_test),
  391. + disassemble, verbose, 1);
  392. + if (ret != NXT_OK) {
  393. + return ret;
  394. + }
  395. +
  396. + nxt_printf("njs module tests passed\n");
  397. +
  398. + return NXT_OK;
  399. +}
  400. +
  401. +
  402. +static nxt_int_t
  403. njs_timezone_optional_test(nxt_bool_t disassemble, nxt_bool_t verbose)
  404. {
  405. size_t size;
  406. @@ -13297,6 +13348,11 @@ main(int argc, char **argv)
  407. return ret;
  408. }
  409.  
  410. + ret = njs_module_optional_test(disassemble, verbose);
  411. + if (ret != NXT_OK) {
  412. + return ret;
  413. + }
  414. +
  415. ret = njs_timezone_optional_test(disassemble, verbose);
  416. if (ret != NXT_OK) {
  417. return ret;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement