From: Dmitry Volyntsev Date: Tue, 27 Aug 2019 13:31:00 +0000 (+0300) Subject: Limiting recursion depth while compiling unary expressions. X-Git-Url: http://git.kaiwu.me/sitemap.xml?a=commitdiff_plain;h=8c7cbec2f63f93f0df618b3c8bbda403740cca4c;p=njs.git Limiting recursion depth while compiling unary expressions. This extends 8057f3ad56c1 and is related to #146 issue on Github. --- diff --git a/src/njs_parser_expression.c b/src/njs_parser_expression.c index e46a81f9..5507c6be 100644 --- a/src/njs_parser_expression.c +++ b/src/njs_parser_expression.c @@ -225,7 +225,12 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *node; njs_vmcode_operation_t operation; + njs_parser_enter(vm, parser); + token = njs_parser_conditional_expression(vm, parser, token); + + njs_parser_leave(parser); + if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -332,7 +337,12 @@ njs_parser_assignment_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } + njs_parser_enter(vm, parser); + token = njs_parser_assignment_expression(vm, parser, token); + + njs_parser_leave(parser); + if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -494,7 +504,12 @@ njs_parser_exponential_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } + njs_parser_enter(vm, parser); + token = njs_parser_exponential_expression(vm, parser, NULL, token); + + njs_parser_leave(parser); + if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -558,7 +573,12 @@ njs_parser_unary_expression(njs_vm_t *vm, njs_parser_t *parser, return next; } + njs_parser_enter(vm, parser); + next = njs_parser_unary_expression(vm, parser, NULL, next); + + njs_parser_leave(parser); + if (njs_slow_path(next <= NJS_TOKEN_ILLEGAL)) { return next; } @@ -740,17 +760,17 @@ static njs_token_t njs_parser_call_expression(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token) { + njs_parser_enter(vm, parser); + if (token == NJS_TOKEN_NEW) { token = njs_parser_new_expression(vm, parser, token); } else { - njs_parser_enter(vm, parser); - token = njs_parser_terminal(vm, parser, token); - - njs_parser_leave(parser); } + njs_parser_leave(parser); + if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; } @@ -868,23 +888,23 @@ njs_parser_new_expression(njs_vm_t *vm, njs_parser_t *parser, return token; } + njs_parser_enter(vm, parser); + if (token == NJS_TOKEN_NEW) { token = njs_parser_new_expression(vm, parser, token); } else { - njs_parser_enter(vm, parser); - token = njs_parser_terminal(vm, parser, token); - - njs_parser_leave(parser); - if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { + njs_parser_leave(parser); return token; } token = njs_parser_property_expression(vm, parser, token); } + njs_parser_leave(parser); + if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) { return token; }