--- parser3/src/include/pa_request.h 2009/04/29 03:26:38 1.190 +++ parser3/src/include/pa_request.h 2009/07/29 05:01:46 1.196 @@ -8,7 +8,7 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char * const IDENT_REQUEST_H="$Date: 2009/04/29 03:26:38 $"; +static const char * const IDENT_REQUEST_H="$Date: 2009/07/29 05:01:46 $"; #include "pa_pool.h" #include "pa_hash.h" @@ -105,11 +105,11 @@ private: element_type bottom_value() { return get(bottom_index()); } void clear() { - ftop=fbottom=0; + fused=fbottom=0; } bool is_empty() { - return ftop==fbottom; + return fused==fbottom; } const element_type extract_origin(const String*& problem_source); @@ -118,10 +118,10 @@ private: ///@{ core data /// classes - HashStringValue fclasses; + HashString fclasses; /// already used files to avoid cyclic uses - Hash used_files; + HashString used_files; /// list of all used files, Operation::file_no = index to it Array file_list; @@ -152,6 +152,7 @@ public: /// interrupted flag, raised on signals [SIGPIPE] bool finterrupted; Skip fskip; + int fin_cycle; public: uint register_file(String::Body file_spec); @@ -187,7 +188,7 @@ public: ~Request(); /// global classes - HashStringValue& classes() { return fclasses; } + HashString& classes() { return fclasses; } /** core request processing @@ -201,7 +202,9 @@ public: /// executes ops void execute(ArrayOperation& ops); // execute.C - WContext* op_call(VMethodFrame& frame); + void op_call(VMethodFrame &frame); + void op_call_write(VMethodFrame &frame); + void op_call(VMethodFrame &frame, bool constructing); /// execute ops with anti-recoursion check void recoursion_checked_execute(/*const String& name, */ArrayOperation& ops) { // anti_endless_execute_recoursion @@ -231,6 +234,7 @@ public: /// processes any code-junction there may be inside of @a value StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C + void process_write(Value& input_value); // execute.C //@{ convinient helpers const String& process_to_string(Value& input_value) { return process(input_value, true/*intercept_string*/).as_string(); @@ -308,6 +312,9 @@ public: void set_skip(Skip askip) { fskip=askip; } Skip get_skip() { return fskip; } + void set_in_cycle(int adelta) { fin_cycle+=adelta; } + bool get_in_cycle() { return fin_cycle>0; } + public: /// info from web server @@ -333,7 +340,7 @@ public: VConsole& console; /// classes configured data - Hash classes_conf; + HashString classes_conf; public: // status read methods @@ -400,7 +407,7 @@ private: // compile.C private: // execute.C void put_element(Value& ncontext, const String& name, Value* value); - Value& get_element(Value& ncontext, const String& name, bool can_call_operator); + Value& get_element(Value& ncontext, const String& name); private: // defaults @@ -508,6 +515,17 @@ public: } }; +/// Auto-object used for break out of cycle check +class InCycle { + Request& frequest; +public: + InCycle(Request& arequest) : frequest(arequest) { + frequest.set_in_cycle(1); + } + ~InCycle() { + frequest.set_in_cycle(-1); + } +}; // defines for externs