--- parser3/src/classes/op.C 2016/05/11 22:28:48 1.229 +++ parser3/src/classes/op.C 2016/09/20 09:55:02 1.232 @@ -18,7 +18,7 @@ #include "pa_vclass.h" #include "pa_charset.h" -volatile const char * IDENT_OP_C="$Id: op.C,v 1.229 2016/05/11 22:28:48 moko Exp $"; +volatile const char * IDENT_OP_C="$Id: op.C,v 1.232 2016/09/20 09:55:02 moko Exp $"; // limits @@ -160,16 +160,12 @@ static void _process(Request& r, MethodP { VStateless_class *target_class=target_self->get_class(); if(!target_class) - throw Exception(PARSER_RUNTIME, - 0, - "no target class"); + throw Exception(PARSER_RUNTIME, 0, "no target class"); // temporary remove language change Temp_lang temp_lang(r, String::L_PARSER_CODE); // temporary zero @main so to maybe-replace it in processed code Temp_method temp_method_main(*target_class, main_method_name, 0); - // temporary zero @auto so it wouldn't be auto-called in Request::use_buf - Temp_method temp_method_auto(*target_class, auto_method_name, 0); const String* main_alias=0; const String* file_alias=0; @@ -205,9 +201,7 @@ static void _process(Request& r, MethodP throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); } - uint processe_file_no=file_alias? - r.register_file(r.absolute(*file_alias)) - : pseudo_file_no__process; + uint processe_file_no=file_alias ? r.register_file(r.absolute(*file_alias)) : pseudo_file_no__process; // process...{string} Value& vjunction=params.as_junction(index, "body must be code"); // evaluate source to process @@ -215,11 +209,7 @@ static void _process(Request& r, MethodP Temp_class_replace class_replace(r, allow_class_replace); - r.use_buf(*target_class, - source.untaint_cstr(String::L_AS_IS, r.connection(false)), - main_alias, - processe_file_no, - line_no_alias_offset); + r.use_buf(*target_class, source.untaint_cstr(String::L_AS_IS, r.connection(false)), main_alias, processe_file_no, line_no_alias_offset); // main_method main_method=target_class->get_method(main_method_name); @@ -554,7 +544,10 @@ static Try_catch_result try_catch(Reques try { result.processed_code=body_code(r, info); } catch(const Exception& e) { + Request_context_saver throw_context(r); // remembering exception stack trace + Request::Exception_details details=r.get_details(e); + try_context.restore(); // restoring try-context for code after try and catch-code { @@ -576,8 +569,10 @@ static Try_catch_result try_catch(Reques bhandled=vhandled->as_bool(); } - if(!bhandled) + if(!bhandled){ + throw_context.restore(); // restoring exception stack trace creared by try_context.restore() rethrow; + } } return result;