using namespace llvm;
StringMapImpl::StringMapImpl(unsigned InitSize, unsigned itemSize) {
+ ItemSize = itemSize;
+
+ // If a size is specified, initialize the table with that many buckets.
+ if (InitSize) {
+ init(InitSize);
+ return;
+ }
+
+ // Otherwise, initialize it with zero buckets to avoid the allocation.
+ TheTable = 0;
+ NumBuckets = 0;
+ NumItems = 0;
+ NumTombstones = 0;
+}
+
+void StringMapImpl::init(unsigned InitSize) {
assert((InitSize & (InitSize-1)) == 0 &&
"Init Size must be a power of 2 or zero!");
NumBuckets = InitSize ? InitSize : 16;
- ItemSize = itemSize;
NumItems = 0;
NumTombstones = 0;
- TheTable = new ItemBucket[NumBuckets+1]();
- memset(TheTable, 0, NumBuckets*sizeof(ItemBucket));
+ TheTable = (ItemBucket*)calloc(NumBuckets+1, sizeof(ItemBucket));
// Allocate one extra bucket, set it to look filled so the iterators stop at
// end.
/// case, the FullHashValue field of the bucket will be set to the hash value
/// of the string.
unsigned StringMapImpl::LookupBucketFor(const char *NameStart,
- const char *NameEnd) {
+ const char *NameEnd) {
unsigned HTSize = NumBuckets;
+ if (HTSize == 0) { // Hash table unallocated so far?
+ init(16);
+ HTSize = NumBuckets;
+ }
unsigned FullHashValue = HashString(NameStart, NameEnd);
unsigned BucketNo = FullHashValue & (HTSize-1);
/// This does not modify the map.
int StringMapImpl::FindKey(const char *KeyStart, const char *KeyEnd) const {
unsigned HTSize = NumBuckets;
+ if (HTSize == 0) return -1; // Really empty table?
unsigned FullHashValue = HashString(KeyStart, KeyEnd);
unsigned BucketNo = FullHashValue & (HTSize-1);
unsigned NewSize = NumBuckets*2;
// Allocate one extra bucket which will always be non-empty. This allows the
// iterators to stop at end.
- ItemBucket *NewTableArray = new ItemBucket[NewSize+1]();
- memset(NewTableArray, 0, NewSize*sizeof(ItemBucket));
+ ItemBucket *NewTableArray =(ItemBucket*)calloc(NewSize+1, sizeof(ItemBucket));
NewTableArray[NewSize].Item = (StringMapEntryBase*)2;
// Rehash all the items into their new buckets. Luckily :) we already have
}
}
- delete[] TheTable;
+ free(TheTable);
TheTable = NewTableArray;
NumBuckets = NewSize;