CreateFixedStubs();
// Allocate the number->string conversion cache
+ ASSERT(IsPowerOf2(kNumberStringCacheSize));
obj = AllocateFixedArray(kNumberStringCacheSize * 2);
if (obj->IsFailure()) return false;
set_number_string_cache(FixedArray::cast(obj));
}
-static inline int double_get_hash(double d) {
- DoubleRepresentation rep(d);
- return ((static_cast<int>(rep.bits) ^ static_cast<int>(rep.bits >> 32)) &
- (Heap::kNumberStringCacheSize - 1));
+static inline int NumberStringTruncateHash(int value) {
+ return (((value >> 16) ^ value)) & (Heap::kNumberStringCacheSize - 1);
}
-static inline int smi_get_hash(Smi* smi) {
- return (smi->value() & (Heap::kNumberStringCacheSize - 1));
+static inline int DoubleGetHash(double d) {
+ DoubleRepresentation rep(d);
+ int value = (static_cast<int>(rep.bits) ^ static_cast<int>(rep.bits >> 32));
+ return NumberStringTruncateHash(value);
}
+static inline int SmiGetHash(Smi* smi) {
+ return NumberStringTruncateHash(smi->value());
+}
+
Object* Heap::GetNumberStringCache(Object* number) {
int hash;
if (number->IsSmi()) {
- hash = smi_get_hash(Smi::cast(number));
+ hash = SmiGetHash(Smi::cast(number));
} else {
- hash = double_get_hash(number->Number());
+ hash = DoubleGetHash(number->Number());
}
Object* key = number_string_cache()->get(hash * 2);
if (key == number) {
void Heap::SetNumberStringCache(Object* number, String* string) {
int hash;
if (number->IsSmi()) {
- hash = smi_get_hash(Smi::cast(number));
+ hash = SmiGetHash(Smi::cast(number));
number_string_cache()->set(hash * 2, number, SKIP_WRITE_BARRIER);
} else {
- hash = double_get_hash(number->Number());
+ hash = DoubleGetHash(number->Number());
number_string_cache()->set(hash * 2, number);
}
number_string_cache()->set(hash * 2 + 1, string);
static void SetNumberStringCache(Object* number, String* str);
// Entries in the cache. Must be a power of 2.
- static const int kNumberStringCacheSize = 64;
+ static const int kNumberStringCacheSize = 16*KB;
// Adjusts the amount of registered external memory.
// Returns the adjusted value.
cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
j(above, gc_required, not_taken);
- // Update allocation top.
- UpdateAllocationTopHelper(result_end, scratch);
-
// Tag result if requested.
if ((flags & TAG_OBJECT) != 0) {
or_(Operand(result), Immediate(kHeapObjectTag));
}
+
+ // Update allocation top.
+ UpdateAllocationTopHelper(result_end, scratch);
}
cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
j(above, gc_required);
- // Update allocation top.
- UpdateAllocationTopHelper(result_end, scratch);
-
// Tag result if requested.
if ((flags & TAG_OBJECT) != 0) {
or_(Operand(result), Immediate(kHeapObjectTag));
}
+
+ // Update allocation top.
+ UpdateAllocationTopHelper(result_end, scratch);
+
}
cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
j(above, gc_required, not_taken);
- // Update allocation top.
- UpdateAllocationTopHelper(result_end, scratch);
-
// Tag result if requested.
if ((flags & TAG_OBJECT) != 0) {
or_(Operand(result), Immediate(kHeapObjectTag));
}
+
+ // Update allocation top.
+ UpdateAllocationTopHelper(result_end, scratch);
}