From: hongzhidao Date: Wed, 3 Apr 2019 03:27:05 +0000 (+0800) Subject: Refactored njs_parser_call_expression(). X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=c2b6c6f055426e2e5cfb84495489da6cad693c6b;p=njs.git Refactored njs_parser_call_expression(). --- diff --git a/njs/njs_parser.h b/njs/njs_parser.h index ad67f99a..300bb500 100644 --- a/njs/njs_parser.h +++ b/njs/njs_parser.h @@ -87,6 +87,8 @@ njs_token_t njs_parser_function_expression(njs_vm_t *vm, njs_parser_t *parser); njs_token_t njs_parser_module_lambda(njs_vm_t *vm, njs_parser_t *parser); njs_token_t njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); +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, diff --git a/njs/njs_parser_expression.c b/njs/njs_parser_expression.c index 7e21c445..72f54900 100644 --- a/njs/njs_parser_expression.c +++ b/njs/njs_parser_expression.c @@ -62,6 +62,8 @@ static njs_token_t njs_parser_property_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); static njs_token_t njs_parser_property_brackets(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token); +static njs_token_t njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token, uint8_t ctor); static njs_token_t njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *parent); @@ -787,8 +789,6 @@ static njs_token_t njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { - njs_parser_node_t *func, *node; - if (token == NJS_TOKEN_NEW) { token = njs_parser_new_expression(vm, parser, token); @@ -806,66 +806,11 @@ njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } - node = parser->node; - if (token != NJS_TOKEN_OPEN_PARENTHESIS) { return token; } - switch (node->token) { - - case NJS_TOKEN_NAME: - func = node; - func->token = NJS_TOKEN_FUNCTION_CALL; - func->scope = parser->scope; - - break; - - case NJS_TOKEN_PROPERTY: - func = njs_parser_node_new(vm, parser, NJS_TOKEN_METHOD_CALL); - if (nxt_slow_path(func == NULL)) { - return NJS_TOKEN_ERROR; - } - - func->left = node; - - break; - - default: - /* - * NJS_TOKEN_METHOD_CALL, - * NJS_TOKEN_FUNCTION_CALL, - * NJS_TOKEN_FUNCTION_EXPRESSION, - * NJS_TOKEN_OPEN_PARENTHESIS, - * NJS_TOKEN_OBJECT_CONSTRUCTOR, - * NJS_TOKEN_ARRAY_CONSTRUCTOR, - * NJS_TOKEN_BOOLEAN_CONSTRUCTOR, - * NJS_TOKEN_NUMBER_CONSTRUCTOR, - * NJS_TOKEN_STRING_CONSTRUCTOR, - * NJS_TOKEN_FUNCTION_CONSTRUCTOR, - * NJS_TOKEN_REGEXP_CONSTRUCTOR, - * NJS_TOKEN_EVAL. - */ - func = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_CALL); - if (nxt_slow_path(func == NULL)) { - return NJS_TOKEN_ERROR; - } - - func->left = node; - - break; - } - - func->ctor = 0; - - token = njs_parser_arguments(vm, parser, func); - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } - - parser->node = func; - - token = njs_parser_token(vm, parser); + token = njs_parser_call(vm, parser, token, 0); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -874,32 +819,11 @@ njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser, static njs_token_t -njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser, - njs_token_t token) +njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token, + uint8_t ctor) { njs_parser_node_t *func, *node; - token = njs_parser_token(vm, parser); - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } - - if (token == NJS_TOKEN_NEW) { - token = njs_parser_new_expression(vm, parser, token); - - } else { - token = njs_parser_terminal(vm, parser, token); - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } - - token = njs_parser_property_expression(vm, parser, token); - } - - if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { - return token; - } - node = parser->node; switch (node->token) { @@ -945,21 +869,54 @@ njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser, break; } - func->ctor = 1; + func->ctor = ctor; - if (token != NJS_TOKEN_OPEN_PARENTHESIS) { - parser->node = func; - return token; + switch (token) { + + case NJS_TOKEN_OPEN_PARENTHESIS: + token = njs_parser_arguments(vm, parser, func); + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } + + break; + + default: + break; } - token = njs_parser_arguments(vm, parser, func); + parser->node = func; + + return token; +} + + +static njs_token_t +njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser, + njs_token_t token) +{ + token = njs_parser_token(vm, parser); if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } - parser->node = func; + if (token == NJS_TOKEN_NEW) { + token = njs_parser_new_expression(vm, parser, token); - return njs_parser_token(vm, parser); + } else { + token = njs_parser_terminal(vm, parser, token); + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } + + token = njs_parser_property_expression(vm, parser, token); + } + + if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + return token; + } + + return njs_parser_call(vm, parser, token, 1); } @@ -1058,24 +1015,41 @@ njs_parser_arguments(njs_vm_t *vm, njs_parser_t *parser, return token; } - node = njs_parser_node_new(vm, parser, NJS_TOKEN_ARGUMENT); + node = njs_parser_argument(vm, parser, parser->node, index); if (nxt_slow_path(node == NULL)) { return NJS_TOKEN_ERROR; } - node->index = index; - index += sizeof(njs_value_t); - - node->left = parser->node; - parser->node->dest = node; parent->right = node; parent = node; + index += sizeof(njs_value_t); + } while (token == NJS_TOKEN_COMMA); if (nxt_slow_path(token != NJS_TOKEN_CLOSE_PARENTHESIS)) { return NJS_TOKEN_ILLEGAL; } - return token; + return njs_parser_token(vm, parser); +} + + +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_parser_node_t *node; + + node = njs_parser_node_new(vm, parser, NJS_TOKEN_ARGUMENT); + if (nxt_slow_path(node == NULL)) { + return NULL; + } + + node->index = index; + + node->left = expr; + expr->dest = node; + + return node; }