Ejemplo n.º 1
0
    POETCode* eval_cvar_attr(CodeVar* cv, LocalVar* lv)
    {
      CvarSymbolTable::Entry cv_e = cv->get_entry();
      LvarSymbolTable* symTable = cv_e.get_symTable();
      LvarSymbolTable::Entry e = lv->get_entry();
      if (symTable->find(e.get_name()) != lv) return 0;

      POETCode* res = 0;
      switch (e.get_entry_type()) {
       case LVAR_CODEPAR:
           res = eval_tuple_access(cv->get_args(), e.get_code()); 
           break;
       case LVAR_ATTR:
          for (int i = 0; i < cv_e.attr_size(); ++i) {
             if (cv_e.get_attr(i) == lv) { 
                POETCode* tuple = cv->get_attr();
                if (tuple == 0) res = e.get_code();
                else res = eval_tuple_access(tuple,i);
                break;
             }
          }
          break;
       default: /*QY: access is a local variable. treat this as tuple access*/
           res = eval_tuple_access(cv, lv);
      }
      return res;
   }
Ejemplo n.º 2
0
POETCode* CodeVar::get_static_attr(const std::string& name) const
 {
      LvarSymbolTable* local = get_entry().get_symTable();
      LocalVar* b = local->find(ASTFactory::inst()->new_string(name));
      if (b != 0) 
         return b->get_entry().get_code();
      return 0;
 }