--- parser3/src/main/execute.C 2001/03/10 14:05:36 1.85 +++ parser3/src/main/execute.C 2001/03/12 09:08:51 1.92 @@ -1,5 +1,9 @@ /* - $Id: execute.C,v 1.85 2001/03/10 14:05:36 paf Exp $ + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: execute.C,v 1.92 2001/03/12 09:08:51 paf Exp $ */ #include "pa_array.h" @@ -29,7 +33,7 @@ char *opcode_name[]={ "WITH_SELF", "WITH_ROOT", "WITH_READ", "WITH_WRITE", "GET_CLASS", "CONSTRUCT_VALUE", "CONSTRUCT_DOUBLE", - "WRITE", + "WRITE", "STRING__WRITE", "GET_ELEMENT", "GET_ELEMENT__WRITE", "CREATE_EWPOOL", "REDUCE_EWPOOL", "CREATE_RWPOOL", "REDUCE_RWPOOL", @@ -66,7 +70,7 @@ void dump(int level, const Array& ops) { op.cast=ops.quick_get(i); fprintf(stderr, "%*s%s", level*4, "", opcode_name[op.code]); - if(op.code==OP_VALUE) { + if(op.code==OP_VALUE || op.code==OP_STRING__WRITE) { Value *value=static_cast(ops.quick_get(++i)); fprintf(stderr, " \"%s\" %s", value->get_string()->cstr(), value->type()); } @@ -116,10 +120,9 @@ void Request::execute(const Array& ops) root, frame, frame, local_ops); Value *value=NEW VJunction(j); - ///value->set_name(frame->name()); // store param - frame->store_param(value); + frame->store_param(frame->name(), value); break; } case OP_GET_CLASS: @@ -179,7 +182,14 @@ void Request::execute(const Array& ops) case OP_WRITE: { Value *value=POP(); - write(*value); + write_assign_lang(*value); + break; + } + case OP_STRING__WRITE: + { + VString *vstring=static_cast(ops.quick_get(++i)); + fprintf(stderr, " \"%s\"", vstring->value().cstr()); + write(vstring->value()); break; } @@ -193,7 +203,7 @@ void Request::execute(const Array& ops) case OP_GET_ELEMENT__WRITE: { Value *value=get_element(); - write(*value); + write_assign_lang(*value); break; } @@ -268,7 +278,8 @@ void Request::execute(const Array& ops) value->type()); VMethodFrame *frame=NEW VMethodFrame(pool(), *junction); - frame->set_name(junction->self.name()); + //frame->set_name(junction->self.name()); + frame->set_name(value->name()); PUSH(frame); break; } @@ -276,7 +287,7 @@ void Request::execute(const Array& ops) { Value *value=POP(); VMethodFrame *frame=static_cast(stack.top_value()); - frame->store_param(value); + frame->store_param(frame->name(), value); break; } @@ -315,8 +326,10 @@ void Request::execute(const Array& ops) Method& method=*frame->junction.method; if(method.native_code) { // native code? - method.check_actual_numbered_params(frame->numbered_params()); - (*method.native_code)(*this, frame->numbered_params()); // execute it + method.check_actual_numbered_params( + frame->name(), frame->numbered_params()); + (*method.native_code)(*this, + frame->name(), frame->numbered_params()); // execute it } else // parser code execute(*method.parser_code); // execute it } @@ -562,7 +575,7 @@ Value *Request::get_element() { Value *value=ncontext->get_element(name); if(value) - value=&autocalc(*value, &name); // autocalc possible code-junction + value=&process(*value, &name); // process possible code-junction else { value=NEW VUnknown(pool()); value->set_name(name); @@ -571,10 +584,20 @@ Value *Request::get_element() { return value; } -Value& Request::autocalc(Value& value, const String *name, bool make_string) { +Value& Request::process(Value& value, const String *name, bool intercept_string) { + // intercept_string: + // true: + // they want result=string value, + // possible object result goes to wcontext + // false: + // they want any result[string|object] + // nothing goes to wcontext. + // used in (expression) params evaluation + + Value *result; Junction *junction=value.get_junction(); if(junction && junction->code) { // is it a code-junction? - // autocalc it + // process it fprintf(stderr, "ja->\n"); PUSH(self); PUSH(root); @@ -582,7 +605,7 @@ Value& Request::autocalc(Value& value, c PUSH(wcontext); WContext *frame; - if(make_string) { + if(intercept_string) { // almost plain wwrapper about junction wcontext, // BUT intercepts string writes frame=NEW VCodeFrame(pool(), *junction->wcontext); @@ -596,16 +619,13 @@ Value& Request::autocalc(Value& value, c root=junction->root; rcontext=junction->rcontext; execute(*junction->code); - Value *result; - if(make_string) { + if(intercept_string) { // CodeFrame soul: // string writes were intercepted // returning them as the result of getting code-junction result=NEW VString(*frame->get_string()); } else result=frame->result(); - if(name) - result->set_name(*name); wcontext=static_cast(POP()); rcontext=POP(); @@ -613,18 +633,18 @@ Value& Request::autocalc(Value& value, c self=static_cast(POP()); fprintf(stderr, "<-ja returned"); - return *result; } else - return value; + result=&value; + + if(name) + result->set_name(*name); + return *result; } -char *Request::execute_static(VClass& vclass, String& method_name, bool return_cstr) { - Value *value=vclass.get_element(method_name); - if(value) { // found some 'METHOD_NAME' element - Junction *junction=value->get_junction(); - if(junction) {// it even has junction! - const Method *method=junction->method; - if(method) { // and junction is method-junction! call it +char *Request::execute_static_method(VClass& vclass, String& method_name, bool return_cstr) { + if(Value *value=vclass.get_element(method_name)) { // found some 'METHOD_NAME' element + if(Junction *junction=value->get_junction()) {// it even has junction! + if(const Method *method=junction->method) { // and junction is method-junction! call it PUSH(self); PUSH(root); PUSH(rcontext);