--- parser3/src/include/pa_request.h 2010/05/25 03:58:17 1.201 +++ parser3/src/include/pa_request.h 2010/09/24 08:18:57 1.207 @@ -8,7 +8,7 @@ #ifndef PA_REQUEST_H #define PA_REQUEST_H -static const char * const IDENT_REQUEST_H="$Date: 2010/05/25 03:58:17 $"; +static const char * const IDENT_REQUEST_H="$Date: 2010/09/24 08:18:57 $"; #include "pa_pool.h" #include "pa_hash.h" @@ -27,6 +27,7 @@ static const char * const IDENT_REQUEST_ // consts const uint ANTI_ENDLESS_EXECUTE_RECOURSION=1000; +const uint ANTI_ENDLESS_JSON_STRING_RECOURSION=100; const size_t pseudo_file_no__process=1; // forwards @@ -131,6 +132,8 @@ private: */ uint anti_endless_execute_recoursion; + uint anti_endless_json_string_recoursion; + ///@} /// execution stack @@ -206,7 +209,8 @@ public: void execute(ArrayOperation& ops); // execute.C void op_call(VMethodFrame &frame); void op_call_write(VMethodFrame &frame); - void op_call(VMethodFrame &frame, bool constructing); + Value& construct(Value &class_value, const Method &method); + /// execute ops with anti-recoursion check void recoursion_checked_execute(/*const String& name, */ArrayOperation& ops) { // anti_endless_execute_recoursion @@ -220,6 +224,21 @@ public: anti_endless_execute_recoursion--; } + uint json_string_recoursion_go_down(){ + if(++anti_endless_json_string_recoursion==ANTI_ENDLESS_JSON_STRING_RECOURSION){ + anti_endless_json_string_recoursion=0; + throw Exception(PARSER_RUNTIME, + 0, + "call canceled - endless json recursion detected"); + } + return anti_endless_json_string_recoursion; + } + + void json_string_recoursion_go_up(){ + if(anti_endless_json_string_recoursion) + anti_endless_json_string_recoursion--; + } + /// void use_file_directly(VStateless_class& aclass, const String& file_spec, @@ -239,6 +258,7 @@ public: int line_no_offset=0); /// processes any code-junction there may be inside of @a value + StringOrValue process_getter(Junction& junction); // execute.C StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C void process_write(Value& input_value); // execute.C //@{ convinient helpers @@ -363,11 +383,15 @@ public: // status read methods } */ + /// public for ^reflection:copy[] + void put_element(Value& ncontext, const String& name, Value* value); + /// for @main[] const String* execute_virtual_method(Value& aself, const String& method_name); - /// for @postprocess[body] - StringOrValue execute_method(VMethodFrame& amethodFrame, const Method& method); + /// executes parser method, use op_call(frame) to execute native method + void execute_method(VMethodFrame& aframe); + //{ for @conf[filespec] and @auto[filespec] and parser://method/call const String* execute_method(Value& aself, const Method& method, Value* optional_param, @@ -413,7 +437,6 @@ private: // compile.C private: // execute.C - void put_element(Value& ncontext, const String& name, Value* value); Value& get_element(Value& ncontext, const String& name); private: // defaults @@ -462,6 +485,7 @@ class Request_context_saver { /// execution stack size_t stack; uint anti_endless_execute_recoursion; + uint anti_endless_json_string_recoursion; /// contexts VMethodFrame* method_frame; Value* rcontext; @@ -478,6 +502,7 @@ public: exception_trace_bottom(ar.exception_trace.bottom_index()), stack(ar.stack.top_index()), anti_endless_execute_recoursion(ar.anti_endless_execute_recoursion), + anti_endless_json_string_recoursion(ar.anti_endless_json_string_recoursion), method_frame(ar.method_frame), rcontext(ar.rcontext), wcontext(ar.wcontext), @@ -488,6 +513,7 @@ public: fr.exception_trace.set_bottom_index(exception_trace_bottom); fr.stack.set_top_index(stack); fr.anti_endless_execute_recoursion=anti_endless_execute_recoursion; + fr.anti_endless_json_string_recoursion=anti_endless_json_string_recoursion; fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; fr.flang=flang; fr.fconnection=fconnection;