mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix BFS
This commit is contained in:
@@ -125,21 +125,23 @@ map<YulString, SideEffects> SideEffectsPropagator::sideEffects(
|
||||
{
|
||||
YulString funName = call.first;
|
||||
SideEffects sideEffects;
|
||||
util::BreadthFirstSearch<YulString>{call.second, {funName}}.run(
|
||||
[&](YulString _function, auto&& _addChild) {
|
||||
if (sideEffects == SideEffects::worst())
|
||||
return;
|
||||
if (BuiltinFunction const* f = _dialect.builtin(_function))
|
||||
sideEffects += f->sideEffects;
|
||||
else
|
||||
{
|
||||
if (ret.count(_function))
|
||||
sideEffects += ret[_function];
|
||||
for (YulString callee: _directCallGraph.functionCalls.at(_function))
|
||||
_addChild(callee);
|
||||
}
|
||||
auto _visit = [&, visited = std::set<YulString>{}](YulString _function, auto&& _recurse) mutable {
|
||||
if (!visited.insert(_function).second)
|
||||
return;
|
||||
if (sideEffects == SideEffects::worst())
|
||||
return;
|
||||
if (BuiltinFunction const* f = _dialect.builtin(_function))
|
||||
sideEffects += f->sideEffects;
|
||||
else
|
||||
{
|
||||
if (ret.count(_function))
|
||||
sideEffects += ret[_function];
|
||||
for (YulString callee: _directCallGraph.functionCalls.at(_function))
|
||||
_recurse(callee, _recurse);
|
||||
}
|
||||
);
|
||||
};
|
||||
for (auto const& _v: call.second)
|
||||
_visit(_v, _visit);
|
||||
ret[funName] += sideEffects;
|
||||
}
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user