summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmListFileCache.cxx67
-rw-r--r--Source/cmListFileCache.h3
-rw-r--r--Source/cmState.cxx5
-rw-r--r--Source/cmState.h1
4 files changed, 39 insertions, 37 deletions
diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx
index d5d0184..f198ac3 100644
--- a/Source/cmListFileCache.cxx
+++ b/Source/cmListFileCache.cxx
@@ -400,13 +400,40 @@ bool cmListFileParser::AddArgument(cmListFileLexer_Token* token,
cmListFileBacktrace::cmListFileBacktrace(cmState::Snapshot snapshot,
cmCommandContext const& cc)
- : Context(cc)
- , Snapshot(snapshot)
+ : Snapshot(snapshot)
{
- if (this->Snapshot.IsValid())
+ if (!this->Snapshot.IsValid())
+ {
+ return;
+ }
+
+ // Record the entire call stack now so that the `Snapshot` we
+ // save for later refers to a long-lived scope. This avoids
+ // having to keep short-lived scopes around just to extract
+ // their backtrace information later.
+
+ cmListFileContext lfc =
+ cmListFileContext::FromCommandContext(
+ cc, this->Snapshot.GetExecutionListFile());
+ this->push_back(lfc);
+
+ cmState::Snapshot parent = this->Snapshot.GetCallStackParent();
+ while (parent.IsValid())
{
- this->Snapshot.Keep();
+ lfc.Name = this->Snapshot.GetEntryPointCommand();
+ lfc.Line = this->Snapshot.GetEntryPointLine();
+ lfc.FilePath = parent.GetExecutionListFile();
+ if (lfc.FilePath.empty())
+ {
+ break;
+ }
+ this->push_back(lfc);
+
+ this->Snapshot = parent;
+ parent = parent.GetCallStackParent();
}
+
+ this->Snapshot = this->Snapshot.GetCallStackBottom();
}
cmListFileBacktrace::~cmListFileBacktrace()
@@ -415,48 +442,30 @@ cmListFileBacktrace::~cmListFileBacktrace()
void cmListFileBacktrace::PrintTitle(std::ostream& out) const
{
- if (!this->Snapshot.IsValid())
+ if (this->empty())
{
return;
}
cmOutputConverter converter(this->Snapshot);
- cmListFileContext lfc =
- cmListFileContext::FromCommandContext(
- this->Context, this->Snapshot.GetExecutionListFile());
+ cmListFileContext lfc = this->front();
lfc.FilePath = converter.Convert(lfc.FilePath, cmOutputConverter::HOME);
out << (lfc.Line ? " at " : " in ") << lfc;
}
void cmListFileBacktrace::PrintCallStack(std::ostream& out) const
{
- if (!this->Snapshot.IsValid())
- {
- return;
- }
- cmState::Snapshot parent = this->Snapshot.GetCallStackParent();
- if (!parent.IsValid() || parent.GetExecutionListFile().empty())
+ if (this->size() <= 1)
{
return;
}
+ out << "Call Stack (most recent call first):\n";
cmOutputConverter converter(this->Snapshot);
- std::string commandName = this->Snapshot.GetEntryPointCommand();
- long commandLine = this->Snapshot.GetEntryPointLine();
-
- out << "Call Stack (most recent call first):\n";
- while(parent.IsValid())
+ for (const_iterator i = this->begin() + 1; i != this->end(); ++i)
{
- cmListFileContext lfc;
- lfc.Name = commandName;
- lfc.Line = commandLine;
-
- lfc.FilePath = converter.Convert(parent.GetExecutionListFile(),
- cmOutputConverter::HOME);
+ cmListFileContext lfc = *i;
+ lfc.FilePath = converter.Convert(lfc.FilePath, cmOutputConverter::HOME);
out << " " << lfc << "\n";
-
- commandName = parent.GetEntryPointCommand();
- commandLine = parent.GetEntryPointLine();
- parent = parent.GetCallStackParent();
}
}
diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h
index 4d3055f..d3cab22 100644
--- a/Source/cmListFileCache.h
+++ b/Source/cmListFileCache.h
@@ -87,7 +87,7 @@ struct cmListFileFunction: public cmCommandContext
std::vector<cmListFileArgument> Arguments;
};
-class cmListFileBacktrace
+class cmListFileBacktrace: private std::vector<cmListFileContext>
{
public:
cmListFileBacktrace(cmState::Snapshot snapshot = cmState::Snapshot(),
@@ -97,7 +97,6 @@ class cmListFileBacktrace
void PrintTitle(std::ostream& out) const;
void PrintCallStack(std::ostream& out) const;
private:
- cmCommandContext Context;
cmState::Snapshot Snapshot;
};
diff --git a/Source/cmState.cxx b/Source/cmState.cxx
index c48f9b1..bec5682 100644
--- a/Source/cmState.cxx
+++ b/Source/cmState.cxx
@@ -1098,11 +1098,6 @@ void cmState::Directory::SetCurrentBinary(std::string const& dir)
this->Snapshot_.SetDefinition("CMAKE_CURRENT_BINARY_DIR", loc.c_str());
}
-void cmState::Snapshot::Keep()
-{
- this->Position->Keep = true;
-}
-
void cmState::Snapshot::SetListFile(const std::string& listfile)
{
*this->Position->ExecutionListFile = listfile;
diff --git a/Source/cmState.h b/Source/cmState.h
index 0cce644..507d500 100644
--- a/Source/cmState.h
+++ b/Source/cmState.h
@@ -63,7 +63,6 @@ public:
std::vector<std::string> ClosureKeys() const;
bool RaiseScope(std::string const& var, const char* varDef);
- void Keep();
void SetListFile(std::string const& listfile);
std::string GetExecutionListFile() const;