--- parser3/src/include/pa_request.h 2002/04/11 13:33:39 1.127 +++ parser3/src/include/pa_request.h 2002/04/15 11:34:24 1.130 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: pa_request.h,v 1.127 2002/04/11 13:33:39 paf Exp $ + $Id: pa_request.h,v 1.130 2002/04/15 11:34:24 paf Exp $ */ #ifndef PA_REQUEST_H @@ -30,6 +30,12 @@ #include #endif +// consts + +const uint ANTI_ENDLESS_EXECUTE_RECOURSION=500; + +// defines + #ifndef NO_STRING_ORIGIN # define COMPILE_PARAMS \ const char *source, \ @@ -102,7 +108,17 @@ public: /// executes ops void execute(const Array& ops); // execute.C /// execute ops with anti-recoursion check - void recoursion_checked_execute(const String *name, const Array& ops); + void recoursion_checked_execute(const String *name, const Array& ops) { + // anti_endless_execute_recoursion + if(++anti_endless_execute_recoursion==ANTI_ENDLESS_EXECUTE_RECOURSION) { + anti_endless_execute_recoursion=0; // give @exception a chance + throw Exception("parser.runtime", + name, + "call canceled - endless recursion detected"); + } + execute(ops); // execute it + anti_endless_execute_recoursion--; + } /// compiles the file, maybe forcing it's class @a name and @a base_class. VStateless_class *use_file( @@ -116,19 +132,14 @@ public: VStateless_class *aclass=0, const String *name=0, VStateless_class *base_class=0); // core.C - //@{ convinient inline helpers @see Request::process - const String& process_to_string(Value& input_value, - const String *result_name=0) { - const String *result; - process_internal(input_value, result_name, true/*intercept_string*/, &result, 0); - return *result; - } - Value& process_to_value(Value& input_value, - const String *result_name=0, - bool intercept_string=true) { - Value *result; - process_internal(input_value, result_name, intercept_string, 0, &result); - return *result; + /// processes any code-junction there may be inside of @a value + StringOrValue process(Value& input_value, bool intercept_string); // execute.C + //@{ convinient helpers + const String& process_to_string(Value& input_value) { + return process(input_value, true/*intercept_string*/).as_string(); + } + Value& process_to_value(Value& input_value, bool intercept_string=true) { + return process(input_value, intercept_string).as_value(); } //@} @@ -297,15 +308,6 @@ private: /// connection SQL_Connection *fconnection; - -private: - - /// processes any code-junction there may be inside of @a value - void process_internal( - Value& input_value, const String *result_name, - bool intercept_string, - const String **string_result, Value **value_result); // execute.C - void output_result(const VFile& body_file, bool header_only); };