From: hongzhidao Date: Thu, 20 Jun 2019 11:36:57 +0000 (-0400) Subject: Getting rid of lexer property and property_token. X-Git-Tag: 0.3.3~4 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=343bb175dbd9ff982b83f47d00948128744fab0d;p=njs.git Getting rid of lexer property and property_token. --- diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c index c1b3d551..a05c9a45 100644 --- a/njs/njs_lexer.c +++ b/njs/njs_lexer.c @@ -420,11 +420,6 @@ njs_lexer_token_name_resolve(njs_lexer_t *lexer, njs_lexer_token_t *lt) { if (lt->token == NJS_TOKEN_NAME) { njs_lexer_keyword(lexer, lt); - - if (lexer->property) { - lexer->property_token = lt->token; - lt->token = NJS_TOKEN_NAME; - } } return lt->token; diff --git a/njs/njs_lexer.h b/njs/njs_lexer.h index 159952af..a79a5827 100644 --- a/njs/njs_lexer.h +++ b/njs/njs_lexer.h @@ -231,13 +231,11 @@ typedef struct { typedef struct { njs_lexer_token_t *lexer_token; nxt_queue_t preread; /* of njs_lexer_token_t */ + uint8_t keyword; u_char *prev_start; njs_token_t prev_token:16; - uint8_t property; /* 1 bit */ - njs_token_t property_token:16; - uint32_t line; nxt_str_t file; diff --git a/njs/njs_lexer_keyword.c b/njs/njs_lexer_keyword.c index 0a827574..afe225f2 100644 --- a/njs/njs_lexer_keyword.c +++ b/njs/njs_lexer_keyword.c @@ -191,5 +191,6 @@ njs_lexer_keyword(njs_lexer_t *lexer, njs_lexer_token_t *lt) keyword = lhq.value; lt->token = keyword->token; lt->number = keyword->number; + lexer->keyword = 1; } } diff --git a/njs/njs_parser.c b/njs/njs_parser.c index 3ad9f551..1a05dec1 100644 --- a/njs/njs_parser.c +++ b/njs/njs_parser.c @@ -2064,37 +2064,6 @@ njs_parser_grouping_expression(njs_vm_t *vm, njs_parser_t *parser) } -njs_token_t -njs_parser_property_token(njs_vm_t *vm, njs_parser_t *parser) -{ - nxt_int_t ret; - njs_token_t token; - njs_parser_node_t *node; - - parser->lexer->property = 1; - - token = njs_parser_token(vm, parser); - - parser->lexer->property = 0; - - if (token == NJS_TOKEN_NAME) { - node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING); - if (nxt_slow_path(node == NULL)) { - return NJS_TOKEN_ERROR; - } - - ret = njs_parser_string_create(vm, &node->u.value); - if (nxt_slow_path(ret != NXT_OK)) { - return NJS_TOKEN_ERROR; - } - - parser->node = node; - } - - return token; -} - - nxt_int_t njs_parser_match_arrow_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) diff --git a/njs/njs_parser.h b/njs/njs_parser.h index 1a8de718..b4677a8b 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -94,7 +94,6 @@ njs_token_t njs_parser_template_literal(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *parent); njs_parser_node_t *njs_parser_argument(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *expr, njs_index_t index); -njs_token_t njs_parser_property_token(njs_vm_t *vm, njs_parser_t *parser); nxt_int_t njs_parser_string_create(njs_vm_t *vm, njs_value_t *value); njs_token_t njs_parser_lambda_statements(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); @@ -187,6 +186,26 @@ njs_parser_node_new(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) } +nxt_inline njs_parser_node_t * +njs_parser_node_string(njs_vm_t *vm, njs_parser_t *parser) +{ + nxt_int_t ret; + njs_parser_node_t *node; + + node = njs_parser_node_new(vm, parser, NJS_TOKEN_STRING); + if (nxt_slow_path(node == NULL)) { + return NULL; + } + + ret = njs_parser_string_create(vm, &node->u.value); + if (nxt_slow_path(ret != NXT_OK)) { + return NULL; + } + + return node; +} + + nxt_inline njs_token_t njs_parser_match(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token, njs_token_t match) diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c index 95ab481c..f7e629a6 100644 --- a/njs/njs_parser_expression.c +++ b/njs/njs_parser_expression.c @@ -884,7 +884,7 @@ static njs_token_t njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { - njs_parser_node_t *node; + njs_parser_node_t *node, *prop_node; for ( ;; ) { if (token != NJS_TOKEN_DOT @@ -902,17 +902,21 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser, node->left = parser->node; if (token == NJS_TOKEN_DOT) { + token = njs_parser_token(vm, parser); - token = njs_parser_property_token(vm, parser); - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; + if (token != NJS_TOKEN_NAME && !parser->lexer->keyword) { + return NJS_TOKEN_ILLEGAL; } - if (token != NJS_TOKEN_NAME) { - return NJS_TOKEN_ILLEGAL; + prop_node = njs_parser_node_string(vm, parser); + if (nxt_slow_path(prop_node == NULL)) { + return NJS_TOKEN_ERROR; } token = njs_parser_token(vm, parser); + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } } else { token = njs_parser_token(vm, parser); @@ -921,13 +925,14 @@ njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser, } token = njs_parser_property_brackets(vm, parser, token); - } + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; + prop_node = parser->node; } - node->right = parser->node; + node->right = prop_node; parser->node = node; } } diff --git a/njs/njs_parser_terminal.c b/njs/njs_parser_terminal.c index c5ef1912..7baaec6d 100644 --- a/njs/njs_parser_terminal.c +++ b/njs/njs_parser_terminal.c @@ -488,7 +488,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) uint32_t hash, token_line; nxt_int_t ret; nxt_str_t name; - njs_token_t token; + njs_token_t token, prop_token; njs_lexer_t *lexer; njs_parser_node_t *object, *property, *expression; @@ -506,54 +506,69 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) object->u.object = obj; for ( ;; ) { - token = njs_parser_property_token(vm, parser); - - if (token == NJS_TOKEN_CLOSE_BRACE) { - break; + prop_token = njs_parser_token(vm, parser); + if (nxt_slow_path(prop_token <= NJS_TOKEN_ILLEGAL)) { + return prop_token; } - name.start = NULL; + nxt_memzero(&name, sizeof(nxt_str_t)); - switch (token) { - - case NJS_TOKEN_NAME: - name = *njs_parser_text(parser); + switch (prop_token) { - hash = njs_parser_key_hash(parser); - token_line = njs_parser_token_line(parser); - - token = njs_parser_token(vm, parser); - break; + case NJS_TOKEN_CLOSE_BRACE: + goto done; case NJS_TOKEN_NUMBER: case NJS_TOKEN_STRING: case NJS_TOKEN_ESCAPE_STRING: - token = njs_parser_terminal(vm, parser, token); + token = njs_parser_terminal(vm, parser, prop_token); + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } + + property = parser->node; break; default: - return NJS_TOKEN_ILLEGAL; - } + if (prop_token != NJS_TOKEN_NAME && !lexer->keyword) { + return NJS_TOKEN_ILLEGAL; + } - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; + property = njs_parser_node_string(vm, parser); + if (nxt_slow_path(property == NULL)) { + return NJS_TOKEN_ERROR; + } + + name = *njs_parser_text(parser); + hash = njs_parser_key_hash(parser); + token_line = njs_parser_token_line(parser); + + token = njs_parser_token(vm, parser); + break; } - property = parser->node; + switch (token) { + + case NJS_TOKEN_COMMA: + case NJS_TOKEN_CLOSE_BRACE: + + if (name.length == 0 + || prop_token == NJS_TOKEN_THIS + || prop_token == NJS_TOKEN_GLOBAL_THIS) + { + return NJS_TOKEN_ILLEGAL; + } - if (name.start != NULL - && (token == NJS_TOKEN_COMMA || token == NJS_TOKEN_CLOSE_BRACE) - && lexer->property_token != NJS_TOKEN_THIS - && lexer->property_token != NJS_TOKEN_GLOBAL_THIS) - { - expression = njs_parser_reference(vm, parser, lexer->property_token, - &name, hash, token_line); + expression = njs_parser_reference(vm, parser, prop_token, &name, + hash, token_line); if (nxt_slow_path(expression == NULL)) { return NJS_TOKEN_ERROR; } - } else { - token = njs_parser_match(vm, parser, token, NJS_TOKEN_COLON); + break; + + case NJS_TOKEN_COLON: + token = njs_parser_token(vm, parser); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -564,6 +579,10 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) } expression = parser->node; + break; + + default: + return NJS_TOKEN_ILLEGAL; } ret = njs_parser_object_property(vm, parser, obj, property, expression); @@ -580,6 +599,8 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) } } +done: + parser->node = obj; return njs_parser_token(vm, parser);