--- parser3/src/main/execute.C 2001/03/06 14:09:36 1.51 +++ parser3/src/main/execute.C 2001/03/06 17:18:57 1.56 @@ -1,5 +1,5 @@ /* - $Id: execute.C,v 1.51 2001/03/06 14:09:36 paf Exp $ + $Id: execute.C,v 1.56 2001/03/06 17:18:57 paf Exp $ */ #include "pa_array.h" @@ -12,6 +12,7 @@ #include "pa_vmframe.h" #include "pa_vobject.h" #include "pa_vdouble.h" +#include "pa_vbool.h" #include @@ -22,7 +23,7 @@ char *opcode_name[]={ // literals - "STRING", "CODE", "CLASS", + "VALUE", "CODE", "CLASS", // actions "WITH_SELF", "WITH_ROOT", "WITH_READ", "WITH_WRITE", @@ -40,11 +41,10 @@ char *opcode_name[]={ "NEG", "INV", "NOT", "DEF", "IN", "FEXISTS", // expression ops: binary "SUB", "ADD", "MUL", "DIV", "MOD", - "BIN_AND", "BIN_OR", - "LOG_AND", "LOG_OR", + "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", - "XOR" + "STR_LT", "STR_GT", "STR_LE", "STR_GE", "STR_EQ", "STR_NE" }; void dump(int level, const Array& ops) { @@ -65,9 +65,9 @@ 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_STRING) { - VString *vstring=static_cast(ops.quick_get(++i)); - fprintf(stderr, " \"%s\"", vstring->get_string()->cstr()); + if(op.code==OP_VALUE) { + Value *value=static_cast(ops.quick_get(++i)); + fprintf(stderr, " \"%s\" %s", value->get_string()->cstr(), value->type()); } if(op.code==OP_CLASS) { VClass *vclass=static_cast(ops.quick_get(++i)); @@ -98,11 +98,11 @@ void Request::execute(const Array& ops) switch(op.code) { // param in next instruction - case OP_STRING: + case OP_VALUE: { - VString *vstring=static_cast(ops.quick_get(++i)); - fprintf(stderr, " \"%s\"", vstring->get_string()->cstr()); - PUSH(vstring); + Value *value=static_cast(ops.quick_get(++i)); + fprintf(stderr, " \"%s\" %s", value->get_string()->cstr(), value->type()); + PUSH(value); break; } case OP_CODE: @@ -296,7 +296,52 @@ void Request::execute(const Array& ops) break; } - // EXPRESSION + // expression ops: unary + case OP_NEG: + { + Value *operand=POP(); + Value *value=NEW VDouble(pool(), -operand->get_double()); + PUSH(value); + break; + } + case OP_INV: + { + Value *operand=POP(); + Value *value=NEW VDouble(pool(), + ~static_cast(operand->get_double())); + PUSH(value); + break; + } + case OP_NOT: + { + Value *operand=POP(); + Value *value=NEW VBool(pool(), !operand->get_bool()); + PUSH(value); + break; + } + //todo: def in fexists + + // expression ops: binary + case OP_SUB: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + a->get_double() - + b->get_double()); + PUSH(value); + break; + } + case OP_ADD: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + a->get_double() + + b->get_double()); + PUSH(value); + break; + } case OP_MUL: { Value *b=POP(); @@ -307,6 +352,161 @@ void Request::execute(const Array& ops) PUSH(value); break; } + case OP_DIV: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + a->get_double() / + b->get_double()); + PUSH(value); + break; + } + case OP_MOD: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + static_cast(a->get_double()) % + static_cast(b->get_double())); + PUSH(value); + break; + } + case OP_BIN_AND: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + static_cast(a->get_double()) & + static_cast(b->get_double())); + PUSH(value); + break; + } + case OP_BIN_OR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + static_cast(a->get_double()) | + static_cast(b->get_double())); + PUSH(value); + break; + } + case OP_BIN_XOR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + static_cast(a->get_double()) ^ + static_cast(b->get_double())); + PUSH(value); + break; + } + case OP_LOG_AND: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_bool() && + b->get_bool()); + PUSH(value); + break; + } + case OP_LOG_OR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_bool() || + b->get_bool()); + PUSH(value); + break; + } + case OP_LOG_XOR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_bool() ^ + b->get_bool()); + PUSH(value); + break; + } + case OP_NUM_LT: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() < + b->get_double()); + PUSH(value); + break; + } + case OP_NUM_GT: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() > + b->get_double()); + PUSH(value); + break; + } + case OP_NUM_LE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() <= + b->get_double()); + PUSH(value); + break; + } + case OP_NUM_GE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() >= + b->get_double()); + PUSH(value); + break; + } + case OP_NUM_EQ: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() == + b->get_double()); + PUSH(value); + break; + } + case OP_NUM_NE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_double() != + b->get_double()); + PUSH(value); + break; + } + case OP_STR_LT: + case OP_STR_GT: + case OP_STR_LE: + case OP_STR_GE: + case OP_STR_EQ: + case OP_STR_NE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + /*a->get_string() @ + b->get_string()*/false); + PUSH(value); + break; + } default: fprintf(stderr, "\tTODO");