--- parser3/src/classes/op.C 2017/01/13 13:50:28 1.249 +++ parser3/src/classes/op.C 2021/11/09 14:45:06 1.261 @@ -1,7 +1,7 @@ /** @file Parser: parser @b operators. - Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2020 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -18,7 +18,7 @@ #include "pa_vclass.h" #include "pa_charset.h" -volatile const char * IDENT_OP_C="$Id: op.C,v 1.249 2017/01/13 13:50:28 moko Exp $"; +volatile const char * IDENT_OP_C="$Id: op.C,v 1.261 2021/11/09 14:45:06 moko Exp $"; // defines @@ -200,7 +200,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.full_disk_path(*file_alias)) : pseudo_file_no__process; // process...{string} Value& vjunction=params.as_junction(index, "body must be code"); // evaluate source to process @@ -281,8 +281,9 @@ static void _while(Request& r, MethodPar static void _use(Request& r, MethodParams& params) { Value& vfile=params.as_no_junction(0, FILE_NAME_MUST_NOT_BE_CODE); - bool allow_class_replace=false; const String* use_origin=0; + bool allow_class_replace=false; + bool load_auto_p=false; if(params.count()==2) if(HashStringValue* options=params.as_hash(1)) { @@ -292,14 +293,19 @@ static void _use(Request& r, MethodParam String::Body key=i.key(); Value* value=i.value(); + if(key == "origin") { + valid_options++; + use_origin=&value->as_string(); + } + if(key == "replace") { valid_options++; allow_class_replace=r.process(*value).as_bool(); } - if(key == "origin") { + if(key == "main") { valid_options++; - use_origin=&value->as_string(); + load_auto_p=r.process(*value).as_bool(); } if(valid_options!=options->count()) @@ -313,7 +319,7 @@ static void _use(Request& r, MethodParam Temp_class_replace class_replace(r, allow_class_replace); - r.use_file(r.main_class, vfile.as_string(), use_origin); + r.use_file(vfile.as_string(), use_origin, load_auto_p); } static void set_skip(Request& r, Request::Skip askip) { @@ -331,9 +337,10 @@ static void _continue(Request& r, Method } static void _return(Request& r, MethodParams& params) { + VMethodFrame& caller=*r.get_method_frame()->caller(); if(params.count()) - r.put_element(*r.get_method_frame(), Symbols::RESULT_SYMBOL, ¶ms[0]); // not caller as CO_WITHOUT_FRAME - r.set_skip_return(); + r.put_element(caller, Symbols::RESULT_SYMBOL, &r.process(params[0])); + r.set_skip_return(caller); } static void _for(Request& r, MethodParams& params) { @@ -703,20 +710,13 @@ struct Cache_get_result { static Cache_get_result cache_get(Request_charsets& charsets, const String& file_spec, time_t now) { Cache_get_result result={0, false}; - File_read_result file=file_read(charsets, file_spec, - false/*as_text*/, - 0, //no params - false/*fail_on_read_problem*/); - if(file.success && file.length/* ignore reads which are empty due to - non-unary open+lockEX conflict with lockSH */) { - - Data_string_serialized_prolog& prolog= - *reinterpret_cast(file.str); - + File_read_result file=file_read_binary(file_spec, false /*fail_on_read_problem*/); + if(file.success && file.length /*ignore reads which are empty due to non-unary open+lockEX conflict with lockSH*/) { + + Data_string_serialized_prolog& prolog = *reinterpret_cast(file.str); + String* body=new String; - if( - file.length>=sizeof(Data_string_serialized_prolog) - && prolog.version==DATA_STRING_SERIALIZED_VERSION) { + if(file.length>=sizeof(Data_string_serialized_prolog) && prolog.version==DATA_STRING_SERIALIZED_VERSION) { if(body->deserialize(sizeof(Data_string_serialized_prolog), file.str, file.length)) { result.body=body; result.expired=prolog.expires <= now; @@ -726,8 +726,8 @@ static Cache_get_result cache_get(Reques return result; } -static time_t as_expires(Request& r, MethodParams& params, - int index, time_t now) { + +static time_t as_expires(Request& r, MethodParams& params, int index, time_t now) { time_t result; if(Value* vdate=params[index].as(VDATE_TYPE)) result=(time_t)(static_cast(vdate)->get_time()); @@ -738,7 +738,7 @@ static time_t as_expires(Request& r, Met } static const String& as_file_spec(Request& r, MethodParams& params, int index) { - return r.absolute(params.as_string(index, "filespec must be string")); + return r.full_disk_path(params.as_string(index, "filespec must be string")); } static void _cache(Request& r, MethodParams& params) { @@ -861,7 +861,6 @@ static void _try_operator(Request& r, Me // no exception in try/catch, writing processed body_code or catch_code r.write(result.processed_code); } - } static void _throw_operator(Request&, MethodParams& params) { @@ -877,28 +876,24 @@ static void _throw_operator(Request&, Me if(Value* value=hash->get(exception_comment_part_name)) comment=value->as_string().cstr(); - throw Exception(type, - source?source:0, - "%s", comment?comment:""); + throw Exception(type, source, "%s", comment); // to avoid MAX_STRING limit } else - throw Exception(PARSER_RUNTIME, - 0, - "one-param version has hash or string param"); + throw Exception(PARSER_RUNTIME, 0, "one-param version has hash or string param"); } else { const char* type=params.as_string(0, "type must be string").cstr(); - const String* source=params.count()>1? ¶ms.as_string(1, "source must be string"):0; - const char* comment=params.count()>2? params.as_string(2, "comment must be string").cstr():0; - throw Exception(type, source, "%s", comment?comment:""); + const String* source=params.count()>1 ? ¶ms.as_string(1, "source must be string") : 0; + const char* comment=params.count()>2 ? params.as_string(2, "comment must be string").cstr() : 0; + throw Exception(type, source, "%s", comment); // to avoid MAX_STRING limit } - } +} static void _sleep_operator(Request& r, MethodParams& params) { double seconds=params.as_double(0, "seconds must be double", r); if(seconds>0) pa_sleep((int)trunc(seconds), (int)trunc((seconds-trunc(seconds))*1000000)); - } +} -#if defined(WIN32) && defined(_DEBUG) +#if defined(WIN32) && defined(_DEBUG) && !defined(_WIN64) # define PA_BPT static void _bpt(Request&, MethodParams&) { _asm int 3; @@ -951,7 +946,7 @@ VClassMAIN::VClassMAIN(): VClass(MAIN_CL // ^return[] // ^return[result] - add_native_method("return", Method::CT_ANY, _return, 0, 1, Method::CO_WITHOUT_FRAME); + add_native_method("return", Method::CT_ANY, _return, 0, 1); // ^for[i](from-number;to-number-inclusive){code}[delim] add_native_method("for", Method::CT_ANY, _for, 3+1, 3+1+1);