|
|
|
@@ -43,26 +43,28 @@ static AbstractBasePtr Reabs(const AbstractBasePtr &t) { |
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
AbstractBasePtr res = t; |
|
|
|
if (t->isa<AbstractClass>()) { |
|
|
|
auto abs_class = dyn_cast<AbstractClass>(t); |
|
|
|
AbstractBasePtrList baselist; |
|
|
|
auto attributes = abs_class->attributes(); |
|
|
|
(void)std::transform(attributes.begin(), attributes.end(), std::back_inserter(baselist), |
|
|
|
[](const AbstractAttribute &item) { return item.second; }); |
|
|
|
res = std::make_shared<AbstractTuple>(baselist); |
|
|
|
} else if (t->isa<AbstractDictionary>()) { |
|
|
|
return std::make_shared<AbstractTuple>(baselist); |
|
|
|
} |
|
|
|
if (t->isa<AbstractDictionary>()) { |
|
|
|
auto abs_dict = dyn_cast<AbstractDictionary>(t); |
|
|
|
AbstractBasePtrList baselist; |
|
|
|
auto elements = abs_dict->elements(); |
|
|
|
(void)std::transform(elements.begin(), elements.end(), std::back_inserter(baselist), |
|
|
|
[](const AbstractAttribute &item) { return item.second; }); |
|
|
|
res = std::make_shared<AbstractTuple>(baselist); |
|
|
|
} else if (t->isa<AbstractList>()) { |
|
|
|
auto abs_dict = dyn_cast<AbstractList>(t); |
|
|
|
res = std::make_shared<AbstractTuple>(abs_dict->elements()); |
|
|
|
return std::make_shared<AbstractTuple>(baselist); |
|
|
|
} |
|
|
|
if (t->isa<AbstractList>()) { |
|
|
|
auto abs_list = dyn_cast<AbstractList>(t); |
|
|
|
return std::make_shared<AbstractTuple>(abs_list->elements()); |
|
|
|
} |
|
|
|
return res; |
|
|
|
|
|
|
|
return nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
AnfNodePtr ConvertGetAttrToTupleGetItem(const CNodePtr &node) { |
|
|
|
@@ -376,7 +378,12 @@ bool SimplifyDataStructures(const FuncGraphPtr &root, const FuncGraphManagerPtr |
|
|
|
|
|
|
|
for (auto &node : manager->all_nodes()) { |
|
|
|
auto ret = Reabs(node->abstract()); |
|
|
|
node->set_abstract(ret); |
|
|
|
if (ret) { |
|
|
|
MS_LOG(DEBUG) << "Replace " << node->DebugString() << "'s abstract " << node->abstract()->ToString() << " with " |
|
|
|
<< ret->ToString(); |
|
|
|
node->set_abstract(ret); |
|
|
|
changed = true; |
|
|
|
} |
|
|
|
} |
|
|
|
return changed; |
|
|
|
} |
|
|
|
|