Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.55 KB | None | 0 0
  1. # HG changeset patch
  2. # User hongzhidao <hongzhidao@gmail.com>
  3. # Date 1552877295 -28800
  4. # Node ID c198fb2fc63ea712a4c2e5cc2d403d81fdd15262
  5. # Parent 9a87bf103c47170b0b446857d6e37855d7fba3c6
  6. Improved lambda arguments object.
  7.  
  8. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_function.c
  9. --- a/njs/njs_function.c Sun Mar 17 21:22:30 2019 +0800
  10. +++ b/njs/njs_function.c Mon Mar 18 10:48:15 2019 +0800
  11. @@ -475,13 +475,6 @@ njs_function_lambda_call(njs_vm_t *vm, n
  12. vm->scopes[NJS_SCOPE_CLOSURE + n] = &closure->u.values;
  13. }
  14.  
  15. - if (lambda->arguments_object) {
  16. - ret = njs_function_arguments_object_init(vm, &frame->native);
  17. - if (nxt_slow_path(ret != NXT_OK)) {
  18. - return NXT_ERROR;
  19. - }
  20. - }
  21. -
  22. if (lambda->rest_parameters) {
  23. ret = njs_function_rest_parameters_init(vm, &frame->native);
  24. if (nxt_slow_path(ret != NXT_OK)) {
  25. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_function.h
  26. --- a/njs/njs_function.h Sun Mar 17 21:22:30 2019 +0800
  27. +++ b/njs/njs_function.h Mon Mar 18 10:48:15 2019 +0800
  28. @@ -30,7 +30,6 @@ struct njs_function_lambda_s {
  29. /* Function internal block closures levels. */
  30. uint8_t block_closures; /* 4 bits */
  31.  
  32. - uint8_t arguments_object; /* 1 bit */
  33. uint8_t rest_parameters; /* 1 bit */
  34.  
  35. /* Initial values of local scope. */
  36. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_generator.c
  37. --- a/njs/njs_generator.c Sun Mar 17 21:22:30 2019 +0800
  38. +++ b/njs/njs_generator.c Mon Mar 18 10:48:15 2019 +0800
  39. @@ -61,8 +61,6 @@ static nxt_int_t njs_generate_name(njs_v
  40. njs_parser_node_t *node);
  41. static nxt_int_t njs_generate_builtin_object(njs_vm_t *vm,
  42. njs_generator_t *generator, njs_parser_node_t *node);
  43. -static nxt_int_t njs_generate_arguments_object(njs_vm_t *vm,
  44. - njs_generator_t *generator, njs_parser_node_t *node);
  45. static nxt_int_t njs_generate_variable(njs_vm_t *vm, njs_generator_t *generator,
  46. njs_parser_node_t *node);
  47. static nxt_int_t njs_generate_var_statement(njs_vm_t *vm,
  48. @@ -140,7 +138,7 @@ static nxt_int_t njs_generate_function_d
  49. static nxt_int_t njs_generate_function_scope(njs_vm_t *vm,
  50. njs_function_lambda_t *lambda, njs_parser_node_t *node,
  51. const nxt_str_t *name);
  52. -static nxt_int_t njs_generate_argument_closures(njs_vm_t *vm,
  53. +static nxt_int_t njs_generate_lambda_variables(njs_vm_t *vm,
  54. njs_generator_t *generator, njs_parser_node_t *node);
  55. static nxt_int_t njs_generate_return_statement(njs_vm_t *vm,
  56. njs_generator_t *generator, njs_parser_node_t *node);
  57. @@ -447,7 +445,7 @@ njs_generator(njs_vm_t *vm, njs_generato
  58. return njs_generate_builtin_object(vm, generator, node);
  59.  
  60. case NJS_TOKEN_ARGUMENTS:
  61. - return njs_generate_arguments_object(vm, generator, node);
  62. + return njs_generate_name(vm, generator, node);
  63.  
  64. case NJS_TOKEN_FUNCTION:
  65. return njs_generate_function_declaration(vm, generator, node);
  66. @@ -575,25 +573,6 @@ njs_generate_builtin_object(njs_vm_t *vm
  67.  
  68.  
  69. static nxt_int_t
  70. -njs_generate_arguments_object(njs_vm_t *vm, njs_generator_t *generator,
  71. - njs_parser_node_t *node)
  72. -{
  73. - njs_vmcode_arguments_t *gen;
  74. -
  75. - node->index = njs_generate_object_dest_index(vm, generator, node);
  76. - if (nxt_slow_path(node->index == NJS_INDEX_ERROR)) {
  77. - return NXT_ERROR;
  78. - }
  79. -
  80. - njs_generate_code(generator, njs_vmcode_arguments_t, gen,
  81. - njs_vmcode_arguments, 1, 1);
  82. - gen->retval = node->index;
  83. -
  84. - return NXT_OK;
  85. -}
  86. -
  87. -
  88. -static nxt_int_t
  89. njs_generate_variable(njs_vm_t *vm, njs_generator_t *generator,
  90. njs_parser_node_t *node)
  91. {
  92. @@ -2312,7 +2291,6 @@ njs_generate_function_scope(njs_vm_t *vm
  93. lambda->closure_size = size;
  94.  
  95. lambda->nesting = node->scope->nesting;
  96. - lambda->arguments_object = node->scope->arguments_object;
  97.  
  98. lambda->start = generator.code_start;
  99. lambda->local_size = generator.scope_size;
  100. @@ -2345,7 +2323,7 @@ njs_generate_scope(njs_vm_t *vm, njs_gen
  101. generator->code_start = p;
  102. generator->code_end = p;
  103.  
  104. - ret = njs_generate_argument_closures(vm, generator, scope->top);
  105. + ret = njs_generate_lambda_variables(vm, generator, scope->top);
  106. if (nxt_slow_path(ret != NXT_OK)) {
  107. return NXT_ERROR;
  108. }
  109. @@ -2403,35 +2381,36 @@ njs_generate_scope(njs_vm_t *vm, njs_gen
  110.  
  111.  
  112. static nxt_int_t
  113. -njs_generate_argument_closures(njs_vm_t *vm, njs_generator_t *generator,
  114. +njs_generate_lambda_variables(njs_vm_t *vm, njs_generator_t *generator,
  115. njs_parser_node_t *node)
  116. {
  117. - nxt_uint_t n;
  118. - njs_index_t index;
  119. - njs_variable_t *var;
  120. - njs_vmcode_move_t *move;
  121. - nxt_lvlhsh_each_t lhe;
  122. -
  123. - n = node->scope->argument_closures;
  124. -
  125. - if (n == 0) {
  126. - return NXT_OK;
  127. - }
  128. + njs_index_t index;
  129. + njs_variable_t *var;
  130. + njs_vmcode_move_t *move;
  131. + nxt_lvlhsh_each_t lhe;
  132. + njs_vmcode_arguments_t *code;
  133.  
  134. nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
  135.  
  136. - do {
  137. + for ( ;; ) {
  138. var = nxt_lvlhsh_each(&node->scope->variables, &lhe);
  139.  
  140. + if (var == NULL) {
  141. + break;
  142. + }
  143. +
  144. if (var->argument != 0) {
  145. index = njs_scope_index((var->argument - 1), NJS_SCOPE_ARGUMENTS);
  146.  
  147. njs_generate_code_move(generator, move, var->index, index);
  148. -
  149. - n--;
  150. }
  151.  
  152. - } while (n != 0);
  153. + if (var->arguments_object) {
  154. + njs_generate_code(generator, njs_vmcode_arguments_t, code,
  155. + njs_vmcode_arguments, 1, 0);
  156. + code->dst = var->index;
  157. + }
  158. + }
  159.  
  160. return NXT_OK;
  161. }
  162. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_parser.c
  163. --- a/njs/njs_parser.c Sun Mar 17 21:22:30 2019 +0800
  164. +++ b/njs/njs_parser.c Mon Mar 18 10:48:15 2019 +0800
  165. @@ -523,6 +523,7 @@ njs_parser_variable_add(njs_vm_t *vm, nj
  166. njs_parser_key_hash(parser), type);
  167. }
  168.  
  169. +
  170. nxt_inline njs_ret_t
  171. njs_parser_variable_reference(njs_vm_t *vm, njs_parser_t *parser,
  172. njs_parser_node_t *node, njs_reference_type_t type)
  173. @@ -533,6 +534,36 @@ njs_parser_variable_reference(njs_vm_t *
  174. }
  175.  
  176.  
  177. +nxt_inline njs_parser_node_t *
  178. +njs_parser_variable_node(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
  179. + uint32_t hash, njs_variable_type_t type, uint8_t arguments_object)
  180. +{
  181. + nxt_int_t ret;
  182. + njs_variable_t *var;
  183. + njs_parser_node_t *node;
  184. +
  185. + var = njs_variable_add(vm, parser->scope, name, hash, type);
  186. + if (nxt_slow_path(var == NULL)) {
  187. + return NULL;
  188. + }
  189. +
  190. + var->arguments_object = arguments_object;
  191. +
  192. + node = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
  193. + if (nxt_slow_path(node == NULL)) {
  194. + return NULL;
  195. + }
  196. +
  197. + ret = njs_variable_reference(vm, parser->scope, node, name, hash,
  198. + NJS_DECLARATION);
  199. + if (nxt_slow_path(ret != NXT_OK)) {
  200. + return NULL;
  201. + }
  202. +
  203. + return node;
  204. +}
  205. +
  206. +
  207. static njs_token_t
  208. njs_parser_labelled_statement(njs_vm_t *vm, njs_parser_t *parser)
  209. {
  210. @@ -748,8 +779,14 @@ static njs_token_t
  211. njs_parser_function_lambda(njs_vm_t *vm, njs_parser_t *parser,
  212. njs_function_lambda_t *lambda, njs_token_t token)
  213. {
  214. - njs_ret_t ret;
  215. - njs_index_t index;
  216. + njs_ret_t ret;
  217. + nxt_str_t name;
  218. + uint32_t hash;
  219. + njs_index_t index;
  220. + njs_parser_node_t *node;
  221. +
  222. + name = nxt_string_value("arguments");
  223. + hash = nxt_djb_hash(name.start, name.length);
  224.  
  225. ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
  226. if (nxt_slow_path(ret != NXT_OK)) {
  227. @@ -766,6 +803,12 @@ njs_parser_function_lambda(njs_vm_t *vm,
  228. return token;
  229. }
  230.  
  231. + node = njs_parser_variable_node(vm, parser, &name, hash,
  232. + NJS_VARIABLE_VAR, 1);
  233. + if (nxt_slow_path(node == NULL)) {
  234. + return NJS_TOKEN_ERROR;
  235. + }
  236. +
  237. token = njs_parser_lambda_body(vm, parser, token);
  238. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  239. return token;
  240. @@ -1008,9 +1051,7 @@ njs_parser_return_statement(njs_vm_t *vm
  241. static njs_token_t
  242. njs_parser_var_statement(njs_vm_t *vm, njs_parser_t *parser)
  243. {
  244. - njs_ret_t ret;
  245. njs_token_t token;
  246. - njs_variable_t *var;
  247. njs_parser_node_t *left, *stmt, *name, *assign, *expr;
  248.  
  249. parser->node = NULL;
  250. @@ -1032,21 +1073,14 @@ njs_parser_var_statement(njs_vm_t *vm, n
  251. return NJS_TOKEN_ILLEGAL;
  252. }
  253.  
  254. - var = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
  255. - if (nxt_slow_path(var == NULL)) {
  256. - return NJS_TOKEN_ERROR;
  257. - }
  258. -
  259. - name = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
  260. + name = njs_parser_variable_node(vm, parser,
  261. + njs_parser_text(parser),
  262. + njs_parser_key_hash(parser),
  263. + NJS_VARIABLE_VAR, 0);
  264. if (nxt_slow_path(name == NULL)) {
  265. return NJS_TOKEN_ERROR;
  266. }
  267.  
  268. - ret = njs_parser_variable_reference(vm, parser, name, NJS_DECLARATION);
  269. - if (nxt_slow_path(ret != NXT_OK)) {
  270. - return NJS_TOKEN_ERROR;
  271. - }
  272. -
  273. token = njs_parser_token(vm, parser);
  274. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  275. return token;
  276. @@ -1460,9 +1494,7 @@ njs_parser_for_statement(njs_vm_t *vm, n
  277. static njs_token_t
  278. njs_parser_for_var_statement(njs_vm_t *vm, njs_parser_t *parser)
  279. {
  280. - njs_ret_t ret;
  281. njs_token_t token;
  282. - njs_variable_t *var;
  283. njs_parser_node_t *left, *stmt, *name, *assign, *expr;
  284.  
  285. parser->node = NULL;
  286. @@ -1484,21 +1516,14 @@ njs_parser_for_var_statement(njs_vm_t *v
  287. return NJS_TOKEN_ILLEGAL;
  288. }
  289.  
  290. - var = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
  291. - if (nxt_slow_path(var == NULL)) {
  292. - return NJS_TOKEN_ERROR;
  293. - }
  294. -
  295. - name = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
  296. + name = njs_parser_variable_node(vm, parser,
  297. + njs_parser_text(parser),
  298. + njs_parser_key_hash(parser),
  299. + NJS_VARIABLE_VAR, 0);
  300. if (nxt_slow_path(name == NULL)) {
  301. return NJS_TOKEN_ERROR;
  302. }
  303.  
  304. - ret = njs_parser_variable_reference(vm, parser, name, NJS_DECLARATION);
  305. - if (nxt_slow_path(ret != NXT_OK)) {
  306. - return NJS_TOKEN_ERROR;
  307. - }
  308. -
  309. token = njs_parser_token(vm, parser);
  310. if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
  311. return token;
  312. @@ -1697,7 +1722,6 @@ njs_parser_try_statement(njs_vm_t *vm, n
  313. {
  314. njs_ret_t ret;
  315. njs_token_t token;
  316. - njs_variable_t *var;
  317. njs_parser_node_t *node, *try, *catch;
  318.  
  319. token = njs_parser_try_block(vm, parser);
  320. @@ -1743,21 +1767,14 @@ njs_parser_try_statement(njs_vm_t *vm, n
  321. return NJS_TOKEN_ERROR;
  322. }
  323.  
  324. - var = njs_parser_variable_add(vm, parser, NJS_VARIABLE_CATCH);
  325. - if (nxt_slow_path(var == NULL)) {
  326. - return NJS_TOKEN_ERROR;
  327. - }
  328. -
  329. - node = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
  330. + node = njs_parser_variable_node(vm, parser,
  331. + njs_parser_text(parser),
  332. + njs_parser_key_hash(parser),
  333. + NJS_VARIABLE_CATCH, 0);
  334. if (nxt_slow_path(node == NULL)) {
  335. return NJS_TOKEN_ERROR;
  336. }
  337.  
  338. - ret = njs_parser_variable_reference(vm, parser, node, NJS_DECLARATION);
  339. - if (nxt_slow_path(ret != NXT_OK)) {
  340. - return NJS_TOKEN_ERROR;
  341. - }
  342. -
  343. catch->left = node;
  344.  
  345. token = njs_parser_token(vm, parser);
  346. @@ -2163,20 +2180,6 @@ njs_parser_reference(njs_vm_t *vm, njs_p
  347.  
  348. break;
  349.  
  350. - case NJS_TOKEN_ARGUMENTS:
  351. - nxt_thread_log_debug("JS: arguments");
  352. -
  353. - if (parser->scope->type <= NJS_SCOPE_GLOBAL) {
  354. - njs_parser_syntax_error(vm, parser, "\"%V\" object "
  355. - "in global scope", name);
  356. -
  357. - return NULL;
  358. - }
  359. -
  360. - parser->scope->arguments_object = 1;
  361. -
  362. - break;
  363. -
  364. case NJS_TOKEN_OBJECT_CONSTRUCTOR:
  365. node->index = NJS_INDEX_OBJECT;
  366. break;
  367. @@ -2266,6 +2269,26 @@ njs_parser_reference(njs_vm_t *vm, njs_p
  368.  
  369. break;
  370.  
  371. + case NJS_TOKEN_ARGUMENTS:
  372. + nxt_thread_log_debug("JS: arguments");
  373. +
  374. + if (parser->scope->type <= NJS_SCOPE_GLOBAL) {
  375. + njs_parser_syntax_error(vm, parser, "\"%V\" object "
  376. + "in global scope", name);
  377. +
  378. + return NULL;
  379. + }
  380. +
  381. + node->token_line = token_line;
  382. +
  383. + ret = njs_variable_reference(vm, parser->scope, node, name, hash,
  384. + NJS_REFERENCE);
  385. + if (nxt_slow_path(ret != NXT_OK)) {
  386. + return NULL;
  387. + }
  388. +
  389. + break;
  390. +
  391. case NJS_TOKEN_NAME:
  392. nxt_thread_log_debug("JS: %V", name);
  393.  
  394. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_parser.h
  395. --- a/njs/njs_parser.h Sun Mar 17 21:22:30 2019 +0800
  396. +++ b/njs/njs_parser.h Mon Mar 18 10:48:15 2019 +0800
  397. @@ -30,7 +30,6 @@ struct njs_parser_scope_s {
  398. njs_scope_t type:8;
  399. uint8_t nesting; /* 4 bits */
  400. uint8_t argument_closures;
  401. - uint8_t arguments_object;
  402. };
  403.  
  404.  
  405. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_variable.h
  406. --- a/njs/njs_variable.h Sun Mar 17 21:22:30 2019 +0800
  407. +++ b/njs/njs_variable.h Mon Mar 18 10:48:15 2019 +0800
  408. @@ -23,6 +23,7 @@ typedef struct {
  409.  
  410. njs_variable_type_t type:8; /* 3 bits */
  411. uint8_t argument;
  412. + uint8_t arguments_object;
  413.  
  414. njs_index_t index;
  415. njs_value_t value;
  416. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_vm.c
  417. --- a/njs/njs_vm.c Sun Mar 17 21:22:30 2019 +0800
  418. +++ b/njs/njs_vm.c Mon Mar 18 10:48:15 2019 +0800
  419. @@ -418,8 +418,10 @@ njs_vmcode_function(njs_vm_t *vm, njs_va
  420. njs_ret_t
  421. njs_vmcode_arguments(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2)
  422. {
  423. - njs_ret_t ret;
  424. - njs_frame_t *frame;
  425. + nxt_int_t ret;
  426. + njs_frame_t *frame;
  427. + njs_value_t *value;
  428. + njs_vmcode_arguments_t *code;
  429.  
  430. frame = (njs_frame_t *) vm->active_frame;
  431.  
  432. @@ -430,9 +432,13 @@ njs_vmcode_arguments(njs_vm_t *vm, njs_v
  433. }
  434. }
  435.  
  436. - vm->retval.data.u.object = frame->native.arguments_object;
  437. - vm->retval.type = NJS_OBJECT;
  438. - vm->retval.data.truth = 1;
  439. + code = (njs_vmcode_arguments_t *) vm->current;
  440. +
  441. + value = njs_vmcode_operand(vm, code->dst);
  442. +
  443. + value->data.u.object = frame->native.arguments_object;
  444. + value->type = NJS_OBJECT;
  445. + value->data.truth = 1;
  446.  
  447. return sizeof(njs_vmcode_arguments_t);
  448. }
  449. diff -r 9a87bf103c47 -r c198fb2fc63e njs/njs_vm.h
  450. --- a/njs/njs_vm.h Sun Mar 17 21:22:30 2019 +0800
  451. +++ b/njs/njs_vm.h Mon Mar 18 10:48:15 2019 +0800
  452. @@ -638,7 +638,7 @@ typedef struct {
  453.  
  454. typedef struct {
  455. njs_vmcode_t code;
  456. - njs_index_t retval;
  457. + njs_index_t dst;
  458. } njs_vmcode_arguments_t;
  459.  
  460.  
  461. # HG changeset patch
  462. # User hongzhidao <hongzhidao@gmail.com>
  463. # Date 1552879963 -28800
  464. # Node ID 09f939492e54a7a5218d30ef81d0ac5dafa411cc
  465. # Parent c198fb2fc63ea712a4c2e5cc2d403d81fdd15262
  466. Improved lambda this object.
  467.  
  468. diff -r c198fb2fc63e -r 09f939492e54 njs/njs_generator.c
  469. --- a/njs/njs_generator.c Mon Mar 18 10:48:15 2019 +0800
  470. +++ b/njs/njs_generator.c Mon Mar 18 11:32:43 2019 +0800
  471. @@ -400,7 +400,6 @@ njs_generator(njs_vm_t *vm, njs_generato
  472. case NJS_TOKEN_REGEXP:
  473. return njs_generate_regexp(vm, generator, node);
  474.  
  475. - case NJS_TOKEN_THIS:
  476. case NJS_TOKEN_OBJECT_CONSTRUCTOR:
  477. case NJS_TOKEN_ARRAY_CONSTRUCTOR:
  478. case NJS_TOKEN_NUMBER_CONSTRUCTOR:
  479. @@ -422,6 +421,8 @@ njs_generator(njs_vm_t *vm, njs_generato
  480. return NXT_OK;
  481.  
  482. case NJS_TOKEN_NAME:
  483. + case NJS_TOKEN_THIS:
  484. + case NJS_TOKEN_ARGUMENTS:
  485. return njs_generate_name(vm, generator, node);
  486.  
  487. case NJS_TOKEN_GLOBAL_THIS:
  488. @@ -444,9 +445,6 @@ njs_generator(njs_vm_t *vm, njs_generato
  489. case NJS_TOKEN_CLEAR_TIMEOUT:
  490. return njs_generate_builtin_object(vm, generator, node);
  491.  
  492. - case NJS_TOKEN_ARGUMENTS:
  493. - return njs_generate_name(vm, generator, node);
  494. -
  495. case NJS_TOKEN_FUNCTION:
  496. return njs_generate_function_declaration(vm, generator, node);
  497.  
  498. @@ -2388,7 +2386,8 @@ njs_generate_lambda_variables(njs_vm_t *
  499. njs_variable_t *var;
  500. njs_vmcode_move_t *move;
  501. nxt_lvlhsh_each_t lhe;
  502. - njs_vmcode_arguments_t *code;
  503. + njs_vmcode_this_t *this;
  504. + njs_vmcode_arguments_t *arguments;
  505.  
  506. nxt_lvlhsh_each_init(&lhe, &njs_variables_hash_proto);
  507.  
  508. @@ -2405,10 +2404,16 @@ njs_generate_lambda_variables(njs_vm_t *
  509. njs_generate_code_move(generator, move, var->index, index);
  510. }
  511.  
  512. + if (var->this_object) {
  513. + njs_generate_code(generator, njs_vmcode_this_t, this,
  514. + njs_vmcode_this, 1, 0);
  515. + this->dst = var->index;
  516. + }
  517. +
  518. if (var->arguments_object) {
  519. - njs_generate_code(generator, njs_vmcode_arguments_t, code,
  520. + njs_generate_code(generator, njs_vmcode_arguments_t, arguments,
  521. njs_vmcode_arguments, 1, 0);
  522. - code->dst = var->index;
  523. + arguments->dst = var->index;
  524. }
  525. }
  526.  
  527. diff -r c198fb2fc63e -r 09f939492e54 njs/njs_parser.c
  528. --- a/njs/njs_parser.c Mon Mar 18 10:48:15 2019 +0800
  529. +++ b/njs/njs_parser.c Mon Mar 18 11:32:43 2019 +0800
  530. @@ -536,7 +536,8 @@ njs_parser_variable_reference(njs_vm_t *
  531.  
  532. nxt_inline njs_parser_node_t *
  533. njs_parser_variable_node(njs_vm_t *vm, njs_parser_t *parser, nxt_str_t *name,
  534. - uint32_t hash, njs_variable_type_t type, uint8_t arguments_object)
  535. + uint32_t hash, njs_variable_type_t type, uint8_t arguments_object,
  536. + uint8_t this_object)
  537. {
  538. nxt_int_t ret;
  539. njs_variable_t *var;
  540. @@ -547,6 +548,7 @@ njs_parser_variable_node(njs_vm_t *vm, n
  541. return NULL;
  542. }
  543.  
  544. + var->this_object = this_object;
  545. var->arguments_object = arguments_object;
  546.  
  547. node = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME);
  548. @@ -785,9 +787,6 @@ njs_parser_function_lambda(njs_vm_t *vm,
  549. njs_index_t index;
  550. njs_parser_node_t *node;
  551.  
  552. - name = nxt_string_value("arguments");
  553. - hash = nxt_djb_hash(name.start, name.length);
  554. -
  555. ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
  556. if (nxt_slow_path(ret != NXT_OK)) {
  557. return NJS_TOKEN_ERROR;
  558. @@ -803,8 +802,20 @@ njs_parser_function_lambda(njs_vm_t *vm,
  559. return token;
  560. }
  561.  
  562. + name = nxt_string_value("this");
  563. + hash = nxt_djb_hash(name.start, name.length);
  564. +
  565. node = njs_parser_variable_node(vm, parser, &name, hash,
  566. - NJS_VARIABLE_VAR, 1);
  567. + NJS_VARIABLE_VAR, 0, 1);
  568. + if (nxt_slow_path(node == NULL)) {
  569. + return NJS_TOKEN_ERROR;
  570. + }
  571. +
  572. + name = nxt_string_value("arguments");
  573. + hash = nxt_djb_hash(name.start, name.length);
  574. +
  575. + node = njs_parser_variable_node(vm, parser, &name, hash,
  576. + NJS_VARIABLE_VAR, 1, 0);
  577. if (nxt_slow_path(node == NULL)) {
  578. return NJS_TOKEN_ERROR;
  579. }
  580. @@ -1076,7 +1087,7 @@ njs_parser_var_statement(njs_vm_t *vm, n
  581. name = njs_parser_variable_node(vm, parser,
  582. njs_parser_text(parser),
  583. njs_parser_key_hash(parser),
  584. - NJS_VARIABLE_VAR, 0);
  585. + NJS_VARIABLE_VAR, 0, 0);
  586. if (nxt_slow_path(name == NULL)) {
  587. return NJS_TOKEN_ERROR;
  588. }
  589. @@ -1519,7 +1530,7 @@ njs_parser_for_var_statement(njs_vm_t *v
  590. name = njs_parser_variable_node(vm, parser,
  591. njs_parser_text(parser),
  592. njs_parser_key_hash(parser),
  593. - NJS_VARIABLE_VAR, 0);
  594. + NJS_VARIABLE_VAR, 0, 0);
  595. if (nxt_slow_path(name == NULL)) {
  596. return NJS_TOKEN_ERROR;
  597. }
  598. @@ -1770,7 +1781,7 @@ njs_parser_try_statement(njs_vm_t *vm, n
  599. node = njs_parser_variable_node(vm, parser,
  600. njs_parser_text(parser),
  601. njs_parser_key_hash(parser),
  602. - NJS_VARIABLE_CATCH, 0);
  603. + NJS_VARIABLE_CATCH, 0, 0);
  604. if (nxt_slow_path(node == NULL)) {
  605. return NJS_TOKEN_ERROR;
  606. }
  607. @@ -2153,21 +2164,29 @@ njs_parser_reference(njs_vm_t *vm, njs_p
  608.  
  609. scope = parser->scope;
  610.  
  611. + node->token = NJS_TOKEN_GLOBAL_THIS;
  612. +
  613. while (scope->type != NJS_SCOPE_GLOBAL) {
  614. if (scope->type == NJS_SCOPE_FUNCTION) {
  615. - node->index = NJS_INDEX_THIS;
  616. + node->token = NJS_TOKEN_THIS;
  617. break;
  618. }
  619.  
  620. scope = scope->parent;
  621. }
  622.  
  623. - if (node->index == NJS_INDEX_THIS) {
  624. + if (node->token == NJS_TOKEN_THIS) {
  625. + node->token_line = token_line;
  626. +
  627. + ret = njs_variable_reference(vm, parser->scope, node, name, hash,
  628. + NJS_REFERENCE);
  629. + if (nxt_slow_path(ret != NXT_OK)) {
  630. + return NULL;
  631. + }
  632. +
  633. break;
  634. }
  635.  
  636. - node->token = NJS_TOKEN_GLOBAL_THIS;
  637. -
  638. /* Fall through. */
  639.  
  640. case NJS_TOKEN_NJS:
  641. diff -r c198fb2fc63e -r 09f939492e54 njs/njs_variable.h
  642. --- a/njs/njs_variable.h Mon Mar 18 10:48:15 2019 +0800
  643. +++ b/njs/njs_variable.h Mon Mar 18 11:32:43 2019 +0800
  644. @@ -23,6 +23,7 @@ typedef struct {
  645.  
  646. njs_variable_type_t type:8; /* 3 bits */
  647. uint8_t argument;
  648. + uint8_t this_object;
  649. uint8_t arguments_object;
  650.  
  651. njs_index_t index;
  652. diff -r c198fb2fc63e -r 09f939492e54 njs/njs_vm.c
  653. --- a/njs/njs_vm.c Mon Mar 18 10:48:15 2019 +0800
  654. +++ b/njs/njs_vm.c Mon Mar 18 11:32:43 2019 +0800
  655. @@ -416,6 +416,25 @@ njs_vmcode_function(njs_vm_t *vm, njs_va
  656.  
  657.  
  658. njs_ret_t
  659. +njs_vmcode_this(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2)
  660. +{
  661. + njs_frame_t *frame;
  662. + njs_value_t *value;
  663. + njs_vmcode_this_t *code;
  664. +
  665. + frame = (njs_frame_t *) vm->active_frame;
  666. +
  667. + code = (njs_vmcode_this_t *) vm->current;
  668. +
  669. + value = njs_vmcode_operand(vm, code->dst);
  670. +
  671. + *value = frame->native.arguments[0];
  672. +
  673. + return sizeof(njs_vmcode_this_t);
  674. +}
  675. +
  676. +
  677. +njs_ret_t
  678. njs_vmcode_arguments(njs_vm_t *vm, njs_value_t *invld1, njs_value_t *invld2)
  679. {
  680. nxt_int_t ret;
  681. diff -r c198fb2fc63e -r 09f939492e54 njs/njs_vm.h
  682. --- a/njs/njs_vm.h Mon Mar 18 10:48:15 2019 +0800
  683. +++ b/njs/njs_vm.h Mon Mar 18 11:32:43 2019 +0800
  684. @@ -639,6 +639,12 @@ typedef struct {
  685. typedef struct {
  686. njs_vmcode_t code;
  687. njs_index_t dst;
  688. +} njs_vmcode_this_t;
  689. +
  690. +
  691. +typedef struct {
  692. + njs_vmcode_t code;
  693. + njs_index_t dst;
  694. } njs_vmcode_arguments_t;
  695.  
  696.  
  697. @@ -1131,6 +1137,8 @@ njs_ret_t njs_vmcode_array(njs_vm_t *vm,
  698. njs_value_t *inlvd2);
  699. njs_ret_t njs_vmcode_function(njs_vm_t *vm, njs_value_t *inlvd1,
  700. njs_value_t *invld2);
  701. +njs_ret_t njs_vmcode_this(njs_vm_t *vm, njs_value_t *inlvd1,
  702. + njs_value_t *invld2);
  703. njs_ret_t njs_vmcode_arguments(njs_vm_t *vm, njs_value_t *inlvd1,
  704. njs_value_t *invld2);
  705. njs_ret_t njs_vmcode_regexp(njs_vm_t *vm, njs_value_t *inlvd1,
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement