--- parser3/src/classes/op.C 2002/10/15 10:09:51 1.117 +++ parser3/src/classes/op.C 2002/10/16 07:32:51 1.121 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_OP_C="$Date: 2002/10/15 10:09:51 $"; +static const char* IDENT_OP_C="$Date: 2002/10/16 07:32:51 $"; #include "classes.h" #include "pa_common.h" @@ -96,19 +96,13 @@ static void _taint(Request& r, const Str static void _process(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); const Method *main_method; + Value& target_self=params->size()>1? + params->as_no_junction(0, "target must not be code") + :r.get_method_frame()->caller()->self(); { Value& vjunction=params->as_junction(params->size()-1, "body must be code"); - Value *vtarget; - vtarget=params->size()>1? - ¶ms->as_no_junction(0, "target must not be code") - :r.get_method_frame()->caller(); - if(!vtarget) - throw Exception("parser.runtime", - &method_name, - "no caller"); // can't be, somebody really called ^process - - VStateless_class *target_class=vtarget->get_class(); + VStateless_class *target_class=target_self.get_class(); if(!target_class) throw Exception("parser.runtime", &method_name, @@ -158,6 +152,10 @@ static void _process(Request& r, const S // after restoring current-request-lang // maybe-execute @main[] if(main_method) { + // temporarily set request's self to target_self + Temp_request_self trs(r, target_self); + // temporarily set method_frame's self to target_self + Temp_method_frame_self tmfs(*r.get_method_frame(), target_self); // execute! r.execute(*main_method->parser_code); } @@ -649,6 +647,8 @@ static void _throw_operator(Request& r, // constructor VClassMAIN::VClassMAIN(Pool& apool): VClass(apool) { + set_name(*NEW String(pool(), MAIN_CLASS_NAME)); + // ^if(condition){code-when-true} // ^if(condition){code-when-true}{code-when-false} add_native_method("if", Method::CT_ANY, _if, 2, 3);