From a01eb6b27be0e9a32378c56140d231ceda612368 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 22 Jan 2009 10:56:50 -0500 Subject: ENH: Create automatic policy push/pop helper This creates cmMakefile::PolicyPushPop to push and pop policy scope automatically. It also enforces balanced push/pop pairs inside the scope it handles. --- Source/cmMakefile.cxx | 29 +++++++++++++++++++++++++++++ Source/cmMakefile.h | 12 ++++++++++++ 2 files changed, 41 insertions(+) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index f9b40b1..b402a6d 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -3674,6 +3674,35 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id, return true; } +//---------------------------------------------------------------------------- +cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m): Makefile(m) +{ + this->Makefile->PushPolicy(); + this->PolicyDepth = this->Makefile->PolicyStack.size(); +} + +//---------------------------------------------------------------------------- +cmMakefile::PolicyPushPop::~PolicyPushPop() +{ + // Enforce matching PUSH/POP pairs. + if(this->Makefile->PolicyStack.size() < this->PolicyDepth) + { + this->Makefile->IssueMessage(cmake::FATAL_ERROR, + "cmake_policy POP without matching PUSH"); + return; + } + while(this->Makefile->PolicyStack.size() > this->PolicyDepth) + { + this->Makefile->IssueMessage(cmake::FATAL_ERROR, + "cmake_policy PUSH without matching POP"); + this->Makefile->PopPolicy(false); + } + + // Pop our scope. + this->Makefile->PopPolicy(); +} + +//---------------------------------------------------------------------------- bool cmMakefile::PushPolicy() { // Allocate a new stack entry. diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 4daec16..fb1e1e1 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -346,6 +346,18 @@ public: bool SetPolicyVersion(const char *version); //@} + /** Helper class to push and pop policies automatically. */ + class PolicyPushPop + { + public: + PolicyPushPop(cmMakefile* m); + ~PolicyPushPop(); + private: + cmMakefile* Makefile; + size_t PolicyDepth; + }; + friend class PolicyPushPop; + /** * Get the Policies Instance */ -- cgit v0.12