summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-04-01 15:00:27 (GMT)
committerNico Weber <nicolasweber@gmx.de>2015-04-01 15:00:27 (GMT)
commit90621fd177660f94aa27ce5963506f814f859da2 (patch)
tree6c9aac067cea4e6dbc7c49da6f9839de4bf99c76
parent813205b43c63239c7e37f9e296d345d55b12d565 (diff)
downloadNinja-90621fd177660f94aa27ce5963506f814f859da2.zip
Ninja-90621fd177660f94aa27ce5963506f814f859da2.tar.gz
Ninja-90621fd177660f94aa27ce5963506f814f859da2.tar.bz2
Cleanup: Don't search stack for cycle elements twice.
The common case is that there is no cycle. In that case, CheckDependencyCycle() searched the stack for a dupe from the back, wouldn't find one, and return false. If there was a cycle, it would then search again from the front (probably because the push_back() that used to be here would invalidate the ri iterator). Since the push_back() is gone, just search from the front once. No intended behavior change.
-rw-r--r--src/build.cc6
1 files changed, 2 insertions, 4 deletions
diff --git a/src/build.cc b/src/build.cc
index c51ce53..9f40d2d 100644
--- a/src/build.cc
+++ b/src/build.cc
@@ -318,12 +318,10 @@ bool Plan::AddSubTarget(Node* node, vector<Node*>* stack, string* err) {
bool Plan::CheckDependencyCycle(Node* node, const vector<Node*>& stack,
string* err) {
- vector<Node*>::const_reverse_iterator ri =
- find(stack.rbegin(), stack.rend(), node);
- if (ri == stack.rend())
+ vector<Node*>::const_iterator start = find(stack.begin(), stack.end(), node);
+ if (start == stack.end())
return false;
- vector<Node*>::const_iterator start = find(stack.begin(), stack.end(), node);
*err = "dependency cycle: ";
for (vector<Node*>::const_iterator i = start; i != stack.end(); ++i) {
err->append((*i)->path());