|
|
| version 1.90, 2001/03/11 09:24:43 | version 1.97, 2001/03/12 21:18:01 |
|---|---|
| Line 17 | Line 17 |
| #include "pa_vobject.h" | #include "pa_vobject.h" |
| #include "pa_vdouble.h" | #include "pa_vdouble.h" |
| #include "pa_vbool.h" | #include "pa_vbool.h" |
| #include "pa_vtable.h" | |
| #include <stdio.h> | #include <stdio.h> |
| Line 122 void Request::execute(const Array& ops) | Line 123 void Request::execute(const Array& ops) |
| Value *value=NEW VJunction(j); | Value *value=NEW VJunction(j); |
| // store param | // store param |
| frame->store_param(value); | frame->store_param(frame->name(), value); |
| break; | break; |
| } | } |
| case OP_GET_CLASS: | case OP_GET_CLASS: |
| Line 182 void Request::execute(const Array& ops) | Line 183 void Request::execute(const Array& ops) |
| case OP_WRITE: | case OP_WRITE: |
| { | { |
| Value *value=POP(); | Value *value=POP(); |
| write(*value); | write_assign_lang(*value); |
| break; | break; |
| } | } |
| case OP_STRING__WRITE: | case OP_STRING__WRITE: |
| Line 203 void Request::execute(const Array& ops) | Line 204 void Request::execute(const Array& ops) |
| case OP_GET_ELEMENT__WRITE: | case OP_GET_ELEMENT__WRITE: |
| { | { |
| Value *value=get_element(); | Value *value=get_element(); |
| write(*value); | write_assign_lang(*value); |
| break; | break; |
| } | } |
| Line 274 void Request::execute(const Array& ops) | Line 275 void Request::execute(const Array& ops) |
| if(!junction) | if(!junction) |
| THROW(0,0, | THROW(0,0, |
| &value->name(), | &value->name(), |
| "type is '%s', can not call it (must be method or junction)", | "(%s) uncallable, must be method or junction", |
| value->type()); | value->type()); |
| VMethodFrame *frame=NEW VMethodFrame(pool(), *junction); | 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); | PUSH(frame); |
| break; | break; |
| } | } |
| Line 286 void Request::execute(const Array& ops) | Line 288 void Request::execute(const Array& ops) |
| { | { |
| Value *value=POP(); | Value *value=POP(); |
| VMethodFrame *frame=static_cast<VMethodFrame *>(stack.top_value()); | VMethodFrame *frame=static_cast<VMethodFrame *>(stack.top_value()); |
| frame->store_param(value); | frame->store_param(frame->name(), value); |
| break; | break; |
| } | } |
| Line 307 void Request::execute(const Array& ops) | Line 309 void Request::execute(const Array& ops) |
| self=rcontext; // class dynamic call | self=rcontext; // class dynamic call |
| else // no, not me or relative of mine (total stranger) | else // no, not me or relative of mine (total stranger) |
| if(wcontext->constructing()) { // constructing? | if(wcontext->constructing()) { // constructing? |
| // yes, constructor call: $some(^class:method(..)) | // yes, constructor call: $some[^class:method[..]] |
| self=NEW VObject(pool(), *called_class); | if(called_class->name()==TABLE_CLASS_NAME) |
| self=NEW VTable(pool()); | |
| else | |
| self=NEW VObject(pool(), *called_class); | |
| frame->write(*self, | frame->write(*self, |
| String::Untaint_lang::NO // not used, always an object, not string | String::Untaint_lang::NO // not used, always an object, not string |
| ); | ); |
| Line 325 void Request::execute(const Array& ops) | Line 330 void Request::execute(const Array& ops) |
| Method& method=*frame->junction.method; | Method& method=*frame->junction.method; |
| if(method.native_code) { // native code? | if(method.native_code) { // native code? |
| method.check_actual_numbered_params(frame->numbered_params()); | method.check_actual_numbered_params( |
| (*method.native_code)(*this, frame->numbered_params()); // execute it | frame->name(), frame->numbered_params()); |
| (*method.native_code)(*this, | |
| frame->name(), frame->numbered_params()); // execute it | |
| } else // parser code | } else // parser code |
| execute(*method.parser_code); // execute it | execute(*method.parser_code); // execute it |
| } | } |
| Line 353 void Request::execute(const Array& ops) | Line 360 void Request::execute(const Array& ops) |
| case OP_INV: | case OP_INV: |
| { | { |
| Value *operand=POP(); | Value *operand=POP(); |
| Value *value=NEW VDouble(pool(), ~static_cast<int>(operand->get_double())); | Value *value=NEW VDouble(pool(), ~(int)operand->get_double()); |
| PUSH(value); | PUSH(value); |
| break; | break; |
| } | } |
| Line 419 void Request::execute(const Array& ops) | Line 426 void Request::execute(const Array& ops) |
| { | { |
| Value *b=POP(); Value *a=POP(); | Value *b=POP(); Value *a=POP(); |
| Value *value=NEW VDouble(pool(), | Value *value=NEW VDouble(pool(), |
| static_cast<int>(a->get_double()) % | (int)a->get_double() % |
| static_cast<int>(b->get_double())); | (int)b->get_double()); |
| PUSH(value); | PUSH(value); |
| break; | break; |
| } | } |
| Line 428 void Request::execute(const Array& ops) | Line 435 void Request::execute(const Array& ops) |
| { | { |
| Value *b=POP(); Value *a=POP(); | Value *b=POP(); Value *a=POP(); |
| Value *value=NEW VDouble(pool(), | Value *value=NEW VDouble(pool(), |
| static_cast<int>(a->get_double()) & | (int)a->get_double() & |
| static_cast<int>(b->get_double())); | (int)b->get_double()); |
| PUSH(value); | PUSH(value); |
| break; | break; |
| } | } |
| Line 437 void Request::execute(const Array& ops) | Line 444 void Request::execute(const Array& ops) |
| { | { |
| Value *b=POP(); Value *a=POP(); | Value *b=POP(); Value *a=POP(); |
| Value *value=NEW VDouble(pool(), | Value *value=NEW VDouble(pool(), |
| static_cast<int>(a->get_double()) | | (int)a->get_double() | |
| static_cast<int>(b->get_double())); | (int)b->get_double()); |
| PUSH(value); | PUSH(value); |
| break; | break; |
| } | } |
| Line 446 void Request::execute(const Array& ops) | Line 453 void Request::execute(const Array& ops) |
| { | { |
| Value *b=POP(); Value *a=POP(); | Value *b=POP(); Value *a=POP(); |
| Value *value=NEW VDouble(pool(), | Value *value=NEW VDouble(pool(), |
| static_cast<int>(a->get_double()) ^ | (int)a->get_double() ^ |
| static_cast<int>(b->get_double())); | (int)b->get_double()); |
| PUSH(value); | PUSH(value); |
| break; | break; |
| } | } |
| Line 572 Value *Request::get_element() { | Line 579 Value *Request::get_element() { |
| Value *value=ncontext->get_element(name); | Value *value=ncontext->get_element(name); |
| if(value) | if(value) |
| value=&autocalc(*value, &name); // autocalc possible code-junction | value=&process(*value, &name); // process possible code-junction |
| else { | else { |
| value=NEW VUnknown(pool()); | value=NEW VUnknown(pool()); |
| value->set_name(name); | value->set_name(name); |
| Line 581 Value *Request::get_element() { | Line 588 Value *Request::get_element() { |
| return value; | return value; |
| } | } |
| Value& Request::autocalc(Value& value, const String *name, bool intercept_string) { | Value& Request::process(Value& value, const String *name, bool intercept_string) { |
| // intercept_string: | // intercept_string: |
| // true: | // true: |
| // they want result=string value, | // they want result=string value, |
| Line 591 Value& Request::autocalc(Value& value, c | Line 598 Value& Request::autocalc(Value& value, c |
| // nothing goes to wcontext. | // nothing goes to wcontext. |
| // used in (expression) params evaluation | // used in (expression) params evaluation |
| Value *result; | |
| Junction *junction=value.get_junction(); | Junction *junction=value.get_junction(); |
| if(junction && junction->code) { // is it a code-junction? | if(junction && junction->code) { // is it a code-junction? |
| // autocalc it | // process it |
| fprintf(stderr, "ja->\n"); | fprintf(stderr, "ja->\n"); |
| PUSH(self); | PUSH(self); |
| PUSH(root); | PUSH(root); |
| Line 615 Value& Request::autocalc(Value& value, c | Line 623 Value& Request::autocalc(Value& value, c |
| root=junction->root; | root=junction->root; |
| rcontext=junction->rcontext; | rcontext=junction->rcontext; |
| execute(*junction->code); | execute(*junction->code); |
| Value *result; | |
| if(intercept_string) { | if(intercept_string) { |
| // CodeFrame soul: | // CodeFrame soul: |
| // string writes were intercepted | // string writes were intercepted |
| Line 623 Value& Request::autocalc(Value& value, c | Line 630 Value& Request::autocalc(Value& value, c |
| result=NEW VString(*frame->get_string()); | result=NEW VString(*frame->get_string()); |
| } else | } else |
| result=frame->result(); | result=frame->result(); |
| if(name) | |
| result->set_name(*name); | |
| wcontext=static_cast<WContext *>(POP()); | wcontext=static_cast<WContext *>(POP()); |
| rcontext=POP(); | rcontext=POP(); |
| Line 632 Value& Request::autocalc(Value& value, c | Line 637 Value& Request::autocalc(Value& value, c |
| self=static_cast<VAliased *>(POP()); | self=static_cast<VAliased *>(POP()); |
| fprintf(stderr, "<-ja returned"); | fprintf(stderr, "<-ja returned"); |
| return *result; | |
| } else | } else |
| return value; | result=&value; |
| if(name) | |
| result->set_name(*name); | |
| return *result; | |
| } | } |
| char *Request::execute_static_method(VClass& vclass, String& method_name, bool return_cstr) { | char *Request::execute_static_method(VClass& vclass, String& method_name, bool return_cstr) { |
| Value *value=vclass.get_element(method_name); | if(const Method *method=vclass.get_method(method_name)) { |
| if(value) { // found some 'METHOD_NAME' element | PUSH(self); |
| Junction *junction=value->get_junction(); | PUSH(root); |
| if(junction) {// it even has junction! | PUSH(rcontext); |
| const Method *method=junction->method; | PUSH(wcontext); |
| if(method) { // and junction is method-junction! call it | |
| PUSH(self); | // initialize contexts |
| PUSH(root); | root=rcontext=self=&vclass; |
| PUSH(rcontext); | wcontext=NEW WWrapper(pool(), &vclass, false /* not constructing */); |
| PUSH(wcontext); | |
| // execute! | |
| // initialize contexts | execute(*method->parser_code); |
| root=rcontext=self=&vclass; | |
| wcontext=NEW WWrapper(pool(), &vclass, false /* not constructing */); | // result |
| char *result; | |
| // execute! | if(return_cstr) |
| execute(*method->parser_code); | result=wcontext->get_string()->cstr(); // chars |
| else | |
| // result | result=0; // ignore result |
| char *result; | |
| if(return_cstr) | wcontext=static_cast<WContext *>(POP()); |
| result=wcontext->get_string()->cstr(); // chars | rcontext=POP(); |
| else | root=POP(); |
| result=0; // ignore result | self=static_cast<VAliased *>(POP()); |
| wcontext=static_cast<WContext *>(POP()); | // return |
| rcontext=POP(); | return result; |
| root=POP(); | |
| self=static_cast<VAliased *>(POP()); | |
| // return | |
| return result; | |
| } | |
| } | |
| } | } |
| return 0; | return 0; |
| } | } |