Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551688026 -28800
- # Node ID 5fef4dc24686c4294632ae94514c635f355ce7b4
- # Parent 1096977570942e418ee93e500166a953421ee19b
- Style.
- diff -r 109697757094 -r 5fef4dc24686 njs/njs_lexer.c
- --- a/njs/njs_lexer.c Tue Mar 05 08:32:54 2019 +0800
- +++ b/njs/njs_lexer.c Mon Mar 04 16:27:06 2019 +0800
- @@ -273,7 +273,7 @@ static const njs_lexer_multi_t njs_assi
- njs_token_t
- -njs_lexer_token(njs_lexer_t *lexer)
- +njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer)
- {
- njs_token_t token;
- diff -r 109697757094 -r 5fef4dc24686 njs/njs_parser.c
- --- a/njs/njs_parser.c Tue Mar 05 08:32:54 2019 +0800
- +++ b/njs/njs_parser.c Mon Mar 04 16:27:06 2019 +0800
- @@ -126,7 +126,7 @@ njs_parser(njs_vm_t *vm, njs_parser_t *p
- }
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- while (token != NJS_TOKEN_END) {
- @@ -295,7 +295,7 @@ njs_parser_statement_chain(njs_vm_t *vm,
- *dest = node;
- while (token == NJS_TOKEN_SEMICOLON) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- break;
- }
- @@ -336,7 +336,7 @@ njs_parser_statement(njs_vm_t *vm, njs_p
- return njs_parser_try_statement(vm, parser);
- case NJS_TOKEN_SEMICOLON:
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_OPEN_BRACE:
- return njs_parser_block_statement(vm, parser);
- @@ -392,7 +392,7 @@ njs_parser_statement(njs_vm_t *vm, njs_p
- switch (token) {
- case NJS_TOKEN_SEMICOLON:
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_CLOSE_BRACE:
- case NJS_TOKEN_END:
- @@ -416,7 +416,7 @@ njs_parser_block_statement(njs_vm_t *vm,
- njs_token_t token;
- njs_parser_node_t *node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -451,7 +451,7 @@ njs_parser_block_statement(njs_vm_t *vm,
- njs_parser_scope_end(vm, parser);
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -482,7 +482,7 @@ njs_parser_match(njs_vm_t *vm, njs_parse
- njs_token_t match)
- {
- if (nxt_fast_path(token == match)) {
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- return njs_parser_unexpected_token(vm, parser, token);
- @@ -530,7 +530,7 @@ njs_parser_labelled_statement(njs_vm_t *
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -606,7 +606,7 @@ njs_parser_function_declaration(njs_vm_t
- node->token_line = parser->lexer->token_line;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -631,7 +631,7 @@ njs_parser_function_declaration(njs_vm_t
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -667,7 +667,7 @@ njs_parser_function_expression(njs_vm_t
- node->token_line = parser->lexer->token_line;
- parser->node = node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -687,7 +687,7 @@ njs_parser_function_expression(njs_vm_t
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -750,7 +750,7 @@ njs_parser_function_lambda(njs_vm_t *vm,
- if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
- lambda->rest_parameters = 1;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return NJS_TOKEN_ILLEGAL;
- }
- @@ -773,13 +773,13 @@ njs_parser_function_lambda(njs_vm_t *vm,
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- if (token == NJS_TOKEN_COMMA) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -788,7 +788,7 @@ njs_parser_function_lambda(njs_vm_t *vm,
- lambda->nargs = njs_scope_offset(index) / sizeof(njs_value_t) - 1;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -797,7 +797,7 @@ njs_parser_function_lambda(njs_vm_t *vm,
- return NJS_TOKEN_ILLEGAL;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -813,7 +813,7 @@ njs_parser_function_lambda(njs_vm_t *vm,
- }
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -892,7 +892,7 @@ njs_parser_return_statement(njs_vm_t *vm
- parser->node = node;
- - token = njs_lexer_token(parser->lexer);
- + token = njs_lexer_token(vm, parser->lexer);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -900,7 +900,7 @@ njs_parser_return_statement(njs_vm_t *vm
- switch (token) {
- case NJS_TOKEN_LINE_END:
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_SEMICOLON:
- case NJS_TOKEN_CLOSE_BRACE:
- @@ -937,7 +937,7 @@ njs_parser_var_statement(njs_vm_t *vm, n
- left = NULL;
- do {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -967,7 +967,7 @@ njs_parser_var_statement(njs_vm_t *vm, n
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -976,7 +976,7 @@ njs_parser_var_statement(njs_vm_t *vm, n
- if (token == NJS_TOKEN_ASSIGNMENT) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1037,7 +1037,7 @@ njs_parser_if_statement(njs_vm_t *vm, nj
- stmt = parser->node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1109,7 +1109,7 @@ njs_parser_switch_statement(njs_vm_t *vm
- }
- if (token == NJS_TOKEN_CASE) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1141,7 +1141,7 @@ njs_parser_switch_statement(njs_vm_t *vm
- branch->token = NJS_TOKEN_DEFAULT;
- dflt = branch;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1179,7 +1179,7 @@ njs_parser_switch_statement(njs_vm_t *vm
- parser->node = swtch;
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -1220,7 +1220,7 @@ njs_parser_do_while_statement(njs_vm_t *
- njs_token_t token;
- njs_parser_node_t *node, *stmt;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1265,7 +1265,7 @@ njs_parser_for_statement(njs_vm_t *vm, n
- condition = NULL;
- update = NULL;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1389,7 +1389,7 @@ njs_parser_for_var_statement(njs_vm_t *v
- left = NULL;
- do {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1419,7 +1419,7 @@ njs_parser_for_var_statement(njs_vm_t *v
- return NJS_TOKEN_ERROR;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1432,7 +1432,7 @@ njs_parser_for_var_statement(njs_vm_t *v
- if (token == NJS_TOKEN_ASSIGNMENT) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1478,7 +1478,7 @@ njs_parser_for_var_in_statement(njs_vm_t
- njs_token_t token;
- njs_parser_node_t *node, *foreach;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1576,12 +1576,12 @@ njs_parser_brk_statement(njs_vm_t *vm, n
- node->token_line = parser->lexer->token_line;
- parser->node = node;
- - token = njs_lexer_token(parser->lexer);
- + token = njs_lexer_token(vm, parser->lexer);
- switch (token) {
- case NJS_TOKEN_LINE_END:
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_NAME:
- name = parser->lexer->text;
- @@ -1598,7 +1598,7 @@ njs_parser_brk_statement(njs_vm_t *vm, n
- return NJS_TOKEN_ERROR;
- }
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_SEMICOLON:
- case NJS_TOKEN_CLOSE_BRACE:
- @@ -1633,7 +1633,7 @@ njs_parser_try_statement(njs_vm_t *vm, n
- try->left = parser->node;
- if (token == NJS_TOKEN_CATCH) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1680,7 +1680,7 @@ njs_parser_try_statement(njs_vm_t *vm, n
- catch->left = node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1739,7 +1739,7 @@ njs_parser_try_block(njs_vm_t *vm, njs_p
- njs_token_t token;
- njs_parser_node_t *node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
- return NJS_TOKEN_ILLEGAL;
- }
- @@ -1772,7 +1772,7 @@ njs_parser_throw_statement(njs_vm_t *vm,
- return NJS_TOKEN_ERROR;
- }
- - token = njs_lexer_token(parser->lexer);
- + token = njs_lexer_token(vm, parser->lexer);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1802,7 +1802,7 @@ njs_parser_grouping_expression(njs_vm_t
- {
- njs_token_t token;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1830,7 +1830,7 @@ njs_parser_property_token(njs_vm_t *vm,
- parser->lexer->property = 1;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- parser->lexer->property = 0;
- @@ -1853,12 +1853,12 @@ njs_parser_property_token(njs_vm_t *vm,
- njs_token_t
- -njs_parser_token(njs_parser_t *parser)
- +njs_parser_token(njs_vm_t *vm, njs_parser_t *parser)
- {
- njs_token_t token;
- do {
- - token = njs_lexer_token(parser->lexer);
- + token = njs_lexer_token(vm, parser->lexer);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- @@ -1882,7 +1882,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_pa
- if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -2037,7 +2037,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_pa
- parser->node = node;
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -2316,13 +2316,13 @@ njs_parser_object(njs_vm_t *vm, njs_pars
- switch (token) {
- case NJS_TOKEN_CLOSE_BRACE:
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- case NJS_TOKEN_NAME:
- name = lexer->text;
- hash = lexer->key_hash;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- break;
- case NJS_TOKEN_NUMBER:
- @@ -2394,7 +2394,7 @@ njs_parser_object(njs_vm_t *vm, njs_pars
- left = stmt;
- if (token == NJS_TOKEN_CLOSE_BRACE) {
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- if (nxt_slow_path(token != NJS_TOKEN_COMMA)) {
- @@ -2415,7 +2415,7 @@ njs_parser_array(njs_vm_t *vm, njs_parse
- left = NULL;
- for ( ;; ) {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -2493,7 +2493,7 @@ njs_parser_array(njs_vm_t *vm, njs_parse
- obj->u.length = index;
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- diff -r 109697757094 -r 5fef4dc24686 njs/njs_parser.h
- --- a/njs/njs_parser.h Tue Mar 05 08:32:54 2019 +0800
- +++ b/njs/njs_parser.h Mon Mar 04 16:27:06 2019 +0800
- @@ -307,7 +307,7 @@ typedef struct {
- } njs_keyword_t;
- -njs_token_t njs_lexer_token(njs_lexer_t *lexer);
- +njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer);
- void njs_lexer_rollback(njs_lexer_t *lexer);
- njs_token_t njs_lexer_peek_token(njs_lexer_t *lexer);
- nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
- @@ -326,7 +326,7 @@ njs_token_t njs_parser_assignment_expres
- njs_token_t njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser,
- njs_token_t token);
- njs_token_t njs_parser_property_token(njs_vm_t *vm, njs_parser_t *parser);
- -njs_token_t njs_parser_token(njs_parser_t *parser);
- +njs_token_t njs_parser_token(njs_vm_t *vm, njs_parser_t *parser);
- njs_variable_t *njs_variable_resolve(njs_vm_t *vm, njs_parser_node_t *node);
- njs_index_t njs_variable_typeof(njs_vm_t *vm, njs_parser_node_t *node);
- njs_index_t njs_variable_index(njs_vm_t *vm, njs_parser_node_t *node);
- diff -r 109697757094 -r 5fef4dc24686 njs/njs_parser_expression.c
- --- a/njs/njs_parser_expression.c Tue Mar 05 08:32:54 2019 +0800
- +++ b/njs/njs_parser_expression.c Mon Mar 04 16:27:06 2019 +0800
- @@ -243,7 +243,7 @@ njs_parser_var_expression(njs_vm_t *vm,
- node->u.operation = operation;
- node->left = parser->node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -376,7 +376,7 @@ njs_parser_assignment_expression(njs_vm_
- node->u.operation = operation;
- node->left = parser->node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -410,7 +410,7 @@ njs_parser_conditional_expression(njs_vm
- return token;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -441,7 +441,7 @@ njs_parser_conditional_expression(njs_vm
- node->left = parser->node;
- node->left->dest = cond;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -499,7 +499,7 @@ njs_parser_binary_expression(njs_vm_t *v
- node->left = parser->node;
- node->left->dest = node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -538,7 +538,7 @@ njs_parser_exponential_expression(njs_vm
- node->left = parser->node;
- node->left->dest = node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -602,7 +602,7 @@ njs_parser_unary_expression(njs_vm_t *vm
- return njs_parser_inc_dec_expression(vm, parser, token);
- }
- - next = njs_parser_token(parser);
- + next = njs_parser_token(vm, parser);
- if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
- return next;
- }
- @@ -698,7 +698,7 @@ njs_parser_inc_dec_expression(njs_vm_t *
- return njs_parser_post_inc_dec_expression(vm, parser, token);
- }
- - next = njs_parser_token(parser);
- + next = njs_parser_token(vm, parser);
- if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
- return next;
- }
- @@ -777,7 +777,7 @@ njs_parser_post_inc_dec_expression(njs_v
- node->left = parser->node;
- parser->node = node;
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -863,7 +863,7 @@ njs_parser_call_expression(njs_vm_t *vm,
- parser->node = func;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -877,7 +877,7 @@ njs_parser_new_expression(njs_vm_t *vm,
- {
- njs_parser_node_t *func, *node;
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -957,7 +957,7 @@ njs_parser_new_expression(njs_vm_t *vm,
- parser->node = func;
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -993,10 +993,10 @@ njs_parser_property_expression(njs_vm_t
- return NJS_TOKEN_ILLEGAL;
- }
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- } else {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- @@ -1027,7 +1027,7 @@ njs_parser_property_brackets(njs_vm_t *v
- return NJS_TOKEN_ERROR;
- }
- - return njs_parser_token(parser);
- + return njs_parser_token(vm, parser);
- }
- @@ -1042,7 +1042,7 @@ njs_parser_arguments(njs_vm_t *vm, njs_p
- index = NJS_SCOPE_CALLEE_ARGUMENTS;
- do {
- - token = njs_parser_token(parser);
- + token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- }
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551688482 -28800
- # Node ID 52960032fe5688efa96ed0189bcba6cd39ccca52
- # Parent 5fef4dc24686c4294632ae94514c635f355ce7b4
- Improved lexer.
- diff -r 5fef4dc24686 -r 52960032fe56 njs/njs_lexer.c
- --- a/njs/njs_lexer.c Mon Mar 04 16:27:06 2019 +0800
- +++ b/njs/njs_lexer.c Mon Mar 04 16:34:42 2019 +0800
- @@ -275,16 +275,22 @@ static const njs_lexer_multi_t njs_assi
- njs_token_t
- njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer)
- {
- - njs_token_t token;
- -
- lexer->prev_start = lexer->start;
- lexer->prev_token = lexer->token;
- - token = njs_lexer_next_token(lexer);
- + lexer->token = njs_lexer_next_token(lexer);
- + lexer->token_line = lexer->line;
- - lexer->token = token;
- + if (lexer->token == NJS_TOKEN_NAME) {
- + njs_lexer_keyword(lexer);
- - return token;
- + if (lexer->property) {
- + lexer->property_token = lexer->token;
- + lexer->token = NJS_TOKEN_NAME;
- + }
- + }
- +
- + return lexer->token;
- }
- @@ -485,8 +491,7 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- static njs_token_t
- njs_lexer_word(njs_lexer_t *lexer, u_char c)
- {
- - u_char *p;
- - njs_token_t token;
- + u_char *p;
- /* TODO: UTF-8 */
- @@ -508,7 +513,6 @@ njs_lexer_word(njs_lexer_t *lexer, u_cha
- 0x00, 0x00, 0x00, 0x00, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
- };
- - lexer->token_line = lexer->line;
- lexer->key_hash = nxt_djb_hash_add(NXT_DJB_HASH_INIT, c);
- lexer->text.start = lexer->start - 1;
- @@ -525,14 +529,7 @@ njs_lexer_word(njs_lexer_t *lexer, u_cha
- lexer->start = p;
- lexer->text.length = p - lexer->text.start;
- - token = njs_lexer_keyword(lexer);
- -
- - if (lexer->property) {
- - lexer->property_token = token;
- - return NJS_TOKEN_NAME;
- - }
- -
- - return token;
- + return NJS_TOKEN_NAME;
- }
- diff -r 5fef4dc24686 -r 52960032fe56 njs/njs_lexer_keyword.c
- --- a/njs/njs_lexer_keyword.c Mon Mar 04 16:27:06 2019 +0800
- +++ b/njs/njs_lexer_keyword.c Mon Mar 04 16:34:42 2019 +0800
- @@ -173,7 +173,7 @@ njs_lexer_keywords_init(nxt_mp_t *mp, nx
- }
- -njs_token_t
- +void
- njs_lexer_keyword(njs_lexer_t *lexer)
- {
- njs_keyword_t *keyword;
- @@ -185,10 +185,7 @@ njs_lexer_keyword(njs_lexer_t *lexer)
- if (nxt_lvlhsh_find(&lexer->keywords_hash, &lhq) == NXT_OK) {
- keyword = lhq.value;
- + lexer->token = keyword->token;
- lexer->number = keyword->number;
- -
- - return keyword->token;
- }
- -
- - return NJS_TOKEN_NAME;
- }
- diff -r 5fef4dc24686 -r 52960032fe56 njs/njs_parser.c
- --- a/njs/njs_parser.c Mon Mar 04 16:27:06 2019 +0800
- +++ b/njs/njs_parser.c Mon Mar 04 16:34:42 2019 +0800
- @@ -2776,9 +2776,9 @@ njs_parser_trace_handler(nxt_trace_t *tr
- if (lexer->file.length != 0) {
- njs_internal_error(vm, "%s in %V:%uD", start, &lexer->file,
- - lexer->line);
- + lexer->token_line);
- } else {
- - njs_internal_error(vm, "%s in %uD", start, lexer->line);
- + njs_internal_error(vm, "%s in %uD", start, lexer->token_line);
- }
- } else {
- @@ -2833,8 +2833,8 @@ njs_parser_lexer_error(njs_vm_t *vm, njs
- }
- va_start(args, fmt);
- - njs_parser_scope_error(vm, parser->scope, type, parser->lexer->line, fmt,
- - args);
- + njs_parser_scope_error(vm, parser->scope, type, parser->lexer->token_line,
- + fmt, args);
- va_end(args);
- }
- diff -r 5fef4dc24686 -r 52960032fe56 njs/njs_parser.h
- --- a/njs/njs_parser.h Mon Mar 04 16:27:06 2019 +0800
- +++ b/njs/njs_parser.h Mon Mar 04 16:34:42 2019 +0800
- @@ -311,7 +311,7 @@ njs_token_t njs_lexer_token(njs_vm_t *vm
- void njs_lexer_rollback(njs_lexer_t *lexer);
- njs_token_t njs_lexer_peek_token(njs_lexer_t *lexer);
- nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
- -njs_token_t njs_lexer_keyword(njs_lexer_t *lexer);
- +void njs_lexer_keyword(njs_lexer_t *lexer);
- nxt_int_t njs_parser(njs_vm_t *vm, njs_parser_t *parser,
- njs_parser_t *prev);
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551806725 -28800
- # Node ID 049c1a5fa4fa9771031253616a6ced9163b52ccb
- # Parent 52960032fe5688efa96ed0189bcba6cd39ccca52
- arrow function support.
- diff -r 52960032fe56 -r 049c1a5fa4fa njs/njs.c
- --- a/njs/njs.c Mon Mar 04 16:34:42 2019 +0800
- +++ b/njs/njs.c Wed Mar 06 01:25:25 2019 +0800
- @@ -234,13 +234,10 @@ njs_vm_compile(njs_vm_t *vm, u_char **st
- prev = vm->parser;
- vm->parser = parser;
- - nxt_memzero(&lexer, sizeof(njs_lexer_t));
- -
- - lexer.start = *start;
- - lexer.end = end;
- - lexer.line = 1;
- - lexer.file = vm->options.file;
- - lexer.keywords_hash = vm->shared->keywords_hash;
- + ret = njs_lexer_init(vm, &lexer, &vm->options.file, *start, end);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_ERROR;
- + }
- parser->lexer = &lexer;
- diff -r 52960032fe56 -r 049c1a5fa4fa njs/njs_lexer.c
- --- a/njs/njs_lexer.c Mon Mar 04 16:34:42 2019 +0800
- +++ b/njs/njs_lexer.c Wed Mar 06 01:25:25 2019 +0800
- @@ -18,6 +18,7 @@ struct njs_lexer_multi_s {
- };
- +static nxt_int_t njs_lexer_preread_token(njs_vm_t *vm, njs_lexer_t *lexer);
- static njs_token_t njs_lexer_next_token(njs_lexer_t *lexer);
- static njs_token_t njs_lexer_word(njs_lexer_t *lexer, u_char c);
- static njs_token_t njs_lexer_string(njs_lexer_t *lexer, u_char quote);
- @@ -27,6 +28,9 @@ static njs_token_t njs_lexer_multi(njs_l
- static njs_token_t njs_lexer_division(njs_lexer_t *lexer,
- njs_token_t token);
- +#define njs_lexer_last_token(lexer) \
- + nxt_array_last((lexer)->preread)
- +
- static const uint8_t njs_tokens[256] nxt_aligned(64) = {
- @@ -269,17 +273,63 @@ static const njs_lexer_multi_t njs_grea
- static const njs_lexer_multi_t njs_assignment_token[] = {
- { '=', NJS_TOKEN_EQUAL, 1, njs_strict_equal_token },
- + { '>', NJS_TOKEN_ARROW, 0, NULL },
- };
- +nxt_int_t
- +njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file,
- + u_char *start, u_char *end)
- +{
- + nxt_memzero(lexer, sizeof(njs_lexer_t));
- +
- + lexer->file = *file;
- + lexer->start = start;
- + lexer->end = end;
- + lexer->line = 1;
- + lexer->keywords_hash = vm->shared->keywords_hash;
- +
- + lexer->preread = nxt_array_create(2, sizeof(njs_lexer_token_t),
- + &njs_array_mem_proto, vm->mem_pool);
- + if (nxt_slow_path(lexer->preread == NULL)) {
- + return NXT_ERROR;
- + }
- +
- + lexer->pos = 0;
- +
- + return NXT_OK;
- +}
- +
- +
- njs_token_t
- njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer)
- {
- + nxt_int_t ret;
- + nxt_array_t *preread;
- + njs_lexer_token_t *lt;
- +
- lexer->prev_start = lexer->start;
- lexer->prev_token = lexer->token;
- - lexer->token = njs_lexer_next_token(lexer);
- - lexer->token_line = lexer->line;
- + preread = lexer->preread;
- +
- + if (lexer->pos == preread->items) {
- + nxt_array_reset(preread);
- + lexer->pos = 0;
- +
- + ret = njs_lexer_preread_token(vm, lexer);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- + }
- +
- + lt = nxt_array_item(preread, lexer->pos++);
- +
- + lexer->token = lt->token;
- + lexer->token_line = lt->token_line;
- + lexer->key_hash = lt->key_hash;
- + lexer->text = lt->text;
- + lexer->number = lt->number;
- if (lexer->token == NJS_TOKEN_NAME) {
- njs_lexer_keyword(lexer);
- @@ -294,36 +344,104 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_
- }
- -void
- -njs_lexer_rollback(njs_lexer_t *lexer)
- +njs_token_t
- +njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset)
- {
- - lexer->start = lexer->prev_start;
- - lexer->token = lexer->prev_token;
- -}
- + size_t i, n;
- + nxt_int_t ret;
- + nxt_array_t *preread;
- + njs_lexer_token_t *lt;
- + lexer->prev_start = lexer->start;
- + lexer->prev_token = lexer->token;
- -njs_token_t
- -njs_lexer_peek_token(njs_lexer_t *lexer)
- -{
- - u_char *start;
- - njs_token_t token;
- + preread = lexer->preread;
- - start = lexer->start;
- + n = 0;
- - while (start < lexer->end) {
- - token = njs_tokens[*start++];
- + offset = lexer->pos + offset;
- - switch (token) {
- - case NJS_TOKEN_SPACE:
- - case NJS_TOKEN_LINE_END:
- - continue;
- + if (offset + 1 > preread->items) {
- + n = offset + 1 - preread->items;
- + }
- - default:
- - return token;
- + for (i = 0; i < n; i++) {
- +
- + ret = njs_lexer_preread_token(vm, lexer);
- +
- + if (ret == NXT_DECLINED) {
- + offset = preread->items;
- + break;
- + }
- +
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- }
- }
- - return NJS_TOKEN_END;
- + lt = nxt_array_item(preread, offset);
- +
- + return lt->token;
- +}
- +
- +
- +ssize_t
- +njs_lexer_match(njs_vm_t *vm, njs_lexer_t *lexer, njs_token_t target)
- +{
- + size_t offset;
- + njs_token_t token;
- +
- + offset = 0;
- +
- + while (1) {
- + token = njs_lexer_peek_token(vm, lexer, offset);
- + if (token <= NJS_TOKEN_ILLEGAL) {
- + return -1;
- + }
- +
- + if (token == target) {
- + return offset;
- + }
- +
- + if (token == NJS_TOKEN_END || token == NJS_TOKEN_DIVISION) {
- + return -1;
- + }
- +
- + offset++;
- + }
- +
- + return offset;
- +}
- +
- +
- +static nxt_int_t
- +njs_lexer_preread_token(njs_vm_t *vm, njs_lexer_t *lexer)
- +{
- + nxt_array_t *preread;
- + njs_lexer_token_t *lt, *last;
- +
- + preread = lexer->preread;
- +
- + if (lexer->token == NJS_TOKEN_END) {
- + return NXT_DECLINED;
- + }
- +
- + if (lexer->pos < preread->items) {
- + last = nxt_array_last(preread);
- + if (last->token == NJS_TOKEN_DIVISION) {
- + return NXT_DECLINED;
- + }
- + }
- +
- + lt = nxt_array_add(preread, &njs_array_mem_proto, vm->mem_pool);
- + if (nxt_slow_path(lt == NULL)) {
- + return NXT_ERROR;
- + }
- +
- + lt->token = njs_lexer_next_token(lexer);
- + lt->token_line = lexer->line;
- +
- + return NXT_OK;
- }
- @@ -333,9 +451,12 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- u_char c, *p;
- nxt_uint_t n;
- njs_token_t token;
- + njs_lexer_token_t *lt;
- const njs_lexer_multi_t *multi;
- - lexer->text.start = lexer->start;
- + lt = njs_lexer_last_token(lexer);
- +
- + lt->text.start = lexer->start;
- while (lexer->start < lexer->end) {
- c = *lexer->start++;
- @@ -345,7 +466,7 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- switch (token) {
- case NJS_TOKEN_SPACE:
- - lexer->text.start = lexer->start;
- + lt->text.start = lexer->start;
- continue;
- case NJS_TOKEN_LETTER:
- @@ -362,13 +483,13 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- && njs_tokens[p[0]] == NJS_TOKEN_DOT
- && njs_tokens[p[1]] == NJS_TOKEN_DOT)
- {
- - lexer->text.length = (p - lexer->text.start) + 2;
- + lt->text.length = (p - lt->text.start) + 2;
- lexer->start += 2;
- return NJS_TOKEN_ELLIPSIS;
- }
- if (p == lexer->end || njs_tokens[*p] != NJS_TOKEN_DIGIT) {
- - lexer->text.length = p - lexer->text.start;
- + lt->text.length = p - lt->text.start;
- return NJS_TOKEN_DOT;
- }
- @@ -468,7 +589,7 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- case NJS_TOKEN_COLON:
- case NJS_TOKEN_SEMICOLON:
- case NJS_TOKEN_CONDITIONAL:
- - lexer->text.length = lexer->start - lexer->text.start;
- + lt->text.length = lexer->start - lt->text.start;
- return token;
- case NJS_TOKEN_ILLEGAL:
- @@ -482,7 +603,7 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- return njs_lexer_multi(lexer, token, n, multi);
- }
- - lexer->text.length = lexer->start - lexer->text.start;
- + lt->text.length = lexer->start - lt->text.start;
- return NJS_TOKEN_END;
- }
- @@ -491,7 +612,10 @@ njs_lexer_next_token(njs_lexer_t *lexer)
- static njs_token_t
- njs_lexer_word(njs_lexer_t *lexer, u_char c)
- {
- - u_char *p;
- + u_char *p;
- + njs_lexer_token_t *lt;
- +
- + lt = njs_lexer_last_token(lexer);
- /* TODO: UTF-8 */
- @@ -513,8 +637,8 @@ njs_lexer_word(njs_lexer_t *lexer, u_cha
- 0x00, 0x00, 0x00, 0x00, /* 0000 0000 0000 0000 0000 0000 0000 0000 */
- };
- - lexer->key_hash = nxt_djb_hash_add(NXT_DJB_HASH_INIT, c);
- - lexer->text.start = lexer->start - 1;
- + lt->key_hash = nxt_djb_hash_add(NXT_DJB_HASH_INIT, c);
- + lt->text.start = lexer->start - 1;
- for (p = lexer->start; p < lexer->end; p++) {
- c = *p;
- @@ -523,11 +647,11 @@ njs_lexer_word(njs_lexer_t *lexer, u_cha
- break;
- }
- - lexer->key_hash = nxt_djb_hash_add(lexer->key_hash, c);
- + lt->key_hash = nxt_djb_hash_add(lt->key_hash, c);
- }
- lexer->start = p;
- - lexer->text.length = p - lexer->text.start;
- + lt->text.length = p - lt->text.start;
- return NJS_TOKEN_NAME;
- }
- @@ -536,11 +660,14 @@ njs_lexer_word(njs_lexer_t *lexer, u_cha
- static njs_token_t
- njs_lexer_string(njs_lexer_t *lexer, u_char quote)
- {
- - u_char *p, c;
- - nxt_bool_t escape;
- + u_char *p, c;
- + nxt_bool_t escape;
- + njs_lexer_token_t *lt;
- +
- + lt = njs_lexer_last_token(lexer);
- escape = 0;
- - lexer->text.start = lexer->start;
- + lt->text.start = lexer->start;
- p = lexer->start;
- while (p < lexer->end) {
- @@ -571,7 +698,7 @@ njs_lexer_string(njs_lexer_t *lexer, u_c
- if (c == quote) {
- lexer->start = p;
- - lexer->text.length = (p - 1) - lexer->text.start;
- + lt->text.length = (p - 1) - lt->text.start;
- if (escape == 0) {
- return NJS_TOKEN_STRING;
- @@ -581,8 +708,8 @@ njs_lexer_string(njs_lexer_t *lexer, u_c
- }
- }
- - lexer->text.start--;
- - lexer->text.length = p - lexer->text.start;
- + lt->text.start--;
- + lt->text.length = p - lt->text.start;
- return NJS_TOKEN_UNTERMINATED_STRING;
- }
- @@ -591,9 +718,12 @@ njs_lexer_string(njs_lexer_t *lexer, u_c
- static njs_token_t
- njs_lexer_number(njs_lexer_t *lexer, u_char c)
- {
- - const u_char *p;
- + const u_char *p;
- + njs_lexer_token_t *lt;
- - lexer->text.start = lexer->start - 1;
- + lt = njs_lexer_last_token(lexer);
- +
- + lt->text.start = lexer->start - 1;
- p = lexer->start;
- @@ -608,7 +738,7 @@ njs_lexer_number(njs_lexer_t *lexer, u_c
- goto illegal_token;
- }
- - lexer->number = njs_number_hex_parse(&p, lexer->end);
- + lt->number = njs_number_hex_parse(&p, lexer->end);
- goto done;
- }
- @@ -622,7 +752,7 @@ njs_lexer_number(njs_lexer_t *lexer, u_c
- goto illegal_token;
- }
- - lexer->number = njs_number_oct_parse(&p, lexer->end);
- + lt->number = njs_number_oct_parse(&p, lexer->end);
- if (p < lexer->end && (*p == '8' || *p == '9')) {
- goto illegal_trailer;
- @@ -640,7 +770,7 @@ njs_lexer_number(njs_lexer_t *lexer, u_c
- goto illegal_token;
- }
- - lexer->number = njs_number_bin_parse(&p, lexer->end);
- + lt->number = njs_number_bin_parse(&p, lexer->end);
- if (p < lexer->end && (*p >= '2' && *p <= '9')) {
- goto illegal_trailer;
- @@ -657,12 +787,12 @@ njs_lexer_number(njs_lexer_t *lexer, u_c
- }
- p--;
- - lexer->number = njs_number_dec_parse(&p, lexer->end);
- + lt->number = njs_number_dec_parse(&p, lexer->end);
- done:
- lexer->start = (u_char *) p;
- - lexer->text.length = p - lexer->text.start;
- + lt->text.length = p - lt->text.start;
- return NJS_TOKEN_NUMBER;
- @@ -672,7 +802,7 @@ illegal_trailer:
- illegal_token:
- - lexer->text.length = p - lexer->text.start;
- + lt->text.length = p - lt->text.start;
- return NJS_TOKEN_ILLEGAL;
- }
- @@ -682,7 +812,10 @@ static njs_token_t
- njs_lexer_multi(njs_lexer_t *lexer, njs_token_t token, nxt_uint_t n,
- const njs_lexer_multi_t *multi)
- {
- - u_char c;
- + u_char c;
- + njs_lexer_token_t *lt;
- +
- + lt = njs_lexer_last_token(lexer);
- if (lexer->start < lexer->end) {
- c = lexer->start[0];
- @@ -706,7 +839,7 @@ njs_lexer_multi(njs_lexer_t *lexer, njs_
- } while (n != 0);
- }
- - lexer->text.length = lexer->start - lexer->text.start;
- + lt->text.length = lexer->start - lt->text.start;
- return token;
- }
- diff -r 52960032fe56 -r 049c1a5fa4fa njs/njs_parser.c
- --- a/njs/njs_parser.c Mon Mar 04 16:34:42 2019 +0800
- +++ b/njs/njs_parser.c Wed Mar 06 01:25:25 2019 +0800
- @@ -353,7 +353,7 @@ njs_parser_statement(njs_vm_t *vm, njs_p
- default:
- if (token == NJS_TOKEN_NAME
- - && njs_lexer_peek_token(parser->lexer) == NJS_TOKEN_COLON)
- + && njs_lexer_peek_token(vm, parser->lexer, 0) == NJS_TOKEN_COLON)
- {
- return njs_parser_labelled_statement(vm, parser);
- }
- @@ -1870,10 +1870,204 @@ njs_parser_token(njs_vm_t *vm, njs_parse
- }
- +static njs_token_t
- +njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- +{
- + njs_ret_t ret;
- + njs_index_t index;
- + njs_variable_t *arg;
- + njs_parser_node_t *node, *body, *last, *parent, *return_node;
- + njs_function_lambda_t *lambda;
- +
- + node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_EXPRESSION);
- + if (nxt_slow_path(node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->token_line = parser->lexer->token_line;
- + parser->node = node;
- +
- + lambda = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_function_lambda_t));
- + if (nxt_slow_path(lambda == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->u.value.data.u.lambda = lambda;
- +
- + ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + index = NJS_SCOPE_ARGUMENTS;
- +
- + /* A "this" reservation. */
- + index += sizeof(njs_value_t);
- +
- + if (token == NJS_TOKEN_NAME) {
- + arg = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
- + if (nxt_slow_path(arg == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + arg->index = index;
- + index += sizeof(njs_value_t);
- +
- + ret = njs_name_copy(vm, &arg->name, &parser->lexer->text);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + goto arrow;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
- +
- + if (nxt_slow_path(lambda->rest_parameters)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
- + lambda->rest_parameters = 1;
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + arg = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
- + if (nxt_slow_path(arg == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + arg->index = index;
- + index += sizeof(njs_value_t);
- +
- + ret = njs_name_copy(vm, &arg->name, &parser->lexer->text);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (token == NJS_TOKEN_COMMA) {
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- + }
- + }
- +
- +arrow:
- +
- + lambda->nargs = njs_scope_offset(index) / sizeof(njs_value_t) - 1;
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_ARROW)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + parent = parser->node;
- + parser->node = NULL;
- +
- + while (token != NJS_TOKEN_CLOSE_BRACE) {
- + token = njs_parser_statement_chain(vm, parser, token,
- + &njs_parser_chain_top(parser));
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + last = NULL;
- + body = njs_parser_chain_top(parser);
- +
- + if (body != NULL) {
- + /* Take the last function body statement. */
- + last = body->right;
- +
- + if (last == NULL) {
- + /*
- + * The last statement is terminated by semicolon.
- + * Take the last statement itself.
- + */
- + last = body->left;
- + }
- + }
- +
- + if (last == NULL || last->token != NJS_TOKEN_RETURN) {
- + /*
- + * There is no function body or the last function body
- + * body statement is not "return" statement.
- + */
- + return_node = njs_parser_node_new(vm, parser, NJS_TOKEN_RETURN);
- + if (nxt_slow_path(return_node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
- + if (nxt_slow_path(node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->left = body;
- + node->right = return_node;
- +
- + njs_parser_chain_top_set(parser, node);
- +
- + body = node;
- + }
- +
- + parent->right = body;
- +
- + parser->node = parent;
- +
- + njs_parser_scope_end(vm, parser);
- +
- + return token;
- +}
- +
- +
- njs_token_t
- njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- {
- double num;
- + ssize_t pos;
- njs_ret_t ret;
- njs_lexer_t *lexer;
- njs_parser_node_t *node;
- @@ -1881,6 +2075,32 @@ njs_parser_terminal(njs_vm_t *vm, njs_pa
- lexer = parser->lexer;
- if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- + pos = njs_lexer_match(vm, lexer, NJS_TOKEN_CLOSE_PARENTHESIS);
- + if (pos >= 0 && njs_lexer_peek_token(vm, lexer, pos + 1) == NJS_TOKEN_ARROW) {
- + return njs_parser_arrow_expression(vm, parser, token);
- + }
- + }
- +
- + if (token == NJS_TOKEN_NAME) {
- + if (njs_lexer_peek_token(vm, lexer, 0) == NJS_TOKEN_ARROW) {
- + return njs_parser_arrow_expression(vm, parser, token);
- + }
- + }
- +
- + if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- +
- + if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- + pos = njs_lexer_match(vm, lexer, NJS_TOKEN_CLOSE_PARENTHESIS);
- + if (pos >= 0 && njs_lexer_peek_token(vm, lexer, pos + 1) == NJS_TOKEN_ARROW) {
- + return njs_parser_arrow_expression(vm, parser, token);
- + }
- + }
- +
- + if (token == NJS_TOKEN_NAME) {
- + if (njs_lexer_peek_token(vm, lexer, 0) == NJS_TOKEN_ARROW) {
- + return njs_parser_arrow_expression(vm, parser, token);
- + }
- + }
- token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- diff -r 52960032fe56 -r 049c1a5fa4fa njs/njs_parser.h
- --- a/njs/njs_parser.h Mon Mar 04 16:34:42 2019 +0800
- +++ b/njs/njs_parser.h Wed Mar 06 01:25:25 2019 +0800
- @@ -36,6 +36,7 @@ typedef enum {
- NJS_TOKEN_CONDITIONAL,
- NJS_TOKEN_ASSIGNMENT,
- + NJS_TOKEN_ARROW,
- NJS_TOKEN_ADDITION_ASSIGNMENT,
- NJS_TOKEN_SUBSTRACTION_ASSIGNMENT,
- NJS_TOKEN_MULTIPLICATION_ASSIGNMENT,
- @@ -209,26 +210,33 @@ typedef enum {
- typedef struct {
- njs_token_t token:16;
- - njs_token_t prev_token:16;
- + uint32_t token_line;
- + uint32_t key_hash;
- + nxt_str_t text;
- + double number;
- +} njs_lexer_token_t;
- +
- +
- +typedef struct {
- + size_t pos;
- + nxt_array_t *preread;
- +
- + njs_token_t token:16;
- + uint32_t token_line;
- + uint32_t key_hash;
- + nxt_str_t text;
- + double number;
- uint8_t property; /* 1 bit */
- njs_token_t property_token:16;
- - uint32_t key_hash;
- -
- - uint32_t token_line;
- + u_char *start;
- + u_char *end;
- uint32_t line;
- -
- - nxt_str_t text;
- - double number;
- -
- + nxt_str_t file;
- nxt_lvlhsh_t keywords_hash;
- -
- - nxt_str_t file;
- -
- - u_char *start;
- u_char *prev_start;
- - u_char *end;
- + njs_token_t prev_token:16;
- } njs_lexer_t;
- @@ -307,12 +315,17 @@ typedef struct {
- } njs_keyword_t;
- +nxt_int_t njs_lexer_init(njs_vm_t *vm, njs_lexer_t *lexer, nxt_str_t *file,
- + u_char *start, u_char *end);
- njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer);
- -void njs_lexer_rollback(njs_lexer_t *lexer);
- -njs_token_t njs_lexer_peek_token(njs_lexer_t *lexer);
- +njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset);
- +ssize_t njs_lexer_match(njs_vm_t *vm, njs_lexer_t *lexer, njs_token_t token);
- nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
- void njs_lexer_keyword(njs_lexer_t *lexer);
- +#define njs_lexer_rollback(lexer) \
- + (lexer)->start = (lexer)->prev_start
- +
- nxt_int_t njs_parser(njs_vm_t *vm, njs_parser_t *parser,
- njs_parser_t *prev);
- njs_token_t njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser,
- diff -r 52960032fe56 -r 049c1a5fa4fa njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Mon Mar 04 16:34:42 2019 +0800
- +++ b/njs/test/njs_unit_test.c Wed Mar 06 01:25:25 2019 +0800
- @@ -99,6 +99,21 @@ static njs_unit_test_t njs_test[] =
- { nxt_string("var f = 1; function f() {}; f"),
- nxt_string("1") },
- + { nxt_string("var f = f => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = (f) => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = (f, a, b) => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = () => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("(f => {return 1;})()"),
- + nxt_string("1") },
- +
- #if 0 /* TODO */
- { nxt_string("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
- nxt_string("undefined") },
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551885105 -28800
- # Node ID 1f13e316a93cd44ffbe55ac319d77d0dca32ea37
- # Parent 049c1a5fa4fa9771031253616a6ced9163b52ccb
- arrow function 2.
- diff -r 049c1a5fa4fa -r 1f13e316a93c njs/njs_parser.c
- --- a/njs/njs_parser.c Wed Mar 06 01:25:25 2019 +0800
- +++ b/njs/njs_parser.c Wed Mar 06 23:11:45 2019 +0800
- @@ -1870,6 +1870,72 @@ njs_parser_token(njs_vm_t *vm, njs_parse
- }
- +static nxt_int_t
- +njs_parser_try_arrow_function(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- +{
- + size_t offset;
- + nxt_bool_t rest_parameters;
- +
- + offset = 0;
- +
- + if (token == NJS_TOKEN_NAME) {
- + goto arrow;
- + }
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- +
- + rest_parameters = 0;
- +
- + while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
- +
- + if (rest_parameters) {
- + return NXT_DECLINED;
- + }
- +
- + if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
- + rest_parameters = 1;
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
- + return NXT_DECLINED;
- + }
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (token == NJS_TOKEN_COMMA) {
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- + }
- + }
- +
- +arrow:
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_ARROW)) {
- + return NXT_DECLINED;
- + }
- +
- + return NXT_OK;
- +}
- +
- +
- static njs_token_t
- njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- {
- @@ -2067,41 +2133,19 @@ njs_token_t
- njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- {
- double num;
- - ssize_t pos;
- njs_ret_t ret;
- njs_lexer_t *lexer;
- njs_parser_node_t *node;
- lexer = parser->lexer;
- - if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- - pos = njs_lexer_match(vm, lexer, NJS_TOKEN_CLOSE_PARENTHESIS);
- - if (pos >= 0 && njs_lexer_peek_token(vm, lexer, pos + 1) == NJS_TOKEN_ARROW) {
- + if (token == NJS_TOKEN_OPEN_PARENTHESIS || token == NJS_TOKEN_NAME) {
- + if (njs_parser_try_arrow_function(vm, parser, token) == NXT_OK) {
- return njs_parser_arrow_expression(vm, parser, token);
- }
- }
- - if (token == NJS_TOKEN_NAME) {
- - if (njs_lexer_peek_token(vm, lexer, 0) == NJS_TOKEN_ARROW) {
- - return njs_parser_arrow_expression(vm, parser, token);
- - }
- - }
- -
- if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- -
- - if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- - pos = njs_lexer_match(vm, lexer, NJS_TOKEN_CLOSE_PARENTHESIS);
- - if (pos >= 0 && njs_lexer_peek_token(vm, lexer, pos + 1) == NJS_TOKEN_ARROW) {
- - return njs_parser_arrow_expression(vm, parser, token);
- - }
- - }
- -
- - if (token == NJS_TOKEN_NAME) {
- - if (njs_lexer_peek_token(vm, lexer, 0) == NJS_TOKEN_ARROW) {
- - return njs_parser_arrow_expression(vm, parser, token);
- - }
- - }
- -
- token = njs_parser_token(vm, parser);
- if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- return token;
- diff -r 049c1a5fa4fa -r 1f13e316a93c njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Wed Mar 06 01:25:25 2019 +0800
- +++ b/njs/test/njs_unit_test.c Wed Mar 06 23:11:45 2019 +0800
- @@ -114,6 +114,16 @@ static njs_unit_test_t njs_test[] =
- { nxt_string("(f => {return 1;})()"),
- nxt_string("1") },
- + { nxt_string("((f) => {return 1;})()"),
- + nxt_string("1") },
- +
- + { nxt_string("(((f) => {return 1;}))()"),
- + nxt_string("1") },
- +
- + { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium' ]; "
- + "materials.map(material => { return material.length; });"),
- + nxt_string("8,6,7,9") },
- +
- #if 0 /* TODO */
- { nxt_string("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
- nxt_string("undefined") },
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551939317 -28800
- # Node ID 81dce12c56612fcc8810aee81dae3a40886dde4e
- # Parent 5829884f0e956c7f85c7377305815f34fe59f8be
- LL(k): improved njs_lexer_peek_token().
- diff -r 5829884f0e95 -r 81dce12c5661 njs/njs_lexer.c
- --- a/njs/njs_lexer.c Thu Mar 07 14:04:37 2019 +0800
- +++ b/njs/njs_lexer.c Thu Mar 07 14:15:17 2019 +0800
- @@ -341,27 +341,43 @@ njs_lexer_token(njs_vm_t *vm, njs_lexer_
- njs_token_t
- -njs_lexer_peek_token(njs_lexer_t *lexer)
- +njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset)
- {
- - u_char *start;
- - njs_token_t token;
- + size_t i, n;
- + nxt_int_t ret;
- + nxt_array_t *preread;
- + njs_lexer_token_t *lt;
- - start = lexer->start;
- + lexer->prev_start = lexer->start;
- + lexer->prev_token = lexer->token;
- +
- + preread = lexer->preread;
- +
- + n = 0;
- +
- + offset = lexer->pos + offset;
- +
- + if (offset + 1 > preread->items) {
- + n = offset + 1 - preread->items;
- + }
- +
- + for (i = 0; i < n; i++) {
- - while (start < lexer->end) {
- - token = njs_tokens[*start++];
- + ret = njs_lexer_preread_token(vm, lexer);
- - switch (token) {
- - case NJS_TOKEN_SPACE:
- - case NJS_TOKEN_LINE_END:
- - continue;
- + if (ret == NXT_DECLINED) {
- + offset = preread->items;
- + break;
- + }
- - default:
- - return token;
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- }
- }
- - return NJS_TOKEN_END;
- + lt = nxt_array_item(preread, offset);
- +
- + return lt->token;
- }
- diff -r 5829884f0e95 -r 81dce12c5661 njs/njs_parser.c
- --- a/njs/njs_parser.c Thu Mar 07 14:04:37 2019 +0800
- +++ b/njs/njs_parser.c Thu Mar 07 14:15:17 2019 +0800
- @@ -365,7 +365,7 @@ njs_parser_statement(njs_vm_t *vm, njs_p
- default:
- if (token == NJS_TOKEN_NAME
- - && njs_lexer_peek_token(parser->lexer) == NJS_TOKEN_COLON)
- + && njs_lexer_peek_token(vm, parser->lexer, 0) == NJS_TOKEN_COLON)
- {
- return njs_parser_labelled_statement(vm, parser);
- }
- diff -r 5829884f0e95 -r 81dce12c5661 njs/njs_parser.h
- --- a/njs/njs_parser.h Thu Mar 07 14:04:37 2019 +0800
- +++ b/njs/njs_parser.h Thu Mar 07 14:15:17 2019 +0800
- @@ -316,7 +316,7 @@ nxt_int_t njs_lexer_init(njs_vm_t *vm, n
- u_char *start, u_char *end);
- njs_token_t njs_lexer_token(njs_vm_t *vm, njs_lexer_t *lexer);
- void njs_lexer_rollback(njs_lexer_t *lexer);
- -njs_token_t njs_lexer_peek_token(njs_lexer_t *lexer);
- +njs_token_t njs_lexer_peek_token(njs_vm_t *vm, njs_lexer_t *lexer, size_t offset);
- nxt_int_t njs_lexer_keywords_init(nxt_mp_t *mp, nxt_lvlhsh_t *hash);
- void njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt);
- # HG changeset patch
- # User hongzhidao <hongzhidao@gmail.com>
- # Date 1551941209 -28800
- # Node ID fd5fbf7c1a563212631d4fc1321b5843a40f8614
- # Parent 8094a62c38a4e060f26f6636f6a1e75abeacba14
- LL(k): introduced arrow function.
- diff -r 8094a62c38a4 -r fd5fbf7c1a56 njs/njs_lexer.c
- --- a/njs/njs_lexer.c Thu Mar 07 14:23:45 2019 +0800
- +++ b/njs/njs_lexer.c Thu Mar 07 14:46:49 2019 +0800
- @@ -270,6 +270,7 @@ static const njs_lexer_multi_t njs_grea
- static const njs_lexer_multi_t njs_assignment_token[] = {
- { '=', NJS_TOKEN_EQUAL, 1, njs_strict_equal_token },
- + { '>', NJS_TOKEN_ARROW, 0, NULL },
- };
- diff -r 8094a62c38a4 -r fd5fbf7c1a56 njs/njs_parser.c
- --- a/njs/njs_parser.c Thu Mar 07 14:23:45 2019 +0800
- +++ b/njs/njs_parser.c Thu Mar 07 14:46:49 2019 +0800
- @@ -1886,6 +1886,265 @@ njs_parser_token(njs_vm_t *vm, njs_parse
- }
- +static nxt_int_t
- +njs_parser_try_arrow_function(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- +{
- + size_t offset;
- + nxt_bool_t rest_parameters;
- +
- + offset = 0;
- +
- + if (token == NJS_TOKEN_NAME) {
- + goto arrow;
- + }
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- +
- + rest_parameters = 0;
- +
- + while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
- +
- + if (rest_parameters) {
- + return NXT_DECLINED;
- + }
- +
- + if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
- + rest_parameters = 1;
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
- + return NXT_DECLINED;
- + }
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (token == NJS_TOKEN_COMMA) {
- + token = njs_lexer_peek_token(vm, parser->lexer, offset++);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- + }
- + }
- +
- +arrow:
- +
- + token = njs_lexer_peek_token(vm, parser->lexer, offset);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NXT_DECLINED;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_ARROW)) {
- + return NXT_DECLINED;
- + }
- +
- + return NXT_OK;
- +}
- +
- +
- +static njs_token_t
- +njs_parser_arrow_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- +{
- + njs_ret_t ret;
- + njs_index_t index;
- + njs_variable_t *arg;
- + njs_parser_node_t *node, *body, *last, *parent, *return_node;
- + njs_function_lambda_t *lambda;
- +
- + node = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_EXPRESSION);
- + if (nxt_slow_path(node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->token_line = njs_parser_token_line(parser);
- + parser->node = node;
- +
- + lambda = nxt_mp_zalloc(vm->mem_pool, sizeof(njs_function_lambda_t));
- + if (nxt_slow_path(lambda == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->u.value.data.u.lambda = lambda;
- +
- + ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_FUNCTION);
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + index = NJS_SCOPE_ARGUMENTS;
- +
- + /* A "this" reservation. */
- + index += sizeof(njs_value_t);
- +
- + if (token == NJS_TOKEN_NAME) {
- + arg = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
- + if (nxt_slow_path(arg == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + arg->index = index;
- + index += sizeof(njs_value_t);
- +
- + ret = njs_name_copy(vm, &arg->name, njs_parser_text(parser));
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + goto arrow;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + while (token != NJS_TOKEN_CLOSE_PARENTHESIS) {
- +
- + if (nxt_slow_path(lambda->rest_parameters)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + if (nxt_slow_path(token == NJS_TOKEN_ELLIPSIS)) {
- + lambda->rest_parameters = 1;
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_NAME)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + arg = njs_parser_variable_add(vm, parser, NJS_VARIABLE_VAR);
- + if (nxt_slow_path(arg == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + arg->index = index;
- + index += sizeof(njs_value_t);
- +
- + ret = njs_name_copy(vm, &arg->name, njs_parser_text(parser));
- + if (nxt_slow_path(ret != NXT_OK)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (token == NJS_TOKEN_COMMA) {
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- + }
- + }
- +
- +arrow:
- +
- + lambda->nargs = njs_scope_offset(index) / sizeof(njs_value_t) - 1;
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_ARROW)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + if (nxt_slow_path(token != NJS_TOKEN_OPEN_BRACE)) {
- + return NJS_TOKEN_ILLEGAL;
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + parent = parser->node;
- + parser->node = NULL;
- +
- + while (token != NJS_TOKEN_CLOSE_BRACE) {
- + token = njs_parser_statement_chain(vm, parser, token,
- + &njs_parser_chain_top(parser));
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- + }
- +
- + token = njs_parser_token(vm, parser);
- + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
- + return token;
- + }
- +
- + last = NULL;
- + body = njs_parser_chain_top(parser);
- +
- + if (body != NULL) {
- + /* Take the last function body statement. */
- + last = body->right;
- +
- + if (last == NULL) {
- + /*
- + * The last statement is terminated by semicolon.
- + * Take the last statement itself.
- + */
- + last = body->left;
- + }
- + }
- +
- + if (last == NULL || last->token != NJS_TOKEN_RETURN) {
- + /*
- + * There is no function body or the last function body
- + * body statement is not "return" statement.
- + */
- + return_node = njs_parser_node_new(vm, parser, NJS_TOKEN_RETURN);
- + if (nxt_slow_path(return_node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT);
- + if (nxt_slow_path(node == NULL)) {
- + return NJS_TOKEN_ERROR;
- + }
- +
- + node->left = body;
- + node->right = return_node;
- +
- + njs_parser_chain_top_set(parser, node);
- +
- + body = node;
- + }
- +
- + parent->right = body;
- +
- + parser->node = parent;
- +
- + njs_parser_scope_end(vm, parser);
- +
- + return token;
- +}
- +
- +
- njs_token_t
- njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
- {
- @@ -1896,6 +2155,12 @@ njs_parser_terminal(njs_vm_t *vm, njs_pa
- lexer = parser->lexer;
- + if (token == NJS_TOKEN_OPEN_PARENTHESIS || token == NJS_TOKEN_NAME) {
- + if (njs_parser_try_arrow_function(vm, parser, token) == NXT_OK) {
- + return njs_parser_arrow_expression(vm, parser, token);
- + }
- + }
- +
- if (token == NJS_TOKEN_OPEN_PARENTHESIS) {
- token = njs_parser_token(vm, parser);
- diff -r 8094a62c38a4 -r fd5fbf7c1a56 njs/njs_parser.h
- --- a/njs/njs_parser.h Thu Mar 07 14:23:45 2019 +0800
- +++ b/njs/njs_parser.h Thu Mar 07 14:46:49 2019 +0800
- @@ -36,6 +36,7 @@ typedef enum {
- NJS_TOKEN_CONDITIONAL,
- NJS_TOKEN_ASSIGNMENT,
- + NJS_TOKEN_ARROW,
- NJS_TOKEN_ADDITION_ASSIGNMENT,
- NJS_TOKEN_SUBSTRACTION_ASSIGNMENT,
- NJS_TOKEN_MULTIPLICATION_ASSIGNMENT,
- diff -r 8094a62c38a4 -r fd5fbf7c1a56 njs/test/njs_unit_test.c
- --- a/njs/test/njs_unit_test.c Thu Mar 07 14:23:45 2019 +0800
- +++ b/njs/test/njs_unit_test.c Thu Mar 07 14:46:49 2019 +0800
- @@ -99,6 +99,31 @@ static njs_unit_test_t njs_test[] =
- { nxt_string("var f = 1; function f() {}; f"),
- nxt_string("1") },
- + { nxt_string("var f = f => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = (f) => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = (f, a, b) => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("var f = () => {return 1;}; f()"),
- + nxt_string("1") },
- +
- + { nxt_string("(f => {return 1;})()"),
- + nxt_string("1") },
- +
- + { nxt_string("((f) => {return 1;})()"),
- + nxt_string("1") },
- +
- + { nxt_string("(((f) => {return 1;}))()"),
- + nxt_string("1") },
- +
- + { nxt_string("var materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium' ]; "
- + "materials.map(material => { return material.length; });"),
- + nxt_string("8,6,7,9") },
- +
- #if 0 /* TODO */
- { nxt_string("var a; Object.getOwnPropertyDescriptor(this, 'a').value"),
- nxt_string("undefined") },
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement