Browse Source

cmStateDirectory::GetProperty: return cmProp

Vitaly Stakhovsky 5 years ago
parent
commit
a4255ecf81
5 changed files with 34 additions and 27 deletions
  1. 2 2
      Source/cmLocalGenerator.cxx
  2. 4 2
      Source/cmMakefile.cxx
  3. 20 20
      Source/cmStateDirectory.cxx
  4. 4 2
      Source/cmStateDirectory.h
  5. 4 1
      Source/cmTarget.cxx

+ 2 - 2
Source/cmLocalGenerator.cxx

@@ -2965,8 +2965,8 @@ const char* cmLocalGenerator::GetFeature(const std::string& feature,
   }
   cmStateSnapshot snp = this->StateSnapshot;
   while (snp.IsValid()) {
-    if (const char* value = snp.GetDirectory().GetProperty(featureName)) {
-      return value;
+    if (cmProp value = snp.GetDirectory().GetProperty(featureName)) {
+      return value->c_str();
     }
     snp = snp.GetBuildsystemDirectoryParent();
   }

+ 4 - 2
Source/cmMakefile.cxx

@@ -4102,12 +4102,14 @@ const char* cmMakefile::GetProperty(const std::string& prop) const
     return output.c_str();
   }
 
-  return this->StateSnapshot.GetDirectory().GetProperty(prop);
+  cmProp retVal = this->StateSnapshot.GetDirectory().GetProperty(prop);
+  return retVal ? retVal->c_str() : nullptr;
 }
 
 const char* cmMakefile::GetProperty(const std::string& prop, bool chain) const
 {
-  return this->StateSnapshot.GetDirectory().GetProperty(prop, chain);
+  cmProp retVal = this->StateSnapshot.GetDirectory().GetProperty(prop, chain);
+  return retVal ? retVal->c_str() : nullptr;
 }
 
 bool cmMakefile::GetPropertyAsBool(const std::string& prop) const

+ 20 - 20
Source/cmStateDirectory.cxx

@@ -548,32 +548,31 @@ void cmStateDirectory::AppendProperty(const std::string& prop,
   this->DirectoryState->Properties.AppendProperty(prop, value, asString);
 }
 
-const char* cmStateDirectory::GetProperty(const std::string& prop) const
+cmProp cmStateDirectory::GetProperty(const std::string& prop) const
 {
   const bool chain =
     this->Snapshot_.State->IsPropertyChained(prop, cmProperty::DIRECTORY);
   return this->GetProperty(prop, chain);
 }
 
-const char* cmStateDirectory::GetProperty(const std::string& prop,
-                                          bool chain) const
+cmProp cmStateDirectory::GetProperty(const std::string& prop, bool chain) const
 {
   static std::string output;
   output.clear();
   if (prop == "PARENT_DIRECTORY") {
     cmStateSnapshot parent = this->Snapshot_.GetBuildsystemDirectoryParent();
     if (parent.IsValid()) {
-      return parent.GetDirectory().GetCurrentSource().c_str();
+      return &parent.GetDirectory().GetCurrentSource();
     }
-    return "";
+    return &output;
   }
   if (prop == kBINARY_DIR) {
     output = this->GetCurrentBinary();
-    return output.c_str();
+    return &output;
   }
   if (prop == kSOURCE_DIR) {
     output = this->GetCurrentSource();
-    return output.c_str();
+    return &output;
   }
   if (prop == kSUBDIRECTORIES) {
     std::vector<std::string> child_dirs;
@@ -584,11 +583,11 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
       child_dirs.push_back(ci.GetDirectory().GetCurrentSource());
     }
     output = cmJoin(child_dirs, ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == kBUILDSYSTEM_TARGETS) {
     output = cmJoin(this->DirectoryState->NormalTargetNames, ";");
-    return output.c_str();
+    return &output;
   }
 
   if (prop == "LISTFILE_STACK") {
@@ -600,38 +599,38 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
     }
     std::reverse(listFiles.begin(), listFiles.end());
     output = cmJoin(listFiles, ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "CACHE_VARIABLES") {
     output = cmJoin(this->Snapshot_.State->GetCacheEntryKeys(), ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "VARIABLES") {
     std::vector<std::string> res = this->Snapshot_.ClosureKeys();
     cm::append(res, this->Snapshot_.State->GetCacheEntryKeys());
     std::sort(res.begin(), res.end());
     output = cmJoin(res, ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "INCLUDE_DIRECTORIES") {
     output = cmJoin(this->GetIncludeDirectoriesEntries(), ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "COMPILE_OPTIONS") {
     output = cmJoin(this->GetCompileOptionsEntries(), ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "COMPILE_DEFINITIONS") {
     output = cmJoin(this->GetCompileDefinitionsEntries(), ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "LINK_OPTIONS") {
     output = cmJoin(this->GetLinkOptionsEntries(), ";");
-    return output.c_str();
+    return &output;
   }
   if (prop == "LINK_DIRECTORIES") {
     output = cmJoin(this->GetLinkDirectoriesEntries(), ";");
-    return output.c_str();
+    return &output;
   }
 
   cmProp retVal = this->DirectoryState->Properties.GetPropertyValue(prop);
@@ -641,15 +640,16 @@ const char* cmStateDirectory::GetProperty(const std::string& prop,
     if (parentSnapshot.IsValid()) {
       return parentSnapshot.GetDirectory().GetProperty(prop, chain);
     }
-    retVal = this->Snapshot_.State->GetGlobalProperty(prop);
+    return this->Snapshot_.State->GetGlobalProperty(prop);
   }
 
-  return retVal ? retVal->c_str() : nullptr;
+  return retVal;
 }
 
 bool cmStateDirectory::GetPropertyAsBool(const std::string& prop) const
 {
-  return cmIsOn(this->GetProperty(prop));
+  cmProp p = this->GetProperty(prop);
+  return p && cmIsOn(*p);
 }
 
 std::vector<std::string> cmStateDirectory::GetPropertyKeys() const

+ 4 - 2
Source/cmStateDirectory.h

@@ -16,6 +16,8 @@
 #include "cmStateSnapshot.h"
 #include "cmStringAlgorithms.h"
 
+using cmProp = const std::string*;
+
 class cmStateDirectory
 {
   cmStateDirectory(
@@ -86,8 +88,8 @@ public:
                    cmListFileBacktrace const& lfbt);
   void AppendProperty(const std::string& prop, const std::string& value,
                       bool asString, cmListFileBacktrace const& lfbt);
-  const char* GetProperty(const std::string& prop) const;
-  const char* GetProperty(const std::string& prop, bool chain) const;
+  cmProp GetProperty(const std::string& prop) const;
+  cmProp GetProperty(const std::string& prop, bool chain) const;
   bool GetPropertyAsBool(const std::string& prop) const;
   std::vector<std::string> GetPropertyKeys() const;
 

+ 4 - 1
Source/cmTarget.cxx

@@ -1779,8 +1779,11 @@ const char* cmTarget::GetProperty(const std::string& prop) const
     const bool chain =
       impl->Makefile->GetState()->IsPropertyChained(prop, cmProperty::TARGET);
     if (chain) {
-      return impl->Makefile->GetStateSnapshot().GetDirectory().GetProperty(
+      retVal = impl->Makefile->GetStateSnapshot().GetDirectory().GetProperty(
         prop, chain);
+      if (retVal) {
+        return retVal->c_str();
+      }
     }
     return nullptr;
   }