assert (new_c_mark_list);
memcpy (new_c_mark_list, c_mark_list, c_mark_list_length*sizeof(uint8_t*));
c_mark_list_length = c_mark_list_length*2;
- delete c_mark_list;
+ delete[] c_mark_list;
c_mark_list = new_c_mark_list;
}
}
UINT32 STUB_COLLIDE_MONO_PCT = 0;
#endif // STUB_LOGGING
+FastTable::NumCallStubs_t FastTable::NumCallStubs;
+
FastTable* BucketTable::dead = NULL; //linked list of the abandoned buckets
DispatchCache *g_resolveCache = NULL; //cache of dispatch stubs for in line lookup by resolve stubs.
while (list)
{
size_t next = list->contents[CALL_STUB_DEAD_LINK];
- delete [] (size_t*)list;
+ delete list;
list = (FastTable*) next;
}
}
while (size < numberOfEntries) {size = size<<1;}
// if (size == CALL_STUB_MIN_ENTRIES)
// size += 3;
- size_t* bucket = new size_t[(sizeof(FastTable)/sizeof(size_t))+size+CALL_STUB_FIRST_INDEX];
- FastTable* table = new (bucket) FastTable();
+ FastTable* table = new (NumCallStubs, size) FastTable();
table->InitializeContents(size);
return table;
}
//we have an unused cell to use as a temp at bucket[CALL_STUB_DEAD_LINK==2],
//and the table starts at bucket[CALL_STUB_FIRST_INDEX==3],
size_t contents[0];
+
+ void* operator new(size_t) = delete;
+
+ static struct NumCallStubs_t {} NumCallStubs;
+
+ void* operator new(size_t baseSize, NumCallStubs_t, size_t numCallStubs)
+ {
+ return ::operator new(baseSize + (numCallStubs + CALL_STUB_FIRST_INDEX) * sizeof(size_t));
+ }
};
#ifdef _MSC_VER
#pragma warning(pop)