SHARE
TWEET

Untitled

a guest Mar 22nd, 2019 76 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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,
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top