Skip to content

Commit 669f77f

Browse files
h-joocopybara-github
authored andcommitted
Refactor the "TraverseState" out to make it easier to review future CL for performance improvement. This is (almost) a no-op change.
PiperOrigin-RevId: 707050510
1 parent 4047709 commit 669f77f

File tree

1 file changed

+36
-25
lines changed

1 file changed

+36
-25
lines changed

pytype/typegraph/solver.cc

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@ struct RemoveResult {
3131
removed_goals(removed_goals), new_goals(new_goals) {}
3232
};
3333

34+
struct TraverseState {
35+
GoalSet goals_to_remove;
36+
GoalSet seen_goals;
37+
GoalSet removed_goals;
38+
GoalSet new_goals;
39+
TraverseState() {}
40+
TraverseState(GoalSet goals_to_remove, GoalSet seen_goals,
41+
GoalSet removed_goals, GoalSet new_goals)
42+
: goals_to_remove(goals_to_remove),
43+
seen_goals(seen_goals),
44+
removed_goals(removed_goals),
45+
new_goals(new_goals) {}
46+
};
47+
3448
// Remove all goals that can be fulfilled at the current CFG node.
3549
// Generates all possible sets of new goals obtained by replacing a goal that
3650
// originates at the current node with one of its source sets, iteratively,
@@ -39,51 +53,48 @@ struct RemoveResult {
3953
// avoiding bugs related to transmitting state information across calls.
4054
static std::vector<RemoveResult> remove_finished_goals(const CFGNode* pos,
4155
const GoalSet& goals) {
42-
GoalSet goals_to_remove;
56+
TraverseState state;
4357
// We can't use set_intersection here because pos->bindings() is a vector.
4458
for (const auto* goal : pos->bindings()) {
4559
if (goals.count(goal)) {
46-
goals_to_remove.insert(goal);
60+
state.goals_to_remove.insert(goal);
4761
}
4862
}
49-
GoalSet seen_goals;
50-
GoalSet removed_goals;
51-
GoalSet new_goals;
52-
std::set_difference(goals.begin(), goals.end(),
53-
goals_to_remove.begin(), goals_to_remove.end(),
54-
std::inserter(new_goals, new_goals.begin()),
63+
std::set_difference(goals.begin(), goals.end(), state.goals_to_remove.begin(),
64+
state.goals_to_remove.end(),
65+
std::inserter(state.new_goals, state.new_goals.begin()),
5566
pointer_less<Binding>());
56-
std::deque<std::tuple<GoalSet, GoalSet, GoalSet, GoalSet>> queue;
57-
queue.emplace_back(goals_to_remove, seen_goals, removed_goals, new_goals);
67+
std::deque<TraverseState> queue;
68+
queue.emplace_back(state);
5869
std::vector<RemoveResult> results;
5970
while (!queue.empty()) {
60-
std::tie(goals_to_remove, seen_goals, removed_goals, new_goals) =
61-
queue.front();
71+
state = std::move(queue.front());
6272
queue.pop_front();
63-
if (goals_to_remove.empty()) {
64-
results.push_back(RemoveResult(removed_goals, new_goals));
73+
if (state.goals_to_remove.empty()) {
74+
results.push_back(RemoveResult(state.removed_goals, state.new_goals));
6575
continue;
6676
}
67-
const auto* goal = *goals_to_remove.begin();
68-
goals_to_remove.erase(goals_to_remove.begin());
69-
if (seen_goals.count(goal)) {
77+
const auto* goal = *state.goals_to_remove.begin();
78+
state.goals_to_remove.erase(state.goals_to_remove.begin());
79+
if (state.seen_goals.count(goal)) {
7080
// Only process a goal once, to prevent infinite loops.
71-
queue.emplace_back(goals_to_remove, seen_goals, removed_goals, new_goals);
81+
queue.emplace_back(std::move(state));
7282
continue;
7383
}
74-
seen_goals.insert(goal);
84+
state.seen_goals.insert(goal);
7585
const auto* origin = goal->FindOrigin(pos);
7686
if (!origin) {
77-
new_goals.insert(goal);
78-
queue.emplace_back(goals_to_remove, seen_goals, removed_goals, new_goals);
87+
state.new_goals.insert(goal);
88+
queue.emplace_back(std::move(state));
7989
continue;
8090
}
81-
removed_goals.insert(goal);
91+
state.removed_goals.insert(goal);
8292
for (const auto& source_set : origin->source_sets) {
83-
GoalSet next_goals_to_remove(goals_to_remove);
93+
GoalSet next_goals_to_remove(state.goals_to_remove);
8494
next_goals_to_remove.insert(source_set.begin(), source_set.end());
85-
queue.emplace_back(std::move(next_goals_to_remove), seen_goals,
86-
removed_goals, new_goals);
95+
queue.push_back(TraverseState(std::move(next_goals_to_remove),
96+
state.seen_goals, state.removed_goals,
97+
state.new_goals));
8798
}
8899
}
89100
return results;

0 commit comments

Comments
 (0)