This closes #146 issue on Github.
static njs_int_t
-njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
+njs_generate(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
{
if (node == NULL) {
return NJS_OK;
}
+njs_inline njs_int_t
+njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
+{
+ njs_int_t ret;
+
+ if (njs_slow_path(generator->count++ > 1024)) {
+ njs_range_error(vm, "Maximum call stack size exceeded");
+ return NJS_ERROR;
+ }
+
+ ret = njs_generate(vm, generator, node);
+
+ generator->count--;
+
+ return ret;
+}
+
+
static u_char *
njs_generate_reserve(njs_vm_t *vm, njs_generator_t *generator, size_t size)
{
/* Parsing Function() or eval(). */
uint8_t runtime; /* 1 bit */
+
+ njs_uint_t count;
};
node->token = NJS_TOKEN_END;
+ if (njs_slow_path(parser->count != 0)) {
+ njs_internal_error(vm, "parser->count != 0");
+ return NJS_ERROR;
+ }
+
return NJS_OK;
}
last = *child;
+ njs_parser_enter(vm, parser);
+
token = njs_parser_statement(vm, parser, token);
+
+ njs_parser_leave(parser);
+
if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return njs_parser_unexpected_token(vm, parser, token);
}
njs_lexer_t *lexer;
njs_parser_node_t *node;
njs_parser_scope_t *scope;
+ njs_uint_t count;
};
njs_value_type_t type, const char *fmt, ...);
+#define njs_parser_enter(vm, parser) \
+ do { \
+ if (njs_slow_path((parser)->count++ > 1024)) { \
+ njs_range_error(vm, "Maximum call stack size exceeded"); \
+ return NJS_TOKEN_ERROR; \
+ } \
+ } while (0)
+
+
+#define njs_parser_leave(parser) ((parser)->count--)
+
+
#define njs_parser_is_lvalue(node) \
((node)->token == NJS_TOKEN_NAME || (node)->token == NJS_TOKEN_PROPERTY)
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)) {
return token;
}
+ njs_parser_enter(vm, parser);
+
token = njs_parser_call(vm, parser, token, 0);
+
+ njs_parser_leave(parser);
+
if (njs_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
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)) {
return token;
}