|
|
| version 1.38, 2001/02/25 08:12:22 | version 1.44, 2001/02/25 14:47:13 |
|---|---|
| Line 57 void dump(int level, const Array& ops) { | Line 57 void dump(int level, const Array& ops) { |
| } | } |
| if(op.code==OP_CLASS) { | if(op.code==OP_CLASS) { |
| VClass *vclass=static_cast<VClass *>(ops.quick_get(++i)); | VClass *vclass=static_cast<VClass *>(ops.quick_get(++i)); |
| printf(" \"%s\"", vclass->name()->cstr()); | printf(" \"%s\"", vclass->name().cstr()); |
| } | } |
| printf("\n"); | printf("\n"); |
| Line 108 void Request::execute(const Array& ops) | Line 108 void Request::execute(const Array& ops) |
| case OP_CLASS: | case OP_CLASS: |
| { | { |
| VClass *vclass=static_cast<VClass *>(ops.quick_get(++i)); | VClass *vclass=static_cast<VClass *>(ops.quick_get(++i)); |
| printf(" \"%s\"", vclass->name().cstr()); | |
| PUSH(vclass); | PUSH(vclass); |
| break; | break; |
| } | } |
| Line 170 void Request::execute(const Array& ops) | Line 171 void Request::execute(const Array& ops) |
| case OP_CREATE_EWPOOL: | case OP_CREATE_EWPOOL: |
| { | { |
| PUSH(wcontext); | PUSH(wcontext); |
| wcontext=NEW WWrapper(pool(), 0 /* empty */); | wcontext=NEW WWrapper(pool(), 0 /* empty */, true /* constructing */); |
| break; | break; |
| } | } |
| case OP_REDUCE_EWPOOL: | case OP_REDUCE_EWPOOL: |
| Line 187 void Request::execute(const Array& ops) | Line 188 void Request::execute(const Array& ops) |
| PUSH(rcontext); | PUSH(rcontext); |
| rcontext=ncontext; | rcontext=ncontext; |
| PUSH(wcontext); | PUSH(wcontext); |
| wcontext=NEW WWrapper(pool(), ncontext); | wcontext=NEW WWrapper(pool(), ncontext, false /* not constructing */); |
| break; | break; |
| } | } |
| case OP_REDUCE_RWPOOL: | case OP_REDUCE_RWPOOL: |
| { | { |
| String *string=wcontext->get_string(); | String *string=wcontext->get_string(); |
| Value *value=NEW VString(string); | Value *value=NEW VString(*string); |
| wcontext=static_cast<WContext *>(POP()); | wcontext=static_cast<WContext *>(POP()); |
| rcontext=POP(); | rcontext=POP(); |
| PUSH(value); | PUSH(value); |
| Line 208 void Request::execute(const Array& ops) | Line 209 void Request::execute(const Array& ops) |
| Junction *junction=value->get_junction(); | Junction *junction=value->get_junction(); |
| if(!junction) | if(!junction) |
| THROW(0,0, | THROW(0,0, |
| value->name(), | &value->name(), |
| "is not a method or a junction (it is '%s'), can not call it", | "type is '%s', can not call it (must be method or junction)", |
| value->type()); | value->type()); |
| //unless(method) method=operators.get_method[...;code/native_code](name) | //unless(method) method=operators.get_method[...;code/native_code](name) |
| VMethodFrame *frame=NEW VMethodFrame(pool(), *junction); | VMethodFrame *frame=NEW VMethodFrame(pool(), *junction); |
| Line 231 void Request::execute(const Array& ops) | Line 232 void Request::execute(const Array& ops) |
| frame->fill_unspecified_params(); | frame->fill_unspecified_params(); |
| PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext); | PUSH(self); PUSH(root); PUSH(rcontext); PUSH(wcontext); |
| VClass *context_class=wcontext->get_class(); | |
| VClass *called_class=frame->junction.self.get_class(); | VClass *called_class=frame->junction.self.get_class(); |
| // context is some class? [variable already constructed?] | // constructing? |
| if(context_class) { // yes | if(wcontext->constructing()) { // yes |
| // is it me or one of my parents? | // constructor call: $some(^class:method(..)) |
| if(context_class->is_or_derived_from(*called_class)) // yes | |
| self=&frame->junction.self; // dynamic call | |
| else // no | |
| self=called_class; // static call | |
| } else { // no, we have constructor call here: $some(^class:method(..)) | |
| self=NEW VObject(pool(), *called_class); | self=NEW VObject(pool(), *called_class); |
| frame->write(self); | frame->write(self); |
| } else { // no | |
| // is it my class or my parent's class? | |
| VClass *read_class=rcontext->get_class(); | |
| if(read_class && read_class->is_or_derived_from(*called_class)) // yes | |
| self=rcontext; // class dynamic call | |
| else // no | |
| self=&frame->junction.self; // static or simple dynamic call | |
| } | } |
| frame->set_self(self); | frame->set_self(self); |
| Line 284 Value *Request::get_element() { | Line 286 Value *Request::get_element() { |
| // CodeFrame soul: | // CodeFrame soul: |
| // string writes were intercepted | // string writes were intercepted |
| // returning them as the result of getting code-junction | // returning them as the result of getting code-junction |
| value=NEW VString(frame.get_string()); | value=NEW VString(*frame.get_string()); |
| wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP(); | wcontext=static_cast<WContext *>(POP()); rcontext=POP(); root=POP(); self=POP(); |
| printf("<-ja returned"); | printf("<-ja returned"); |
| } | } |