Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created February 8, 2019 16:12
Show Gist options
  • Save xeioex/2ee68d88aad9fdccb0e58a6c4f862260 to your computer and use it in GitHub Desktop.
Save xeioex/2ee68d88aad9fdccb0e58a6c4f862260 to your computer and use it in GitHub Desktop.
# 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