]> granicus.if.org Git - clang/commitdiff
Reapply r66316, it got accidentally reverted in r66317.
authorDaniel Dunbar <daniel@zuster.org>
Mon, 9 Mar 2009 23:43:07 +0000 (23:43 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 9 Mar 2009 23:43:07 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66506 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/IdentifierTable.h

index 7630811f21de909aa0720dd59e848668b1f599fc..df0200f1e70faad5aff756e945cc2b116bd9a338 100644 (file)
@@ -267,24 +267,27 @@ public:
       HashTable.GetOrCreateValue(NameStart, NameEnd);
     
     IdentifierInfo *II = Entry.getValue();
+    if (II) return *II;
     
-    if (!II) {
-      while (1) {
-        if (ExternalLookup) {
-          II = ExternalLookup->get(NameStart, NameEnd);          
-          if (II) break;
-        }
-        
-        void *Mem = getAllocator().Allocate<IdentifierInfo>();
-        II = new (Mem) IdentifierInfo();
-        break;
+    // No entry; if we have an external lookup, look there first.
+    if (ExternalLookup) {
+      II = ExternalLookup->get(NameStart, NameEnd);
+      if (II) {
+        // Cache in the StringMap for subsequent lookups.
+        Entry.setValue(II);
+        return *II;
       }
-
-      Entry.setValue(II);
-      II->Entry = &Entry;
     }
 
-    assert(II->Entry != 0);
+    // Lookups failed, make a new IdentifierInfo.
+    void *Mem = getAllocator().Allocate<IdentifierInfo>();
+    II = new (Mem) IdentifierInfo();
+    Entry.setValue(II);
+
+    // Make sure getName() knows how to find the IdentifierInfo
+    // contents.
+    II->Entry = &Entry;
+
     return *II;
   }