--- parser3/src/include/pa_request.h 2026/09/25 12:55:42 1.274 +++ parser3/src/include/pa_request.h 2026/10/05 17:50:18 1.282 @@ -8,10 +8,11 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.274 2026/09/25 12:55:42 moko Exp $" +#define IDENT_PA_REQUEST_H "$Id: pa_request.h,v 1.282 2026/10/05 17:50:18 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" @@ -53,6 +54,8 @@ extern int pa_execute_recursion_limit; extern int pa_httpd_timeout; extern size_t pa_file_size_limit; +class Code_cache; + /// Main workhorse. class Request: public PA_Object { friend class Temp_lang; @@ -63,6 +66,7 @@ class Request: public PA_Object { friend class Request_context_saver; friend class Exception_trace; friend class VException; + friend class Code_cache_manager; public: class Trace { @@ -128,7 +132,10 @@ private: return fsize==fbottom; } - Table &table(Request &r, const String* problem_source); + Table &table(Request &r, const String* problem_source) { + return table(r, problem_source, bottom_index(), top_index()); + } + Table &table(Request &r, const String* problem_source, size_t bottom, size_t top); }; ///@{ core data @@ -144,6 +151,8 @@ private: /// endless execute(execute(... preventing counter int anti_endless_execute_recursion; + int execute_recursion_limit; + void recursion_limit_reached(); ///@} @@ -240,14 +249,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