--- parser3/src/main/execute.C 2024/11/04 03:53:25 1.425 +++ parser3/src/main/execute.C 2026/10/18 21:05:35 1.433 @@ -1,7 +1,7 @@ /** @file Parser: executor part of request class. - Copyright (c) 2001-2024 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2026 Art. Lebedev Studio (https://www.artlebedev.com) Authors: Konstantin Morshnev , Alexandr Petrosian */ @@ -22,7 +22,7 @@ #include "pa_varray.h" #include "pa_wwrapper.h" -volatile const char * IDENT_EXECUTE_C="$Id: execute.C,v 1.425 2024/11/04 03:53:25 moko Exp $" IDENT_PA_OPCODE_H IDENT_PA_OPERATION_H IDENT_PA_VCODE_FRAME_H IDENT_PA_WWRAPPER_H; +volatile const char * IDENT_EXECUTE_C="$Id: execute.C,v 1.433 2026/10/18 21:05:35 moko Exp $" IDENT_PA_OPCODE_H IDENT_PA_OPERATION_H IDENT_PA_VCODE_FRAME_H IDENT_PA_WWRAPPER_H; //#define DEBUG_EXECUTE @@ -117,7 +117,7 @@ const char* debug_value_to_cstr(Value& v void va_debug_printf(SAPI_Info& sapi_info, const char* fmt,va_list args) { char buf[MAX_STRING]; - vsnprintf(buf, MAX_STRING, fmt, args); + pa_vsnprintf(buf, MAX_STRING, fmt, args); SAPI::log(sapi_info, "%s", buf); } @@ -214,7 +214,7 @@ void debug_dump(SAPI_Info& sapi_info, in debug_printf(sapi_info, "%*s%s", level*4, "", opcode_name[opcode]); switch(opcode) { - case OP::OP_CURLY_CODE__STORE_PARAM: + case OP::OP_CURLY_CODE__STORE_PARAM: case OP::OP_EXPR_CODE__STORE_PARAM: case OP::OP_CURLY_CODE__CONSTRUCT: case OP::OP_NESTED_CODE: @@ -246,6 +246,7 @@ void debug_dump(SAPI_Info& sapi_info, in // Request void Request::execute(ArrayOperation& ops) { + SINGLE_METHOD_FRAME_STORAGE; // one frame at a time, see SINGLE_METHOD_FRAME Stack& stack=this->stack; // helps a lot on MSVC: 'esi' const String* debug_name=0; Operation::Origin debug_origin={0, 0, 0}; @@ -442,7 +443,7 @@ void Request::execute(ArrayOperation& op const String& name=stack.pop().string(); debug_name=&name; Value& ncontext=stack.pop().value(); - if(const VJunction* vjunction=ncontext.put_element(name, &value)) + if(ncontext.put_element(name, &value)) throw Exception(PARSER_RUNTIME, 0, "property value cannot be code, use [] or () brackets"); break; @@ -450,6 +451,8 @@ void Request::execute(ArrayOperation& op case OP::OP_CONSTRUCT_ARRAY: { + debug_name=0; + ArrayOperation* local_ops=i.next().ops; DEBUG_PRINT_OPS(local_ops) @@ -460,13 +463,9 @@ void Request::execute(ArrayOperation& op Value *value=new VArray(stack.top_index()-first, (Value**)stack.ptr(first)); stack.set_top_index(first); -#ifdef OPTIMIZE_BYTECODE_CONSTRUCT const String& name=stack.pop().string(); debug_name=&name; Value& ncontext=stack.pop().value(); -#else - const String& name=stack.pop().string(); debug_name=&name; - Value& ncontext=stack.pop().value(); -#endif + put_element(ncontext, name, value); DEBUG_PRINT_STR("<-returned") @@ -516,8 +515,7 @@ void Request::execute(ArrayOperation& op DEBUG_PRINT_STRING(name) if(Method* method=main_class.get_method(name)){ // looking operator of that name FIRST - if(!method->junction_template) method->junction_template=new VJunction(main_class, method); - stack.push(*method->junction_template); + stack.push(*method->get_vjunction(main_class)); break; } Value& value=get_element(*rcontext, name); @@ -530,8 +528,7 @@ void Request::execute(ArrayOperation& op const String& name=stack.pop().string(); debug_name=&name; Value& ncontext=stack.pop().value(); if(Method* method=main_class.get_method(name)){ // looking operator of that name FIRST - if(!method->junction_template) method->junction_template=new VJunction(main_class, method); - stack.push(*method->junction_template); + stack.push(*method->get_vjunction(main_class)); break; } Value& value=get_element(ncontext, name); @@ -794,7 +791,7 @@ void Request::execute(ArrayOperation& op Value *result; { - EXPRESSION_FRAME_ACTION(*junction->method, method_frame, junction->self, { + SINGLE_EXPRESSION_FRAME_ACTION(*junction->method, method_frame, junction->self, { METHOD_PARAMS_ACTION(call(frame)); result=&frame.result(); // desctructor deletes junctions in stack params here @@ -844,13 +841,13 @@ void Request::execute(ArrayOperation& op method.native_code(*this, method_params); // execute it } } else if(method.call_optimization==Method::CO_WITHOUT_WCONTEXT){ - METHOD_FRAME_ACTION(method, method_frame, junction->self, { + SINGLE_METHOD_FRAME_ACTION(method, method_frame, junction->self, { METHOD_PARAMS_ACTION(call_write(frame)) }); } else #endif // OPTIMIZE_CALL { - METHOD_FRAME_ACTION(method, method_frame, junction->self, { + SINGLE_METHOD_FRAME_ACTION(method, method_frame, junction->self, { METHOD_PARAMS_ACTION(call(frame)); write(frame.result()); }); @@ -889,7 +886,7 @@ void Request::execute(ArrayOperation& op Value *result; { Value& object=construct(vclass, *constructor_junction->method); - CONSTRUCTOR_FRAME_ACTION(*constructor_junction->method, method_frame, object, { + SINGLE_CONSTRUCTOR_FRAME_ACTION(*constructor_junction->method, method_frame, object, { METHOD_PARAMS_ACTION(call(frame)); object.enable_default_setter(); result=&frame.result(); @@ -946,14 +943,16 @@ void Request::execute(ArrayOperation& op case OP::OP_FEXISTS: { Value& a=stack.pop().value(); - Value& value=VBool::get(file_exist(full_disk_path(a.as_string()))); + const String* path=real_disk_path(a.as_string()); + Value& value=VBool::get(path && file_exist(*path)); stack.push(value); break; } case OP::OP_DEXISTS: { Value& a=stack.pop().value(); - Value& value=VBool::get(dir_exists(full_disk_path(a.as_string()))); + const String* path=real_disk_path(a.as_string()); + Value& value=VBool::get(path && dir_exists(*path)); stack.push(value); break; } @@ -1016,8 +1015,8 @@ void Request::execute(ArrayOperation& op } case OP::OP_INTDIV: { - int b_int=stack.pop().value().as_int(); - int a_int=stack.pop().value().as_int(); + pa_wint b_int=stack.pop().value().as_wint(); + pa_wint a_int=stack.pop().value().as_wint(); if(b_int == 0) { //const String* problem_source=b.as_string(); @@ -1032,8 +1031,8 @@ void Request::execute(ArrayOperation& op { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=*new VInt( - a.as_int() << - b.as_int()); + a.as_wint() << + b.as_wint()); stack.push(value); break; } @@ -1041,8 +1040,8 @@ void Request::execute(ArrayOperation& op { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=*new VInt( - a.as_int() >> - b.as_int()); + a.as_wint() >> + b.as_wint()); stack.push(value); break; } @@ -1050,8 +1049,8 @@ void Request::execute(ArrayOperation& op { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=*new VInt( - a.as_int() & - b.as_int()); + a.as_wint() & + b.as_wint()); stack.push(value); break; } @@ -1059,8 +1058,8 @@ void Request::execute(ArrayOperation& op { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=*new VInt( - a.as_int() | - b.as_int()); + a.as_wint() | + b.as_wint()); stack.push(value); break; } @@ -1068,8 +1067,8 @@ void Request::execute(ArrayOperation& op { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=*new VInt( - a.as_int() ^ - b.as_int()); + a.as_wint() ^ + b.as_wint()); stack.push(value); break; } @@ -1109,7 +1108,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_LT: + case OP::OP_NUM_LT: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1117,7 +1116,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_GT: + case OP::OP_NUM_GT: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1125,7 +1124,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_LE: + case OP::OP_NUM_LE: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1133,7 +1132,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_GE: + case OP::OP_NUM_GE: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1141,7 +1140,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_EQ: + case OP::OP_NUM_EQ: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1149,7 +1148,7 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_NUM_NE: + case OP::OP_NUM_NE: { volatile double b_double=stack.pop().value().as_double(); volatile double a_double=stack.pop().value().as_double(); @@ -1157,42 +1156,42 @@ void Request::execute(ArrayOperation& op stack.push(value); break; } - case OP::OP_STR_LT: + case OP::OP_STR_LT: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() < b.as_string()); stack.push(value); break; } - case OP::OP_STR_GT: + case OP::OP_STR_GT: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() > b.as_string()); stack.push(value); break; } - case OP::OP_STR_LE: + case OP::OP_STR_LE: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() <= b.as_string()); stack.push(value); break; } - case OP::OP_STR_GE: + case OP::OP_STR_GE: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() >= b.as_string()); stack.push(value); break; } - case OP::OP_STR_EQ: + case OP::OP_STR_EQ: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() == b.as_string()); stack.push(value); break; } - case OP::OP_STR_NE: + case OP::OP_STR_NE: { Value& b=stack.pop().value(); Value& a=stack.pop().value(); Value& value=VBool::get(a.as_string() != b.as_string());