Diff for /parser3/src/main/execute.C between versions 1.38 and 1.44

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");
                 }                  }

Removed from v.1.38  
changed lines
  Added in v.1.44


E-mail: