--- parser3/src/classes/op.C 2002/04/15 06:45:55 1.82 +++ parser3/src/classes/op.C 2002/04/15 12:03:31 1.85 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: op.C,v 1.82 2002/04/15 06:45:55 paf Exp $ + $Id: op.C,v 1.85 2002/04/15 12:03:31 paf Exp $ */ #include "classes.h" @@ -43,12 +43,12 @@ static void _if(Request& r, const String Value& condition_code=params->as_junction(0, "condition must be expression"); bool condition=r.process_to_value(condition_code, - 0/*no name*/, + /*0/*no name* /,*/ false/*don't intercept string*/).as_bool(); if(condition) - r.write_pass_lang(r.process_to_value(params->as_junction(1, "'then' parameter must be code"))); + r.write_pass_lang(r.process(params->as_junction(1, "'then' parameter must be code"))); else if(params->size()>2) - r.write_pass_lang(r.process_to_value(params->as_junction(2, "'else' parameter must be code"))); + r.write_pass_lang(r.process(params->as_junction(2, "'else' parameter must be code"))); } static void _untaint(Request& r, const String& method_name, MethodParams *params) { @@ -166,7 +166,7 @@ static void _while(Request& r, const Str bool condition= r.process_to_value( vcondition, - 0/*no name*/, + /*0/*no name* /,*/ false/*don't intercept string*/).as_bool(); if(!condition) // ...condition is true break; @@ -215,7 +215,7 @@ static void _eval(Request& r, const Stri Value& expr=params->as_junction(0, "need expression"); // evaluate expresion Value *result=r.process_to_value(expr, - 0/*no name YET*/, + /*0/*no name YET* /,*/ true/*don't intercept string*/).as_expr_result(); if(params->size()>1) { Value& fmt=params->as_no_junction(1, "fmt must not be code"); @@ -274,28 +274,21 @@ struct Switch_data { Value *searching; Value *found; Value *_default; - Value *result; }; #endif -static void switch_postexecute(void *info) { - Switch_data& data=*static_cast(info); - - if(Value *code=data.found ? data.found : data._default) - data.result=&data.r->process_to_value(*code); -} static void _switch(Request& r, const String&, MethodParams *params) { Switch_data data={&r, &r.process_to_value(params->get(0))}; Temp_hash_value switch_data_setter(r.classes_conf, *switch_data_name, &data); + Value& cases_code=params->as_junction(1, "switch cases must be code"); // execution of found ^case[...]{code} must be in context of ^switch[...]{code} // because of stacked WWrapper used there as wcontext - r.process_to_nothing( - params->as_junction(1, "switch cases must be code"), - switch_postexecute, &data - ); - - if(data.result) - r.write_pass_lang(*data.result); + r.process(cases_code, true/*intercept_string*/); + if(Value *selected_code=data.found ? data.found : data._default) { + // setting code context, would execute in ^switch[...]{>>context<<} + selected_code->get_junction()->change_context(cases_code.get_junction()); + r.write_pass_lang(r.process_to_value(*selected_code)); + } } static void _case(Request& r, const String& method_name, MethodParams *params) { @@ -309,6 +302,11 @@ static void _case(Request& r, const Stri int count=params->size(); Value *code=¶ms->as_junction(--count, "case result must be code"); + + // killing context for safety, would execute in ^switch[...]{>>context<<} + // reason: context is stacked, and it would become invalid afterwards + code->get_junction()->change_context(0); + for(int i=0; iget(i));