--- parser3/src/main/execute.C 2010/10/09 23:17:26 1.366 +++ parser3/src/main/execute.C 2013/10/04 21:21:55 1.371 @@ -1,12 +1,10 @@ /** @file Parser: executor part of request class. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_EXECUTE_C="$Date: 2010/10/09 23:17:26 $"; - #include "pa_opcode.h" #include "pa_array.h" #include "pa_request.h" @@ -23,6 +21,8 @@ static const char * const IDENT_EXECUTE_ #include "pa_vimage.h" #include "pa_wwrapper.h" +volatile const char * IDENT_EXECUTE_C="$Id: execute.C,v 1.371 2013/10/04 21:21:55 moko Exp $" IDENT_PA_OPCODE_H IDENT_PA_OPERATION_H IDENT_PA_VCODE_FRAME_H IDENT_PA_WWRAPPER_H; + //#define DEBUG_EXECUTE #ifdef DEBUG_EXECUTE @@ -397,7 +397,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, false)) + if(const VJunction* vjunction=ncontext.put_element(name, &value)) if(vjunction!=PUT_ELEMENT_REPLACED_ELEMENT) throw Exception(PARSER_RUNTIME, 0, @@ -639,13 +639,10 @@ void Request::execute(ArrayOperation& op execute(local_ops); - Value* value; // from "$a $b" part of expression taking only string value, // ignoring any other content of wcontext - if(const String* string=wcontext->get_string()) - value=new VString(*string); - else - value=VVoid::get(); + const String* string=wcontext->get_string(); + Value* value=string ? new VString(*string) : new VString(); stack.push(*value); wcontext=saved_wcontext; @@ -723,9 +720,14 @@ void Request::execute(ArrayOperation& op value.type()); } - VMethodFrame frame(*junction->method, method_frame, junction->self); - METHOD_FRAME_ACTION(op_call(frame)); - stack.push(frame.result().as_value()); + Value *result; + { + VMethodFrame frame(*junction->method, method_frame, junction->self); + METHOD_FRAME_ACTION(op_call(frame)); + result=&frame.result().as_value(); + // VMethodFrame desctructor deletes junctions in stack params here + } + stack.push(*result); DEBUG_PRINT_STR("<-returned") @@ -836,15 +838,20 @@ void Request::execute(ArrayOperation& op DEBUG_PRINT_OPS(local_ops) DEBUG_PRINT_STR("->\n") - Value &object=construct(*class_value, *constructor_junction->method); - VConstructorFrame frame(*constructor_junction->method, method_frame, object); - METHOD_FRAME_ACTION(op_call(frame)); - object.enable_default_setter(); + Value *result; + { + Value& object=construct(*class_value, *constructor_junction->method); + VConstructorFrame frame(*constructor_junction->method, method_frame, object); + METHOD_FRAME_ACTION(op_call(frame)); + object.enable_default_setter(); + result=&frame.result().as_value(); + // VMethodFrame desctructor deletes junctions in stack params here + } if(opcode==OP::OP_CONSTRUCT_OBJECT) - stack.push(frame.result().as_value()); + stack.push(*result); else - write_pass_lang(frame.result()); + write_pass_lang(*result); DEBUG_PRINT_STR("<-returned") break; @@ -1271,7 +1278,7 @@ Value& Request::get_element(Value& ncont 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, false)) + if(const VJunction* vjunction=ncontext.put_element(name, value)) if(vjunction!=PUT_ELEMENT_REPLACED_ELEMENT) { const Junction& junction = vjunction->junction(); VConstructorFrame frame(*junction.method, method_frame /*caller*/, junction.self);