--- parser3/src/main/execute.C 2017/01/13 13:50:28 1.403 +++ parser3/src/main/execute.C 2020/10/27 10:10:08 1.407 @@ -1,7 +1,7 @@ /** @file Parser: executor part of request class. - Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2017 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -21,7 +21,7 @@ #include "pa_vimage.h" #include "pa_wwrapper.h" -volatile const char * IDENT_EXECUTE_C="$Id: execute.C,v 1.403 2017/01/13 13:50:28 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.407 2020/10/27 10:10:08 moko Exp $" IDENT_PA_OPCODE_H IDENT_PA_OPERATION_H IDENT_PA_VCODE_FRAME_H IDENT_PA_WWRAPPER_H; //#define DEBUG_EXECUTE @@ -450,7 +450,6 @@ 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(vjunction!=PUT_ELEMENT_REPLACED_ELEMENT) throw Exception(PARSER_RUNTIME, 0, "property value can not be code, use [] or () brackets"); break; @@ -672,6 +671,8 @@ void Request::execute(ArrayOperation& op case OP::OP_OBJECT_POOL: { + debug_name=0; + ArrayOperation& local_ops=*i.next().ops; WContext *saved_wcontext=wcontext; @@ -1250,34 +1251,33 @@ Value& Request::get_element4call(Value& void Request::put_element(Value& ncontext, const String& name, Value* value) { // put_element can return property-setting-junction - if(const VJunction* vjunction=ncontext.put_element(name, value)) - if(vjunction!=PUT_ELEMENT_REPLACED_ELEMENT) { - const Junction& junction = vjunction->junction(); - int param_count=junction.method->params_count; - - if(junction.auto_name){ - // default setter - if(param_count!=2) - throw Exception(PARSER_RUNTIME, 0, "default setter method must have TWO parameters (has %d parameters)", param_count); - - Value* params[2] = { new VString(*junction.auto_name), value }; - - CONSTRUCTOR_FRAME_ACTION(*junction.method, method_frame /*caller*/, junction.self, { - frame.store_params(params, 2); - Temp_disable_default_setter temp(junction.self); - call(frame); - }); - } else { - // setter - if(param_count!=1) - throw Exception(PARSER_RUNTIME, 0, "setter method must have ONE parameter (has %d parameters)", param_count); - - CONSTRUCTOR_FRAME_ACTION(*junction.method, method_frame /*caller*/, junction.self, { - frame.store_params(&value, 1); - call(frame); - }); - } + if(const VJunction* vjunction=ncontext.put_element(name, value)) { + const Junction& junction = vjunction->junction(); + int param_count=junction.method->params_count; + + if(junction.auto_name) { + // default setter + if(param_count!=2) + throw Exception(PARSER_RUNTIME, 0, "default setter method must have TWO parameters (has %d parameters)", param_count); + + Value* params[2] = { new VString(*junction.auto_name), value }; + + CONSTRUCTOR_FRAME_ACTION(*junction.method, method_frame /*caller*/, junction.self, { + frame.store_params(params, 2); + Temp_disable_default_setter temp(junction.self); + call(frame); + }); + } else { + // setter + if(param_count!=1) + throw Exception(PARSER_RUNTIME, 0, "setter method must have ONE parameter (has %d parameters)", param_count); + + CONSTRUCTOR_FRAME_ACTION(*junction.method, method_frame /*caller*/, junction.self, { + frame.store_params(&value, 1); + call(frame); + }); } + } } Value& Request::process_getter(Junction& junction) { @@ -1470,9 +1470,15 @@ const String* Request::execute_virtual_m } const String* Request::get_method_filespec(const Method* method){ + Operation::Origin origin=get_method_origin(method); + return origin.file_no ? get_used_filespec(origin.file_no) : NULL; +} + +const Operation::Origin Request::get_method_origin(const Method* method){ + Operation::Origin origin={0, 0, 0}; + if(ArrayOperation* code=method->parser_code) if(code){ - Operation::Origin origin={0, 0, 0}; Array_iterator i(*code); while( i.has_next() ){ switch( i.next().code ){ @@ -1539,9 +1545,9 @@ const String* Request::get_method_filesp default: break; } if(origin.file_no) - return get_used_filespec(origin.file_no); + return origin; } } - return 0; + return origin; }