diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-09-07 19:22:41 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-09-07 21:23:29 -0700 |
commit | 0bca54444a5bb869ddebaadc65cd0bf381bb1e81 (patch) | |
tree | 9c4ec90a663e0e17e9922d69bc58479bcd1538bd /deps/v8/src/heap.cc | |
parent | 526c54c9790cd8edff259686785d7b844fd29005 (diff) | |
download | node-0bca54444a5bb869ddebaadc65cd0bf381bb1e81.tar.gz |
Upgrade V8 to 3.6.1
Diffstat (limited to 'deps/v8/src/heap.cc')
-rw-r--r-- | deps/v8/src/heap.cc | 84 |
1 files changed, 80 insertions, 4 deletions
diff --git a/deps/v8/src/heap.cc b/deps/v8/src/heap.cc index 90d0e11ed..a480e9e33 100644 --- a/deps/v8/src/heap.cc +++ b/deps/v8/src/heap.cc @@ -81,14 +81,14 @@ Heap::Heap() reserved_semispace_size_(16*MB), max_semispace_size_(16*MB), initial_semispace_size_(1*MB), - max_old_generation_size_(1*GB), + max_old_generation_size_(1400*MB), max_executable_size_(256*MB), code_range_size_(512*MB), #else reserved_semispace_size_(8*MB), max_semispace_size_(8*MB), initial_semispace_size_(512*KB), - max_old_generation_size_(512*MB), + max_old_generation_size_(700*MB), max_executable_size_(128*MB), code_range_size_(0), #endif @@ -842,6 +842,7 @@ void Heap::MarkCompactPrologue(bool is_compacting) { isolate_->keyed_lookup_cache()->Clear(); isolate_->context_slot_cache()->Clear(); isolate_->descriptor_lookup_cache()->Clear(); + StringSplitCache::Clear(string_split_cache()); isolate_->compilation_cache()->MarkCompactPrologue(); @@ -2223,6 +2224,13 @@ bool Heap::CreateInitialObjects() { } set_single_character_string_cache(FixedArray::cast(obj)); + // Allocate cache for string split. + { MaybeObject* maybe_obj = + AllocateFixedArray(StringSplitCache::kStringSplitCacheSize, TENURED); + if (!maybe_obj->ToObject(&obj)) return false; + } + set_string_split_cache(FixedArray::cast(obj)); + // Allocate cache for external strings pointing to native source code. { MaybeObject* maybe_obj = AllocateFixedArray(Natives::GetBuiltinsCount()); if (!maybe_obj->ToObject(&obj)) return false; @@ -2248,6 +2256,75 @@ bool Heap::CreateInitialObjects() { } +Object* StringSplitCache::Lookup( + FixedArray* cache, String* string, String* pattern) { + if (!string->IsSymbol() || !pattern->IsSymbol()) return Smi::FromInt(0); + uintptr_t hash = string->Hash(); + uintptr_t index = ((hash & (kStringSplitCacheSize - 1)) & + ~(kArrayEntriesPerCacheEntry - 1)); + if (cache->get(index + kStringOffset) == string && + cache->get(index + kPatternOffset) == pattern) { + return cache->get(index + kArrayOffset); + } + index = ((index + kArrayEntriesPerCacheEntry) & (kStringSplitCacheSize - 1)); + if (cache->get(index + kStringOffset) == string && + cache->get(index + kPatternOffset) == pattern) { + return cache->get(index + kArrayOffset); + } + return Smi::FromInt(0); +} + + +void StringSplitCache::Enter(Heap* heap, + FixedArray* cache, + String* string, + String* pattern, + FixedArray* array) { + if (!string->IsSymbol() || !pattern->IsSymbol()) return; + uintptr_t hash = string->Hash(); + array->set_map(heap->fixed_cow_array_map()); + uintptr_t index = ((hash & (kStringSplitCacheSize - 1)) & + ~(kArrayEntriesPerCacheEntry - 1)); + if (cache->get(index + kStringOffset) == Smi::FromInt(0)) { + cache->set(index + kStringOffset, string); + cache->set(index + kPatternOffset, pattern); + cache->set(index + kArrayOffset, array); + return; + } + uintptr_t index2 = + ((index + kArrayEntriesPerCacheEntry) & (kStringSplitCacheSize - 1)); + if (cache->get(index2 + kStringOffset) == Smi::FromInt(0)) { + cache->set(index2 + kStringOffset, string); + cache->set(index2 + kPatternOffset, pattern); + cache->set(index2 + kArrayOffset, array); + return; + } + cache->set(index2 + kStringOffset, Smi::FromInt(0)); + cache->set(index2 + kPatternOffset, Smi::FromInt(0)); + cache->set(index2 + kArrayOffset, Smi::FromInt(0)); + cache->set(index + kStringOffset, string); + cache->set(index + kPatternOffset, pattern); + cache->set(index + kArrayOffset, array); + if (array->length() < 100) { // Limit how many new symbols we want to make. + for (int i = 0; i < array->length(); i++) { + String* str = String::cast(array->get(i)); + Object* symbol; + MaybeObject* maybe_symbol = heap->LookupSymbol(str); + if (maybe_symbol->ToObject(&symbol)) { + array->set(i, symbol); + } + } + } +} + + +void StringSplitCache::Clear(FixedArray* cache) { + for (int i = 0; i < kStringSplitCacheSize; i++) { + cache->set(i, Smi::FromInt(0)); + } +} + + MaybeObject* Heap::InitializeNumberStringCache() { // Compute the size of the number string cache based on the max heap size. // max_semispace_size_ == 512 KB => number_string_cache_size = 32. @@ -4085,10 +4162,9 @@ MaybeObject* Heap::AllocateBlockContext(JSFunction* function, SerializedScopeInfo* scope_info) { Object* result; { MaybeObject* maybe_result = - AllocateFixedArray(scope_info->NumberOfContextSlots()); + AllocateFixedArrayWithHoles(scope_info->NumberOfContextSlots()); if (!maybe_result->ToObject(&result)) return maybe_result; } - // TODO(keuchel): properly initialize context slots. Context* context = reinterpret_cast<Context*>(result); context->set_map(block_context_map()); context->set_closure(function); |