--- parser3/src/main/execute.C 2001/03/10 11:44:42 1.82 +++ parser3/src/main/execute.C 2001/03/10 16:34:39 1.88 @@ -1,5 +1,9 @@ /* - $Id: execute.C,v 1.82 2001/03/10 11:44:42 paf Exp $ + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan + + $Id: execute.C,v 1.88 2001/03/10 16:34:39 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,7 +120,6 @@ 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); @@ -179,7 +182,14 @@ void Request::execute(const Array& ops) case OP_WRITE: { Value *value=POP(); - wcontext->write(*value); + write(*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(); - wcontext->write(*value); + write(*value); break; } @@ -299,7 +309,9 @@ void Request::execute(const Array& ops) if(wcontext->constructing()) { // constructing? // yes, constructor call: $some(^class:method(..)) self=NEW VObject(pool(), *called_class); - frame->write(*self); + frame->write(*self, + String::Untaint_lang::NO // not used, always an object, not string + ); } else self=&frame->junction.self; // no, static or simple dynamic call @@ -560,7 +572,7 @@ Value *Request::get_element() { Value *value=ncontext->get_element(name); if(value) - value=&autocalc(*value); // autocalc possible code-junction + value=&autocalc(*value, &name); // autocalc possible code-junction else { value=NEW VUnknown(pool()); value->set_name(name); @@ -569,7 +581,7 @@ Value *Request::get_element() { return value; } -Value& Request::autocalc(Value& value, bool make_string) { +Value& Request::autocalc(Value& value, const String *name, bool make_string) { Junction *junction=value.get_junction(); if(junction && junction->code) { // is it a code-junction? // autocalc it @@ -602,6 +614,8 @@ Value& Request::autocalc(Value& value, b result=NEW VString(*frame->get_string()); } else result=frame->result(); + if(name) + result->set_name(*name); wcontext=static_cast(POP()); rcontext=POP(); @@ -613,3 +627,42 @@ Value& Request::autocalc(Value& value, b } else return value; } + +char *Request::execute_static_method(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 + PUSH(self); + PUSH(root); + PUSH(rcontext); + PUSH(wcontext); + + // initialize contexts + root=rcontext=self=&vclass; + wcontext=NEW WWrapper(pool(), &vclass, false /* not constructing */); + + // execute! + execute(*method->parser_code); + + // result + char *result; + if(return_cstr) + result=wcontext->get_string()->cstr(); // chars + else + result=0; // ignore result + + wcontext=static_cast(POP()); + rcontext=POP(); + root=POP(); + self=static_cast(POP()); + + // return + return result; + } + } + } + return 0; +}