]> granicus.if.org Git - clang/commitdiff
Wrap bit mangling logic for DiagMappings in its own class so it doesn't leak
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 25 Jul 2010 21:40:48 +0000 (21:40 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 25 Jul 2010 21:40:48 +0000 (21:40 +0000)
into other code. Make it an array instead of a constant-length vector.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109384 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Diagnostic.h
lib/Basic/Diagnostic.cpp

index b09fd814b97c3a79a4c72ae43d05b37dad39d1e5..c67de985a023a2e877eccc422c63c1a5d1c6b5b2 100644 (file)
@@ -213,8 +213,24 @@ private:
   /// when the mapping was established as a user mapping.  If the high bit is
   /// clear, then the low bits are set to the default value, and should be
   /// mapped with -pedantic, -Werror, etc.
+  class DiagMappings {
+    unsigned char Values[diag::DIAG_UPPER_LIMIT/2];
+
+  public:
+    DiagMappings() {
+      memset(Values, 0, diag::DIAG_UPPER_LIMIT/2);
+    }
+
+    void setMapping(diag::kind Diag, unsigned Map) {
+      size_t Shift = (Diag & 1)*4;
+      Values[Diag/2] = (Values[Diag/2] & ~(15 << Shift)) | (Map << Shift);
+    }
+
+    diag::Mapping getMapping(diag::kind Diag) const {
+      return (diag::Mapping)((Values[Diag/2] >> (Diag & 1)*4) & 15);
+    }
+  };
 
-  typedef std::vector<unsigned char> DiagMappings;
   mutable std::vector<DiagMappings> DiagMappingsStack;
 
   /// ErrorOccurred / FatalErrorOccurred - This is set to true when an error or
@@ -539,17 +555,13 @@ private:
   /// specified builtin diagnostic.  This returns the high bit encoding, or zero
   /// if the field is completely uninitialized.
   diag::Mapping getDiagnosticMappingInfo(diag::kind Diag) const {
-    const DiagMappings &currentMappings = DiagMappingsStack.back();
-    return (diag::Mapping)((currentMappings[Diag/2] >> (Diag & 1)*4) & 15);
+    return DiagMappingsStack.back().getMapping(Diag);
   }
 
   void setDiagnosticMappingInternal(unsigned DiagId, unsigned Map,
                                     bool isUser) const {
     if (isUser) Map |= 8;  // Set the high bit for user mappings.
-    unsigned char &Slot = DiagMappingsStack.back()[DiagId/2];
-    unsigned Shift = (DiagId & 1)*4;
-    Slot &= ~(15 << Shift);
-    Slot |= Map << Shift;
+    DiagMappingsStack.back().setMapping((diag::kind)DiagId, Map);
   }
 
   /// getDiagnosticLevel - This is an internal implementation helper used when
index 68548da0cb18b34fd03bd797ac174676112af08b..f956f1aec85fd1ac7db712401fb536909c58a659 100644 (file)
@@ -334,11 +334,8 @@ void Diagnostic::Reset() {
   DelayedDiagID = 0;
 
   // Set all mappings to 'unset'.
-  while (!DiagMappingsStack.empty())
-    DiagMappingsStack.pop_back();
-  
-  DiagMappings BlankDiags(diag::DIAG_UPPER_LIMIT/2, 0);
-  DiagMappingsStack.push_back(BlankDiags);
+  DiagMappingsStack.clear();
+  DiagMappingsStack.push_back(DiagMappings());
 }
 
 /// getDescription - Given a diagnostic ID, return a description of the