}
+njs_token_t
+njs_parser_property_token(njs_parser_t *parser)
+{
+ njs_token_t token;
+
+ parser->lexer->property = 1;
+
+ token = njs_parser_token(parser);
+
+ parser->lexer->property = 0;
+
+ return token;
+}
+
+
njs_token_t
njs_parser_token(njs_parser_t *parser)
{
left = NULL;
for ( ;; ) {
- token = njs_parser_token(parser);
+ token = njs_parser_property_token(parser);
switch (token) {
typedef struct {
njs_token_t token:8;
njs_token_t prev_token:8;
+ uint8_t property; /* 1 bit */
uint32_t key_hash;
nxt_str_t text;
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_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);
njs_index_t njs_parser_index(njs_parser_t *parser, uint32_t scope);
njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser,
njs_token_t token)
{
- njs_token_t next;
njs_parser_node_t *node;
for ( ;; ) {
node->u.operation = njs_vmcode_property_get;
node->left = parser->node;
- next = njs_parser_token(parser);
- if (nxt_slow_path(next <= NJS_TOKEN_ILLEGAL)) {
- return next;
- }
-
if (token == NJS_TOKEN_DOT) {
- if (next != NJS_TOKEN_NAME) {
+ token = njs_parser_property_token(parser);
+ if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+ return token;
+ }
+
+ if (token != NJS_TOKEN_NAME) {
return NJS_TOKEN_ILLEGAL;
}
- token = njs_parser_property_name(vm, parser, next);
+ token = njs_parser_property_name(vm, parser, token);
} else {
- token = njs_parser_property_brackets(vm, parser, next);
+ token = njs_parser_token(parser);
+ if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+ return token;
+ }
+
+ token = njs_parser_property_brackets(vm, parser, token);
}
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
"var o = { a: 5, '[object Object]': 7 }; o[n]"),
nxt_string("7") },
+ { nxt_string("var o = {}; o.new = 'OK'; o.new"),
+ nxt_string("OK") },
+
+ { nxt_string("var o = { new: 'OK'}; o.new"),
+ nxt_string("OK") },
+
/* Arrays */
/* Empty array to primitive. */