Created
February 8, 2019 16:12
-
-
Save xeioex/2ee68d88aad9fdccb0e58a6c4f862260 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # HG changeset patch | |
| # User Dmitry Volyntsev <[email protected]> | |
| # Date 1549636866 -10800 | |
| # Fri Feb 08 17:41:06 2019 +0300 | |
| # Node ID a6737eef8a6477b6647cccf87dcef839d9581fd5 | |
| # Parent 2feb1b5a210db571be3bcc811e68161c7d755f3f | |
| Removing unused argument of njs_parser_property_name(). | |
| diff --git a/njs/njs_parser.c b/njs/njs_parser.c | |
| --- a/njs/njs_parser.c | |
| +++ b/njs/njs_parser.c | |
| @@ -2191,7 +2191,7 @@ njs_parser_object(njs_vm_t *vm, njs_pars | |
| return njs_parser_token(parser); | |
| case NJS_TOKEN_NAME: | |
| - token = njs_parser_property_name(vm, parser, token); | |
| + token = njs_parser_property_name(vm, parser); | |
| break; | |
| case NJS_TOKEN_NUMBER: | |
| diff --git a/njs/njs_parser.h b/njs/njs_parser.h | |
| --- a/njs/njs_parser.h | |
| +++ b/njs/njs_parser.h | |
| @@ -320,8 +320,7 @@ njs_token_t njs_parser_assignment_expres | |
| njs_parser_t *parser, njs_token_t token); | |
| njs_token_t njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, | |
| njs_token_t token); | |
| -njs_token_t njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser, | |
| - njs_token_t token); | |
| +njs_token_t njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser); | |
| njs_token_t njs_parser_property_token(njs_parser_t *parser); | |
| njs_token_t njs_parser_token(njs_parser_t *parser); | |
| nxt_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value); | |
| diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c | |
| --- a/njs/njs_parser_expression.c | |
| +++ b/njs/njs_parser_expression.c | |
| @@ -993,7 +993,7 @@ njs_parser_property_expression(njs_vm_t | |
| return NJS_TOKEN_ILLEGAL; | |
| } | |
| - token = njs_parser_property_name(vm, parser, token); | |
| + token = njs_parser_property_name(vm, parser); | |
| } else { | |
| token = njs_parser_token(parser); | |
| @@ -1015,7 +1015,7 @@ njs_parser_property_expression(njs_vm_t | |
| njs_token_t | |
| -njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) | |
| +njs_parser_property_name(njs_vm_t *vm, njs_parser_t *parser) | |
| { | |
| nxt_int_t ret; | |
| njs_parser_node_t *node; | |
| # HG changeset patch | |
| # User Dmitry Volyntsev <[email protected]> | |
| # Date 1549642217 -10800 | |
| # Fri Feb 08 19:10:17 2019 +0300 | |
| # Node ID 9cb490972368381633c00fece4351aac0c5ac11f | |
| # Parent a6737eef8a6477b6647cccf87dcef839d9581fd5 | |
| Added support for shorthand property names for Object literals. | |
| diff --git a/njs/njs_parser.c b/njs/njs_parser.c | |
| --- a/njs/njs_parser.c | |
| +++ b/njs/njs_parser.c | |
| @@ -2167,11 +2167,23 @@ njs_parser_builtin_function(njs_vm_t *vm | |
| } | |
| +/* | |
| + * ES6: 12.2.6 Object Initializer | |
| + * Supported syntax: | |
| + * PropertyDefinition: | |
| + * PropertyName : AssignmentExpression | |
| + * IdentifierReference | |
| + * PropertyName: | |
| + * IdentifierName, StringLiteral, NumericLiteral. | |
| + */ | |
| static njs_token_t | |
| njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) | |
| { | |
| - njs_token_t token; | |
| - njs_parser_node_t *stmt, *assign, *object, *propref, *left; | |
| + uint32_t hash; | |
| + nxt_str_t name; | |
| + njs_ret_t ret; | |
| + njs_token_t token, start; | |
| + njs_parser_node_t *stmt, *assign, *object, *propref, *left, *expression; | |
| left = NULL; | |
| @@ -2184,6 +2196,7 @@ njs_parser_object(njs_vm_t *vm, njs_pars | |
| for ( ;; ) { | |
| token = njs_parser_property_token(parser); | |
| + start = token; | |
| switch (token) { | |
| @@ -2191,6 +2204,8 @@ njs_parser_object(njs_vm_t *vm, njs_pars | |
| return njs_parser_token(parser); | |
| case NJS_TOKEN_NAME: | |
| + name = parser->lexer->text; | |
| + hash = parser->lexer->key_hash; | |
| token = njs_parser_property_name(vm, parser); | |
| break; | |
| @@ -2216,14 +2231,32 @@ njs_parser_object(njs_vm_t *vm, njs_pars | |
| propref->left = object; | |
| propref->right = parser->node; | |
| - token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON); | |
| - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { | |
| - return token; | |
| - } | |
| - | |
| - token = njs_parser_assignment_expression(vm, parser, token); | |
| - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { | |
| - return token; | |
| + if (start == NJS_TOKEN_NAME | |
| + && (token == NJS_TOKEN_COMMA || token == NJS_TOKEN_CLOSE_BRACE)) | |
| + { | |
| + expression = njs_parser_node_new(vm, parser, NJS_TOKEN_NAME); | |
| + if (nxt_slow_path(expression == NULL)) { | |
| + return NJS_TOKEN_ERROR; | |
| + } | |
| + | |
| + ret = njs_variable_reference(vm, parser->scope, expression, &name, | |
| + hash, NJS_REFERENCE); | |
| + if (nxt_slow_path(ret != NXT_OK)) { | |
| + return NJS_TOKEN_ERROR; | |
| + } | |
| + | |
| + } else { | |
| + token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON); | |
| + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { | |
| + return token; | |
| + } | |
| + | |
| + token = njs_parser_assignment_expression(vm, parser, token); | |
| + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { | |
| + return token; | |
| + } | |
| + | |
| + expression = parser->node; | |
| } | |
| assign = njs_parser_node_new(vm, parser, NJS_TOKEN_ASSIGNMENT); | |
| @@ -2233,7 +2266,7 @@ njs_parser_object(njs_vm_t *vm, njs_pars | |
| assign->u.operation = njs_vmcode_move; | |
| assign->left = propref; | |
| - assign->right = parser->node; | |
| + assign->right = expression; | |
| stmt = njs_parser_node_new(vm, parser, NJS_TOKEN_STATEMENT); | |
| if (nxt_slow_path(stmt == NULL)) { | |
| diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c | |
| --- a/njs/test/njs_unit_test.c | |
| +++ b/njs/test/njs_unit_test.c | |
| @@ -2770,6 +2770,23 @@ static njs_unit_test_t njs_test[] = | |
| { nxt_string("delete undefined"), | |
| nxt_string("SyntaxError: Delete of an unqualified identifier in 1") }, | |
| + /* Shorthand Object literals. */ | |
| + | |
| + { nxt_string("var a = 1; njs.dump({a})"), | |
| + nxt_string("{a:1}") }, | |
| + | |
| + { nxt_string("var a = 1, b = 2; njs.dump({a,b})"), | |
| + nxt_string("{a:1,b:2}") }, | |
| + | |
| + { nxt_string("var a = 1, b = 2; njs.dump({a,b,c})"), | |
| + nxt_string("ReferenceError: \"c\" is not defined in 1") }, | |
| + | |
| + { nxt_string("var a = 1, b = 2; njs.dump({a,b,c:3})"), | |
| + nxt_string("{a:1,b:2,c:3}") }, | |
| + | |
| + { nxt_string("var b = 2, c = 3; njs.dump({a:1,b,c})"), | |
| + nxt_string("{a:1,b:2,c:3}") }, | |
| + | |
| /* ES5FIX: "SyntaxError". */ | |
| { nxt_string("delete NaN"), |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment