Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.99 KB | None | 0 0
  1. # HG changeset patch
  2. # User hongzhidao <hongzhidao@gmail.com>
  3. # Date 1555088854 -28800
  4. # Node ID 366a094ef6b2f856456be6c6ca50daed259711b1
  5. # Parent d7a0eb59a7e748558bdcb0b8fa05a6a466df41b6
  6. Making njs_parser_node_t more generic.
  7.  
  8. diff -r d7a0eb59a7e7 -r 366a094ef6b2 njs/njs_generator.c
  9. --- a/njs/njs_generator.c Sun Apr 07 14:26:13 2019 +0800
  10. +++ b/njs/njs_generator.c Sat Apr 13 01:07:34 2019 +0800
  11. @@ -847,7 +847,7 @@ njs_generate_switch_statement(njs_vm_t *
  12. }
  13.  
  14. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_SWITCH,
  15. - &swtch->label);
  16. + &swtch->name);
  17. if (nxt_slow_path(ret != NXT_OK)) {
  18. return ret;
  19. }
  20. @@ -966,7 +966,7 @@ njs_generate_while_statement(njs_vm_t *v
  21. /* The loop body. */
  22.  
  23. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
  24. - &node->label);
  25. + &node->name);
  26. if (nxt_slow_path(ret != NXT_OK)) {
  27. return ret;
  28. }
  29. @@ -1014,7 +1014,7 @@ njs_generate_do_while_statement(njs_vm_t
  30. /* The loop body. */
  31.  
  32. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
  33. - &node->label);
  34. + &node->name);
  35. if (nxt_slow_path(ret != NXT_OK)) {
  36. return ret;
  37. }
  38. @@ -1059,7 +1059,7 @@ njs_generate_for_statement(njs_vm_t *vm,
  39. njs_vmcode_cond_jump_t *cond_jump;
  40.  
  41. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
  42. - &node->label);
  43. + &node->name);
  44. if (nxt_slow_path(ret != NXT_OK)) {
  45. return ret;
  46. }
  47. @@ -1162,7 +1162,7 @@ njs_generate_for_in_statement(njs_vm_t *
  48. njs_vmcode_prop_foreach_t *prop_foreach;
  49.  
  50. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_LOOP,
  51. - &node->label);
  52. + &node->name);
  53. if (nxt_slow_path(ret != NXT_OK)) {
  54. return ret;
  55. }
  56. @@ -1441,7 +1441,7 @@ njs_generate_continue_statement(njs_vm_t
  57. njs_generator_patch_t *patch;
  58. njs_generator_block_t *block;
  59.  
  60. - label = &node->label;
  61. + label = &node->name;
  62.  
  63. block = njs_generate_find_block(generator->block, NJS_GENERATOR_LOOP,
  64. label);
  65. @@ -1489,7 +1489,7 @@ njs_generate_break_statement(njs_vm_t *v
  66. njs_generator_patch_t *patch;
  67. njs_generator_block_t *block;
  68.  
  69. - label = &node->label;
  70. + label = &node->name;
  71.  
  72. block = njs_generate_find_block(generator->block, NJS_GENERATOR_ALL, label);
  73. if (nxt_slow_path(block == NULL)) {
  74. @@ -1548,7 +1548,7 @@ njs_generate_block_statement(njs_vm_t *v
  75. nxt_int_t ret;
  76.  
  77. ret = njs_generate_start_block(vm, generator, NJS_GENERATOR_BLOCK,
  78. - &node->label);
  79. + &node->name);
  80. if (nxt_slow_path(ret != NXT_OK)) {
  81. return ret;
  82. }
  83. diff -r d7a0eb59a7e7 -r 366a094ef6b2 njs/njs_parser.c
  84. --- a/njs/njs_parser.c Sun Apr 07 14:26:13 2019 +0800
  85. +++ b/njs/njs_parser.c Sat Apr 13 01:07:34 2019 +0800
  86. @@ -559,7 +559,7 @@ njs_parser_labelled_statement(njs_vm_t *
  87. if (parser->node != NULL) {
  88. /* The statement is not empty block or just semicolon. */
  89.  
  90. - ret = njs_name_copy(vm, &parser->node->label, &name);
  91. + ret = njs_name_copy(vm, &parser->node->name, &name);
  92. if (nxt_slow_path(ret != NXT_OK)) {
  93. return NJS_TOKEN_ERROR;
  94. }
  95. @@ -1584,7 +1584,7 @@ njs_parser_brk_statement(njs_vm_t *vm, n
  96. return NJS_TOKEN_ILLEGAL;
  97. }
  98.  
  99. - ret = njs_name_copy(vm, &parser->node->label, &name);
  100. + ret = njs_name_copy(vm, &parser->node->name, &name);
  101. if (nxt_slow_path(ret != NXT_OK)) {
  102. return NJS_TOKEN_ERROR;
  103. }
  104. diff -r d7a0eb59a7e7 -r 366a094ef6b2 njs/njs_parser.h
  105. --- a/njs/njs_parser.h Sun Apr 07 14:26:13 2019 +0800
  106. +++ b/njs/njs_parser.h Sat Apr 13 01:07:34 2019 +0800
  107. @@ -50,7 +50,7 @@ struct njs_parser_node_s {
  108. njs_parser_node_t *object;
  109. } u;
  110.  
  111. - nxt_str_t label;
  112. + nxt_str_t name;
  113.  
  114. njs_index_t index;
  115.  
  116. # HG changeset patch
  117. # User hongzhidao <hongzhidao@gmail.com>
  118. # Date 1555089109 -28800
  119. # Node ID 4f81c1cfc677c9f457c5fca5797034a35230623b
  120. # Parent 366a094ef6b2f856456be6c6ca50daed259711b1
  121. Making parser hoist more generic.
  122.  
  123. diff -r 366a094ef6b2 -r 4f81c1cfc677 njs/njs_parser.c
  124. --- a/njs/njs_parser.c Sat Apr 13 01:07:34 2019 +0800
  125. +++ b/njs/njs_parser.c Sat Apr 13 01:11:49 2019 +0800
  126. @@ -13,7 +13,7 @@ static njs_ret_t njs_parser_scope_begin(
  127. njs_scope_t type);
  128. static void njs_parser_scope_end(njs_vm_t *vm, njs_parser_t *parser);
  129. static njs_token_t njs_parser_statement_chain(njs_vm_t *vm,
  130. - njs_parser_t *parser, njs_token_t token, njs_parser_node_t **dest);
  131. + njs_parser_t *parser, njs_token_t token, nxt_bool_t top);
  132. static njs_token_t njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser,
  133. njs_token_t token);
  134. static njs_token_t njs_parser_block_statement(njs_vm_t *vm,
  135. @@ -61,8 +61,6 @@ static njs_token_t njs_parser_import_sta
  136. njs_parser_t *parser);
  137. static njs_token_t njs_parser_export_statement(njs_vm_t *vm,
  138. njs_parser_t *parser);
  139. -static nxt_int_t njs_parser_import_hoist(njs_vm_t *vm, njs_parser_t *parser,
  140. - njs_parser_node_t *new_node);
  141. static nxt_int_t njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser);
  142. static njs_token_t njs_parser_grouping_expression(njs_vm_t *vm,
  143. njs_parser_t *parser);
  144. @@ -130,8 +128,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *p
  145.  
  146. while (token != NJS_TOKEN_END) {
  147.  
  148. - token = njs_parser_statement_chain(vm, parser, token,
  149. - &njs_parser_chain_top(parser));
  150. + token = njs_parser_statement_chain(vm, parser, token, 1);
  151. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  152. return NXT_ERROR;
  153. }
  154. @@ -271,35 +268,58 @@ njs_parser_scope_end(njs_vm_t *vm, njs_p
  155.  
  156. static njs_token_t
  157. njs_parser_statement_chain(njs_vm_t *vm, njs_parser_t *parser,
  158. - njs_token_t token, njs_parser_node_t **dest)
  159. + njs_token_t token, nxt_bool_t top)
  160. {
  161. - njs_parser_node_t *node, *last;
  162. -
  163. - last = *dest;
  164. + njs_parser_node_t *stmt, *last, *node, *new_node, **child;
  165. +
  166. + child = top ? &njs_parser_chain_top(parser)
  167. + : &njs_parser_chain_current(parser);
  168. +
  169. + last = *child;
  170.  
  171. token = njs_parser_statement(vm, parser, token);
  172. -
  173. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  174. return njs_parser_unexpected_token(vm, parser, token);
  175. }
  176.  
  177. - if (parser->node != NULL) {
  178. - /* The statement is not empty block or just semicolon. */
  179. -
  180. - node = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
  181. - if (nxt_slow_path(node == NULL)) {
  182. - return NJS_TOKEN_ERROR;
  183. - }
  184. -
  185. - node->left = last;
  186. - node->right = parser->node;
  187. - *dest = node;
  188. -
  189. - while (token == NJS_TOKEN_SEMICOLON) {
  190. - token = njs_parser_token(vm, parser);
  191. - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  192. + if (parser->node == NULL) {
  193. + /* The statement is empty block or just semicolon. */
  194. + return token;
  195. + }
  196. +
  197. + new_node = parser->node;
  198. +
  199. + if (new_node->hoist) {
  200. + child = &njs_parser_chain_top(parser);
  201. +
  202. + while (*child != NULL) {
  203. + node = *child;
  204. +
  205. + if (node->hoist) {
  206. break;
  207. }
  208. +
  209. + child = &node->left;
  210. + }
  211. +
  212. + last = *child;
  213. + }
  214. +
  215. + stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
  216. + if (nxt_slow_path(stmt == NULL)) {
  217. + return NJS_TOKEN_ERROR;
  218. + }
  219. +
  220. + stmt->hoist = new_node->hoist;
  221. + stmt->left = last;
  222. + stmt->right = new_node;
  223. +
  224. + *child = stmt;
  225. +
  226. + while (token == NJS_TOKEN_SEMICOLON) {
  227. + token = njs_parser_token(vm, parser);
  228. + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  229. + break;
  230. }
  231. }
  232.  
  233. @@ -442,8 +462,7 @@ njs_parser_block_statement(njs_vm_t *vm,
  234. parser->node = NULL;
  235.  
  236. while (token != NJS_TOKEN_CLOSE_BRACE) {
  237. - token = njs_parser_statement_chain(vm, parser, token,
  238. - &njs_parser_chain_current(parser));
  239. + token = njs_parser_statement_chain(vm, parser, token, 0);
  240. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  241. return token;
  242. }
  243. @@ -940,8 +959,7 @@ njs_parser_lambda_statements(njs_vm_t *v
  244. parser->node = NULL;
  245.  
  246. while (token != NJS_TOKEN_CLOSE_BRACE) {
  247. - token = njs_parser_statement_chain(vm, parser, token,
  248. - &njs_parser_chain_top(parser));
  249. + token = njs_parser_statement_chain(vm, parser, token, 1);
  250. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  251. return token;
  252. }
  253. @@ -1253,8 +1271,7 @@ njs_parser_switch_statement(njs_vm_t *vm
  254. return NJS_TOKEN_ILLEGAL;
  255. }
  256.  
  257. - token = njs_parser_statement_chain(vm, parser, token,
  258. - &njs_parser_chain_current(parser));
  259. + token = njs_parser_statement_chain(vm, parser, token, 0);
  260. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  261. return token;
  262. }
  263. @@ -1839,12 +1856,8 @@ njs_parser_import_statement(njs_vm_t *vm
  264. import->left = name;
  265. import->right = parser->node;
  266.  
  267. - ret = njs_parser_import_hoist(vm, parser, import);
  268. - if (nxt_slow_path(ret != NXT_OK)) {
  269. - return NJS_TOKEN_ERROR;
  270. - }
  271. -
  272. - parser->node = NULL;
  273. + parser->node = import;
  274. + parser->node->hoist = 1;
  275.  
  276. return njs_parser_token(vm, parser);
  277. }
  278. @@ -1961,40 +1974,6 @@ njs_parser_export_statement(njs_vm_t *vm
  279.  
  280.  
  281. static nxt_int_t
  282. -njs_parser_import_hoist(njs_vm_t *vm, njs_parser_t *parser,
  283. - njs_parser_node_t *new_node)
  284. -{
  285. - njs_parser_node_t *node, *stmt, **child;
  286. -
  287. - child = &njs_parser_chain_top(parser);
  288. -
  289. - while (*child != NULL) {
  290. - node = *child;
  291. -
  292. - if (node->right != NULL
  293. - && node->right->token == NJS_TOKEN_IMPORT)
  294. - {
  295. - break;
  296. - }
  297. -
  298. - child = &node->left;
  299. - }
  300. -
  301. - stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
  302. - if (nxt_slow_path(stmt == NULL)) {
  303. - return NXT_ERROR;
  304. - }
  305. -
  306. - stmt->left = *child;
  307. - stmt->right = new_node;
  308. -
  309. - *child = stmt;
  310. -
  311. - return NXT_OK;
  312. -}
  313. -
  314. -
  315. -static nxt_int_t
  316. njs_parser_export_sink(njs_vm_t *vm, njs_parser_t *parser)
  317. {
  318. nxt_uint_t n;
  319. diff -r 366a094ef6b2 -r 4f81c1cfc677 njs/njs_parser.h
  320. --- a/njs/njs_parser.h Sat Apr 13 01:07:34 2019 +0800
  321. +++ b/njs/njs_parser.h Sat Apr 13 01:11:49 2019 +0800
  322. @@ -40,6 +40,7 @@ struct njs_parser_node_s {
  323. njs_token_t token:16;
  324. uint8_t ctor:1;
  325. uint8_t temporary; /* 1 bit */
  326. + uint8_t hoist; /* 1 bit */
  327. uint32_t token_line;
  328.  
  329. union {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement