--- parser3/src/main/execute.C 2001/03/13 12:37:05 1.99 +++ parser3/src/main/execute.C 2001/03/13 19:35:06 1.104 @@ -3,7 +3,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: execute.C,v 1.99 2001/03/13 12:37:05 paf Exp $ + $Id: execute.C,v 1.104 2001/03/13 19:35:06 paf Exp $ */ #include "pa_array.h" @@ -50,7 +50,8 @@ char *opcode_name[]={ "BIN_AND", "BIN_OR", "BIN_XOR", "LOG_AND", "LOG_OR", "LOG_XOR", "NUM_LT", "NUM_GT", "NUM_LE", "NUM_GE", "NUM_EQ", "NUM_NE", - "STR_LT", "STR_GT", "STR_LE", "STR_GE", "STR_EQ", "STR_NE" + "STR_LT", "STR_GT", "STR_LE", "STR_GE", "STR_EQ", "STR_NE", + "IS" }; void dump(int level, const Array& ops) { @@ -282,8 +283,7 @@ void Request::execute(const Array& ops) value->type()); VMethodFrame *frame=NEW VMethodFrame(pool(), *junction); - //frame->set_name(junction->self.name()); - frame->set_name(value->name()); + //frame->set_name(value->name()); PUSH(frame); break; } @@ -305,9 +305,9 @@ void Request::execute(const Array& ops) PUSH(rcontext); PUSH(wcontext); - VClass *called_class=frame->junction.self.get_class(); + VStateless_class *called_class=frame->junction.self.get_class(); // is context object or class & is it my class or my parent's class? - VClass *read_class=rcontext->get_class(); + VStateless_class *read_class=rcontext->get_class(); if(read_class && read_class->is_or_derived_from(*called_class)) // yes self=rcontext; // class dynamic call else // no, not me or relative of mine (total stranger) @@ -317,6 +317,8 @@ void Request::execute(const Array& ops) // yes, this is a constructor call if(called_class->name()==TABLE_CLASS_NAME) self=NEW VTable(pool()); + else if(called_class->name()==ENV_CLASS_NAME) + self=NEW VEnv(pool()); else self=NEW VObject(pool(), *called_class); frame->write(*self, @@ -329,9 +331,8 @@ void Request::execute(const Array& ops) root=rcontext=wcontext=frame; { // take object or class from any wrappers - VAliased *aliased=self->get_aliased(); - // substitute class alias to the class they are called AS - Temp_alias temp_alias(*aliased, *frame->junction.vclass); + // and substitute class alias to the class they are called AS + Temp_alias temp_alias(*self->get_aliased(), *frame->junction.vclass); const Method& method=*frame->junction.method; if(method.native_code) { // native code? @@ -568,6 +569,13 @@ void Request::execute(const Array& ops) PUSH(value); break; } + case OP_IS: + { + Value *b=POP(); Value *a=POP(); + Value *value=NEW VBool(pool(), b->as_string() == a->type()); + PUSH(value); + break; + } default: THROW(0,0,