--- parser3/src/include/pa_request.h 2026/09/25 17:03:52 1.275 +++ parser3/src/include/pa_request.h 2026/10/01 12:46:17 1.281 @@ -8,10 +8,11 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.275 2026/09/25 17:03:52 moko Exp $" +#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.281 2026/10/01 12:46:17 moko Exp $" #include "pa_pool.h" #include "pa_hash.h" +#include "pa_file.h" #include "pa_wcontext.h" #include "pa_value.h" #include "pa_vhash.h" @@ -147,6 +148,8 @@ private: /// endless execute(execute(... preventing counter int anti_endless_execute_recursion; + int execute_recursion_limit; + void recursion_limit_reached(); ///@} @@ -243,14 +246,18 @@ public: /// execute ops with anti-recursion check void recursion_checked_execute(ArrayOperation& ops) { - if(++anti_endless_execute_recursion>=pa_execute_recursion_limit) { - anti_endless_execute_recursion=0; // give @exception a chance - throw Exception(PARSER_RUNTIME, 0, "call canceled - endless recursion detected"); - } + if(++anti_endless_execute_recursion>=execute_recursion_limit) + recursion_limit_reached(); execute(ops); // execute it anti_endless_execute_recursion--; } + /// take the recovery reserve back if recursion limit is far enough + void recursion_limit_try_restore() { + if(execute_recursion_limit>pa_execute_recursion_limit && anti_endless_execute_recursion