Diff for /parser3/src/main/execute.C between versions 1.90 and 1.97

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

Removed from v.1.90  
changed lines
  Added in v.1.97


E-mail: