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