Browse Source

BUG: Fix problem with uninitialized variables

Andy Cedilnik 22 years ago
parent
commit
32bfe66b5d
3 changed files with 26 additions and 5 deletions
  1. 20 4
      Source/cmCacheManager.cxx
  2. 4 0
      Source/cmCacheManager.h
  3. 2 1
      Source/cmMakefile.cxx

+ 20 - 4
Source/cmCacheManager.cxx

@@ -247,6 +247,7 @@ bool cmCacheManager::LoadCache(const char* path,
             }
           else
             {
+            e.m_Initialized = true;
             m_Cache[entryKey] = e;
             }
           }
@@ -363,7 +364,7 @@ bool cmCacheManager::SaveCache(const char* path)
     {
     const CacheEntry& ce = (*i).second; 
     CacheEntryType t = ce.m_Type;
-    if(t == cmCacheManager::UNINITIALIZED)
+    if(t == cmCacheManager::UNINITIALIZED || !ce.m_Initialized)
       {
       /*
         // This should be added in, but is not for now.
@@ -423,6 +424,11 @@ bool cmCacheManager::SaveCache(const char* path)
   for( cmCacheManager::CacheIterator i = this->NewIterator();
        !i.IsAtEnd(); i.Next())
     {
+    if ( !i.Initialized() )
+      {
+      continue;
+      }
+
     CacheEntryType t = i.GetType();
     bool advanced = i.PropertyExists("ADVANCED");
     if ( advanced )
@@ -581,7 +587,8 @@ cmCacheManager::CacheIterator cmCacheManager::GetCacheIterator(const char *key)
 const char* cmCacheManager::GetCacheValue(const char* key) const
 {
   CacheEntryMap::const_iterator i = m_Cache.find(key);
-  if(i != m_Cache.end() && i->second.m_Type != cmCacheManager::UNINITIALIZED)
+  if(i != m_Cache.end() && i->second.m_Type != cmCacheManager::UNINITIALIZED &&
+    i->second.m_Initialized)
     {
     return i->second.m_Value.c_str();
     }
@@ -616,10 +623,11 @@ void cmCacheManager::AddCacheEntry(const char* key,
   if ( value )
     {
     e.m_Value = value;
+    e.m_Initialized = true;
     }
   else 
     {
-    e.m_Value = "(none)";
+    e.m_Value = "";
     }
   e.m_Type = type;
   // make sure we only use unix style paths
@@ -682,7 +690,15 @@ void cmCacheManager::CacheIterator::SetValue(const char* value)
     return;
     }
   CacheEntry* entry = &this->GetEntry();
-  entry->m_Value = value;
+  if ( value )
+    {
+    entry->m_Value = value;
+    entry->m_Initialized = true;
+    }
+  else
+    {
+    entry->m_Value = "";
+    }
 }
 
 const char* cmCacheManager::CacheIterator::GetProperty(const char* property) const

+ 4 - 0
Source/cmCacheManager.h

@@ -39,6 +39,9 @@ private:
     std::string m_Value;
     CacheEntryType m_Type;
     std::map<cmStdString,cmStdString> m_Properties;
+    bool m_Initialized;
+    CacheEntry() : m_Value(""), m_Type(UNINITIALIZED), m_Initialized(false)
+      {}
   };
 
 public:
@@ -59,6 +62,7 @@ public:
     const char* GetValue() const { return this->GetEntry().m_Value.c_str(); }
     void SetValue(const char*);
     CacheEntryType GetType() const { return this->GetEntry().m_Type; }
+    bool Initialized() { return this->GetEntry().m_Initialized; }
     cmCacheManager &m_Container;
     std::map<cmStdString, CacheEntry>::iterator m_Position;
     CacheIterator(cmCacheManager &cm) : m_Container(cm) {

+ 2 - 1
Source/cmMakefile.cxx

@@ -842,7 +842,8 @@ void cmMakefile::AddCacheDefinition(const char* name, const char* value,
   const char* val = value;
   cmCacheManager::CacheIterator it = 
     this->GetCacheManager()->GetCacheIterator(name);
-  if(!it.IsAtEnd() && (it.GetType() == cmCacheManager::UNINITIALIZED))
+  if(!it.IsAtEnd() && (it.GetType() == cmCacheManager::UNINITIALIZED) &&
+    it.Initialized())
     {
     val = it.GetValue();
     }