Diff for /parser3/src/main/execute.C between versions 1.258 and 1.278

version 1.258, 2002/09/02 10:49:22 version 1.278, 2002/10/14 11:37:37
Line 44  char *opcode_name[]={ Line 44  char *opcode_name[]={
         "GET_CLASS",          "GET_CLASS",
         "CONSTRUCT_VALUE", "CONSTRUCT_EXPR", "CURLY_CODE__CONSTRUCT",          "CONSTRUCT_VALUE", "CONSTRUCT_EXPR", "CURLY_CODE__CONSTRUCT",
         "WRITE_VALUE",  "WRITE_EXPR_RESULT",  "STRING__WRITE",          "WRITE_VALUE",  "WRITE_EXPR_RESULT",  "STRING__WRITE",
         "GET_ELEMENT_OR_OPERATOR", "GET_ELEMENT",       "GET_ELEMENT__WRITE",          "GET_ELEMENT_OR_OPERATOR", "OP_GET_ELEMENT_OR_JUNCTION_EXPAND",
           "GET_ELEMENT",  "GET_ELEMENT__WRITE",
         "OBJECT_POOL",  "STRING_POOL",          "OBJECT_POOL",  "STRING_POOL",
         "STORE_PARAM",          "STORE_PARAM",
         "PREPARE_TO_CONSTRUCT_OBJECT",  "PREPARE_TO_EXPRESSION",           "PREPARE_TO_CONSTRUCT_OBJECT",  "PREPARE_TO_EXPRESSION", 
Line 54  char *opcode_name[]={ Line 55  char *opcode_name[]={
         "NEG", "INV", "NOT", "DEF", "IN", "FEXISTS", "DEXISTS",          "NEG", "INV", "NOT", "DEF", "IN", "FEXISTS", "DEXISTS",
         // expression ops: binary          // expression ops: binary
         "SUB", "ADD", "MUL", "DIV", "MOD", "INTDIV",          "SUB", "ADD", "MUL", "DIV", "MOD", "INTDIV",
           "BIN_SL", "BIN_SR",
         "BIN_AND", "BIN_OR", "BIN_XOR",          "BIN_AND", "BIN_OR", "BIN_XOR",
         "LOG_AND", "LOG_OR", "LOG_XOR",          "LOG_AND", "LOG_OR", "LOG_XOR",
         "NUM_LT", "NUM_GT", "NUM_LE", "NUM_GE", "NUM_EQ", "NUM_NE",          "NUM_LT", "NUM_GT", "NUM_LE", "NUM_GE", "NUM_EQ", "NUM_NE",
Line 111  void debug_dump(Pool& pool, int level, c Line 113  void debug_dump(Pool& pool, int level, c
 #define POP_NAME() static_cast<Value *>(stack.pop())->as_string()  #define POP_NAME() static_cast<Value *>(stack.pop())->as_string()
 #define POP_CODE() static_cast<Array *>(stack.pop())  #define POP_CODE() static_cast<Array *>(stack.pop())
   
 void Request::execute(const Array& ops, bool clean_junctions) {  void Request::execute(const Array& ops) {
 //      _asm int 3;  //      _asm int 3;
 #ifdef DEBUG_EXECUTE  #ifdef DEBUG_EXECUTE
         debug_printf(pool(), "source----------------------------\n");          debug_printf(pool(), "source----------------------------\n");
Line 208  void Request::execute(const Array& ops, Line 210  void Request::execute(const Array& ops,
                                 debug_dump(pool(), 1, *local_ops);                                  debug_dump(pool(), 1, *local_ops);
 #endif                            #endif                          
                                 Junction& j=*NEW Junction(pool(),                                   Junction& j=*NEW Junction(pool(), 
                                         *self, 0, 0,                                          *self, 0,
                                         method_frame,                                           method_frame, 
                                         rcontext,                                           rcontext, 
                                         wcontext,                                           wcontext, 
Line 258  void Request::execute(const Array& ops, Line 260  void Request::execute(const Array& ops,
                                                   
                 case OP_GET_ELEMENT_OR_OPERATOR:                  case OP_GET_ELEMENT_OR_OPERATOR:
                         {                          {
                                 //_asm int 3;  
                                 value=get_element(last_get_element_name, true);                                  value=get_element(last_get_element_name, true);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
                   case OP_GET_ELEMENT_OR_JUNCTION_EXPAND:
                           {
                                   value=get_element(last_get_element_name, false, true/* the only user */);
                                   PUSH(value);
                                   break;
                           }
                 case OP_GET_ELEMENT:                  case OP_GET_ELEMENT:
                         {                          {
                                 //_asm int 3;  
                                 value=get_element(last_get_element_name, false);                                  value=get_element(last_get_element_name, false);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
Line 286  void Request::execute(const Array& ops, Line 292  void Request::execute(const Array& ops,
                                 WContext *saved_wcontext=wcontext;                                  WContext *saved_wcontext=wcontext;
                                 uchar saved_lang= flang;                                  uchar saved_lang= flang;
                                 flang=String::UL_PASS_APPENDED;                                  flang=String::UL_PASS_APPENDED;
                                 WWrapper local(pool(), 0 /*empty*/);                                  WWrapper local(pool(), 0 /*empty*/, wcontext);
                                 wcontext=&local;                                  wcontext=&local;
   
                                 execute(*local_ops);                                  execute(*local_ops);
Line 303  void Request::execute(const Array& ops, Line 309  void Request::execute(const Array& ops,
                                 const Array *local_ops=reinterpret_cast<const Array *>(i.next());                                  const Array *local_ops=reinterpret_cast<const Array *>(i.next());
   
                                 WContext *saved_wcontext=wcontext;                                  WContext *saved_wcontext=wcontext;
                                 WWrapper local(pool(), 0 /*empty*/);                                  WWrapper local(pool(), 0 /*empty*/, wcontext);
                                 wcontext=&local;                                  wcontext=&local;
   
                                 execute(*local_ops);                                  execute(*local_ops);
Line 348  void Request::execute(const Array& ops, Line 354  void Request::execute(const Array& ops,
                                 // in .process we would test that field                                   // in .process we would test that field 
                                 // in decision "which wwrapper to use"                                  // in decision "which wwrapper to use"
                                 Junction& j=*NEW Junction(pool(),                                   Junction& j=*NEW Junction(pool(), 
                                         *self, 0, 0,                                          *self, 0,
                                         method_frame,                                           method_frame, 
                                         rcontext,                                           rcontext, 
                                         op.code==OP_EXPR_CODE__STORE_PARAM?0:wcontext,                                           op.code==OP_EXPR_CODE__STORE_PARAM?0:wcontext, 
Line 386  void Request::execute(const Array& ops, Line 392  void Request::execute(const Array& ops,
 #endif  #endif
                                 value=POP();                                  value=POP();
   
                                 // info:   
                                 //      code compiled so that this one's always method-junction,   
                                 //      not a code-junction  
                                 Junction *junction=value->get_junction();                                  Junction *junction=value->get_junction();
                                 if(!junction)                                  if(!junction)
                                         throw Exception("parser.runtime",                                          throw Exception("parser.runtime",
                                                 last_get_element_name,                                                   last_get_element_name, 
                                                 "(%s) not a method or junction, can not call it",                                                  "(%s) not a method or junction, can not call it",
                                                         value->type());                                                          value->type());
                                   // check: 
                                   //      that this is method-junction, not a code-junction
                                   // [disabling these contstructions:]
                                   // $junction{code}
                                   //  ^junction[]
                                   if(!junction->method)
                                           throw Exception("parser.runtime",
                                                   last_get_element_name, 
                                                   "(%s) is code junction, can not call it",
                                                           value->type());
   
                                 VMethodFrame frame(pool(), *last_get_element_name, *junction);                                  VMethodFrame frame(pool(), *last_get_element_name, *junction);
                                 if(local_ops){ // store param code goes here                                  if(local_ops){ // store param code goes here
Line 628  void Request::execute(const Array& ops, Line 641  void Request::execute(const Array& ops,
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
                   case OP_BIN_SL:
                           {
                                   b=POP();  a=POP();
                                   value=NEW VInt(pool(), 
                                           a->as_int() <<
                                           b->as_int());
                                   PUSH(value);
                                   break;
                           }
                   case OP_BIN_SR:
                           {
                                   b=POP();  a=POP();
                                   value=NEW VInt(pool(), 
                                           a->as_int() >>
                                           b->as_int());
                                   PUSH(value);
                                   break;
                           }
                 case OP_BIN_AND:                  case OP_BIN_AND:
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 value=NEW VDouble(pool(),                                   value=NEW VInt(pool(), 
                                         a->as_int() &                                          a->as_int() &
                                         b->as_int());                                          b->as_int());
                                 PUSH(value);                                  PUSH(value);
Line 640  void Request::execute(const Array& ops, Line 671  void Request::execute(const Array& ops,
                 case OP_BIN_OR:                  case OP_BIN_OR:
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 value=NEW VDouble(pool(),                                   value=NEW VInt(pool(), 
                                         a->as_int() |                                          a->as_int() |
                                         b->as_int());                                          b->as_int());
                                 PUSH(value);                                  PUSH(value);
Line 649  void Request::execute(const Array& ops, Line 680  void Request::execute(const Array& ops,
                 case OP_BIN_XOR:                  case OP_BIN_XOR:
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 value=NEW VDouble(pool(),                                   value=NEW VInt(pool(), 
                                         a->as_int() ^                                          a->as_int() ^
                                         b->as_int());                                          b->as_int());
                                 PUSH(value);                                  PUSH(value);
Line 695  void Request::execute(const Array& ops, Line 726  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result < 0);                                  value=NEW VBool(pool(), result < 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 703  void Request::execute(const Array& ops, Line 734  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result > 0);                                  value=NEW VBool(pool(), result > 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 711  void Request::execute(const Array& ops, Line 742  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result <= 0);                                  value=NEW VBool(pool(), result <= 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 719  void Request::execute(const Array& ops, Line 750  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result >= 0);                                  value=NEW VBool(pool(), result >= 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 727  void Request::execute(const Array& ops, Line 758  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result == 0);                                  value=NEW VBool(pool(), result == 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 735  void Request::execute(const Array& ops, Line 766  void Request::execute(const Array& ops,
                         {                          {
                                 b=POP();  a=POP();                                  b=POP();  a=POP();
                                 double result=a->as_double() - b->as_double();                                  double result=a->as_double() - b->as_double();
                                 value=NEW VBool(pool(), result != 0);                                  value=NEW VBool(pool(), result != 0.0);
                                 PUSH(value);                                  PUSH(value);
                                 break;                                  break;
                         }                          }
Line 798  void Request::execute(const Array& ops, Line 829  void Request::execute(const Array& ops,
 }  }
   
 /// @test cache|prepare junctions   /// @test cache|prepare junctions 
 Value *Request::get_element(const String *& remember_name, bool can_call_operator) {  Value *Request::get_element(const String *& remember_name, 
                                                           bool can_call_operator, bool should_explode_junction) {
         const String& name=POP_NAME();  remember_name=&name;          const String& name=POP_NAME();  remember_name=&name;
         Value *ncontext=POP();          Value *ncontext=POP();
         Value *value=0;          Value *value=0;
Line 806  Value *Request::get_element(const String Line 838  Value *Request::get_element(const String
                 if(Method* method=OP.get_method(name)) { // looking operator of that name FIRST                  if(Method* method=OP.get_method(name)) { // looking operator of that name FIRST
                         // as if that method were in self and we have normal dynamic method here                          // as if that method were in self and we have normal dynamic method here
                         Junction& junction=*NEW Junction(pool(),                           Junction& junction=*NEW Junction(pool(), 
                                 *method_frame, self->get_class(), method, 0,0,0,0);                                  *method_frame, method, 0,0,0,0);
                         value=NEW VJunction(junction);                          value=NEW VJunction(junction);
                 }                  }
         }          }
Line 826  Value *Request::get_element(const String Line 858  Value *Request::get_element(const String
                 value=ncontext->get_element(name, ncontext, false);                  value=ncontext->get_element(name, ncontext, false);
   
 _void:  _void:
         if(value)          if(value) {
                 value=&process_to_value(*value); // process possible code-junction                  if(should_explode_junction) // process $junction, but leave $junction.xxx as is
         else                          value=&process_to_value(*value); // process possible code-junction
           } else
                 value=NEW VVoid(pool());                  value=NEW VVoid(pool());
   
         return value;          return value;
Line 875  StringOrValue Request::process(Value& in Line 908  StringOrValue Request::process(Value& in
                 if(using_code_frame) {                  if(using_code_frame) {
                         // almost plain wwrapper about junction wcontext,                           // almost plain wwrapper about junction wcontext, 
                         // BUT intercepts string writes                          // BUT intercepts string writes
                         VCodeFrame local(pool(), *junction->wcontext);                            VCodeFrame local(pool(), *junction->wcontext, junction->wcontext);
                         wcontext=&local;                          wcontext=&local;
   
                         // execute it                          // execute it
Line 887  StringOrValue Request::process(Value& in Line 920  StringOrValue Request::process(Value& in
                         result.set_string(*wcontext->get_string());                          result.set_string(*wcontext->get_string());
                 } else {                  } else {
                         // plain wwrapper                          // plain wwrapper
                         WWrapper local(pool(), 0/*empty*/);                          WWrapper local(pool(), 0/*empty*/, wcontext);
                         wcontext=&local;                          wcontext=&local;
                                   
                         // execute it                          // execute it
Line 945  void Request::execute_method(Value& asel Line 978  void Request::execute_method(Value& asel
         // initialize contexts          // initialize contexts
         //method_frame=rcontext=self=&aself;          //method_frame=rcontext=self=&aself;
         self=&aself;              self=&aself;    
 //      WWrapper local(pool(), &aself);  //      WWrapper local(pool(), &aself, wcontext);
 //      wcontext=&local;   //      wcontext=&local; 
         Junction local_junction(pool(), *self, self->get_class(), &method, 0,0,0,0);          Junction local_junction(pool(), *self, &method, 0,0,0,0);
         VMethodFrame local_frame(pool(), method.name, local_junction);          VMethodFrame local_frame(pool(), method.name, local_junction);
         if(optional_param && local_frame.can_store_param()) {          if(optional_param && local_frame.can_store_param()) {
                 local_frame.store_param(optional_param);                  local_frame.store_param(optional_param);

Removed from v.1.258  
changed lines
  Added in v.1.278


E-mail: