 Chromium Code Reviews
 Chromium Code Reviews Issue 6759030:
  Microoptimizations to the way we get the current heap.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
    
  
    Issue 6759030:
  Microoptimizations to the way we get the current heap.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/| Index: src/objects.cc | 
| =================================================================== | 
| --- src/objects.cc (revision 7433) | 
| +++ src/objects.cc (working copy) | 
| @@ -113,39 +113,47 @@ | 
| if (IsSmi()) { | 
| return Isolate::Current()->heap()->ToBoolean(Smi::cast(this)->value() != 0); | 
| } | 
| - if (IsUndefined() || IsNull()) { | 
| - return HeapObject::cast(this)->GetHeap()->false_value(); | 
| + HeapObject* heap_this = HeapObject::cast(this); | 
| 
Vyacheslav Egorov (Chromium)
2011/03/30 15:57:33
heap_this is confusing name.
 | 
| + if (heap_this->IsUndefined() || heap_this->IsNull()) { | 
| + return heap_this->GetHeap()->false_value(); | 
| } | 
| // Undetectable object is false | 
| - if (IsUndetectableObject()) { | 
| - return HeapObject::cast(this)->GetHeap()->false_value(); | 
| + if (heap_this->IsUndetectableObject()) { | 
| + return heap_this->GetHeap()->false_value(); | 
| } | 
| - if (IsString()) { | 
| - return HeapObject::cast(this)->GetHeap()->ToBoolean( | 
| + if (heap_this->IsString()) { | 
| + return heap_this->GetHeap()->ToBoolean( | 
| String::cast(this)->length() != 0); | 
| } | 
| - if (IsHeapNumber()) { | 
| + if (heap_this->IsHeapNumber()) { | 
| return HeapNumber::cast(this)->HeapNumberToBoolean(); | 
| } | 
| - return Isolate::Current()->heap()->true_value(); | 
| + return heap_this->GetHeap()->true_value(); | 
| } | 
| void Object::Lookup(String* name, LookupResult* result) { | 
| - if (IsJSObject()) return JSObject::cast(this)->Lookup(name, result); | 
| Object* holder = NULL; | 
| - if (IsString()) { | 
| - Heap* heap = HeapObject::cast(this)->GetHeap(); | 
| - Context* global_context = heap->isolate()->context()->global_context(); | 
| - holder = global_context->string_function()->instance_prototype(); | 
| - } else if (IsNumber()) { | 
| + if (IsSmi()) { | 
| Heap* heap = Isolate::Current()->heap(); | 
| Context* global_context = heap->isolate()->context()->global_context(); | 
| holder = global_context->number_function()->instance_prototype(); | 
| - } else if (IsBoolean()) { | 
| - Heap* heap = HeapObject::cast(this)->GetHeap(); | 
| - Context* global_context = heap->isolate()->context()->global_context(); | 
| - holder = global_context->boolean_function()->instance_prototype(); | 
| + } else { | 
| + HeapObject* heap_this = HeapObject::cast(this); | 
| + if (heap_this->IsJSObject()) { | 
| + return JSObject::cast(this)->Lookup(name, result); | 
| + } | 
| + Heap* heap = heap_this->GetHeap(); | 
| + if (heap_this->IsString()) { | 
| + Context* global_context = heap->isolate()->context()->global_context(); | 
| + holder = global_context->string_function()->instance_prototype(); | 
| + } else if (heap_this->IsHeapNumber()) { | 
| + Context* global_context = heap->isolate()->context()->global_context(); | 
| + holder = global_context->number_function()->instance_prototype(); | 
| + } else if (heap_this->IsBoolean()) { | 
| + Context* global_context = heap->isolate()->context()->global_context(); | 
| + holder = global_context->boolean_function()->instance_prototype(); | 
| + } | 
| } | 
| ASSERT(holder != NULL); // Cannot handle null or undefined. | 
| JSObject::cast(holder)->Lookup(name, result); | 
| @@ -247,7 +255,6 @@ | 
| LookupResult* result, | 
| String* name, | 
| PropertyAttributes* attributes) { | 
| - Heap* heap = name->GetHeap(); | 
| if (result->IsProperty()) { | 
| switch (result->type()) { | 
| case CALLBACKS: { | 
| @@ -299,6 +306,7 @@ | 
| // No accessible property found. | 
| *attributes = ABSENT; | 
| + Heap* heap = name->GetHeap(); | 
| heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_GET); | 
| return heap->undefined_value(); | 
| } | 
| @@ -309,7 +317,6 @@ | 
| LookupResult* result, | 
| String* name, | 
| bool continue_search) { | 
| - Heap* heap = name->GetHeap(); | 
| if (result->IsProperty()) { | 
| switch (result->type()) { | 
| case CALLBACKS: { | 
| @@ -363,7 +370,7 @@ | 
| } | 
| } | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + GetHeap()->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| return ABSENT; | 
| } | 
| @@ -397,11 +404,11 @@ | 
| Object* value, | 
| PropertyDetails details) { | 
| ASSERT(!HasFastProperties()); | 
| - Heap* heap = name->GetHeap(); | 
| int entry = property_dictionary()->FindEntry(name); | 
| if (entry == StringDictionary::kNotFound) { | 
| Object* store_value = value; | 
| if (IsGlobalObject()) { | 
| + Heap* heap = name->GetHeap(); | 
| MaybeObject* maybe_store_value = | 
| heap->AllocateJSGlobalPropertyCell(value); | 
| if (!maybe_store_value->ToObject(&store_value)) return maybe_store_value; | 
| @@ -433,7 +440,6 @@ | 
| MaybeObject* JSObject::DeleteNormalizedProperty(String* name, DeleteMode mode) { | 
| ASSERT(!HasFastProperties()); | 
| - Heap* heap = GetHeap(); | 
| StringDictionary* dictionary = property_dictionary(); | 
| int entry = dictionary->FindEntry(name); | 
| if (entry != StringDictionary::kNotFound) { | 
| @@ -441,7 +447,7 @@ | 
| if (IsGlobalObject()) { | 
| PropertyDetails details = dictionary->DetailsAt(entry); | 
| if (details.IsDontDelete()) { | 
| - if (mode != FORCE_DELETION) return heap->false_value(); | 
| + if (mode != FORCE_DELETION) return GetHeap()->false_value(); | 
| // When forced to delete global properties, we have to make a | 
| // map change to invalidate any ICs that think they can load | 
| // from the DontDelete cell without checking if it contains | 
| @@ -454,13 +460,13 @@ | 
| } | 
| JSGlobalPropertyCell* cell = | 
| JSGlobalPropertyCell::cast(dictionary->ValueAt(entry)); | 
| - cell->set_value(heap->the_hole_value()); | 
| + cell->set_value(cell->heap()->the_hole_value()); | 
| dictionary->DetailsAtPut(entry, details.AsDeleted()); | 
| } else { | 
| return dictionary->DeleteProperty(entry, mode); | 
| } | 
| } | 
| - return heap->true_value(); | 
| + return GetHeap()->true_value(); | 
| } | 
| @@ -550,22 +556,31 @@ | 
| MaybeObject* Object::GetElementWithReceiver(Object* receiver, uint32_t index) { | 
| - if (IsJSObject()) { | 
| - return JSObject::cast(this)->GetElementWithReceiver(receiver, index); | 
| - } | 
| - | 
| Object* holder = NULL; | 
| - Context* global_context = Isolate::Current()->context()->global_context(); | 
| - if (IsString()) { | 
| - holder = global_context->string_function()->instance_prototype(); | 
| - } else if (IsNumber()) { | 
| + if (IsSmi()) { | 
| + Context* global_context = Isolate::Current()->context()->global_context(); | 
| holder = global_context->number_function()->instance_prototype(); | 
| - } else if (IsBoolean()) { | 
| - holder = global_context->boolean_function()->instance_prototype(); | 
| } else { | 
| - // Undefined and null have no indexed properties. | 
| - ASSERT(IsUndefined() || IsNull()); | 
| - return HEAP->undefined_value(); | 
| + HeapObject* heap_this = HeapObject::cast(this); | 
| + | 
| + if (heap_this->IsJSObject()) { | 
| + return JSObject::cast(this)->GetElementWithReceiver(receiver, index); | 
| + } | 
| + Heap* heap = heap_this->GetHeap(); | 
| + Isolate* isolate = heap->isolate(); | 
| + | 
| + Context* global_context = isolate->context()->global_context(); | 
| + if (heap_this->IsString()) { | 
| + holder = global_context->string_function()->instance_prototype(); | 
| + } else if (heap_this->IsHeapNumber()) { | 
| + holder = global_context->number_function()->instance_prototype(); | 
| + } else if (heap_this->IsBoolean()) { | 
| + holder = global_context->boolean_function()->instance_prototype(); | 
| + } else { | 
| + // Undefined and null have no indexed properties. | 
| + ASSERT(heap_this->IsUndefined() || heap_this->IsNull()); | 
| + return heap->undefined_value(); | 
| + } | 
| } | 
| return JSObject::cast(holder)->GetElementWithReceiver(receiver, index); | 
| @@ -573,14 +588,26 @@ | 
| Object* Object::GetPrototype() { | 
| + if (IsSmi()) { | 
| + Heap* heap = Isolate::Current()->heap(); | 
| + Context* context = heap->isolate()->context()->global_context(); | 
| + return context->number_function()->instance_prototype(); | 
| + } | 
| + | 
| + HeapObject* heap_this = HeapObject::cast(this); | 
| + | 
| // The object is either a number, a string, a boolean, or a real JS object. | 
| - if (IsJSObject()) return JSObject::cast(this)->map()->prototype(); | 
| - Heap* heap = Isolate::Current()->heap(); | 
| + if (heap_this->IsJSObject()) return JSObject::cast(this)->map()->prototype(); | 
| + Heap* heap = heap_this->GetHeap(); | 
| Context* context = heap->isolate()->context()->global_context(); | 
| - if (IsNumber()) return context->number_function()->instance_prototype(); | 
| - if (IsString()) return context->string_function()->instance_prototype(); | 
| - if (IsBoolean()) { | 
| + if (heap_this->IsHeapNumber()) { | 
| + return context->number_function()->instance_prototype(); | 
| + } | 
| + if (heap_this->IsString()) { | 
| + return context->string_function()->instance_prototype(); | 
| + } | 
| + if (heap_this->IsBoolean()) { | 
| return context->boolean_function()->instance_prototype(); | 
| } else { | 
| return heap->null_value(); | 
| @@ -908,8 +935,9 @@ | 
| // All other JSObjects are rather similar to each other (JSObject, | 
| // JSGlobalProxy, JSGlobalObject, JSUndetectableObject, JSValue). | 
| default: { | 
| - Heap* heap = GetHeap(); | 
| - Object* constructor = map()->constructor(); | 
| + Map* map_of_this = map(); | 
| + Heap* heap = map_of_this->heap(); | 
| + Object* constructor = map_of_this->constructor(); | 
| bool printed = false; | 
| if (constructor->IsHeapObject() && | 
| !heap->Contains(HeapObject::cast(constructor))) { | 
| @@ -1350,8 +1378,7 @@ | 
| String* name, | 
| JSFunction* function, | 
| PropertyAttributes attributes) { | 
| - Heap* heap = GetHeap(); | 
| - ASSERT(!heap->InNewSpace(function)); | 
| + ASSERT(!GetHeap()->InNewSpace(function)); | 
| // Allocate new instance descriptors with (name, function) added | 
| ConstantFunctionDescriptor d(name, function, attributes); | 
| @@ -1376,6 +1403,7 @@ | 
| // If the old map is the global object map (from new Object()), | 
| // then transitions are not added to it, so we are done. | 
| + Heap* heap = old_map->heap(); | 
| if (old_map == heap->isolate()->context()->global_context()-> | 
| object_function()->map()) { | 
| return function; | 
| @@ -1412,7 +1440,6 @@ | 
| Object* value, | 
| PropertyAttributes attributes) { | 
| ASSERT(!HasFastProperties()); | 
| - Heap* heap = GetHeap(); | 
| StringDictionary* dict = property_dictionary(); | 
| Object* store_value = value; | 
| if (IsGlobalObject()) { | 
| @@ -1429,6 +1456,7 @@ | 
| dict->SetEntry(entry, name, store_value, details); | 
| return value; | 
| } | 
| + Heap* heap = GetHeap(); | 
| { MaybeObject* maybe_store_value = | 
| heap->AllocateJSGlobalPropertyCell(value); | 
| if (!maybe_store_value->ToObject(&store_value)) return maybe_store_value; | 
| @@ -1450,8 +1478,9 @@ | 
| PropertyAttributes attributes, | 
| StrictModeFlag strict_mode) { | 
| ASSERT(!IsJSGlobalProxy()); | 
| - Heap* heap = GetHeap(); | 
| - if (!map()->is_extensible()) { | 
| + Map* map_of_this = map(); | 
| + Heap* heap = map_of_this->heap(); | 
| + if (!map_of_this->is_extensible()) { | 
| if (strict_mode == kNonStrictMode) { | 
| return heap->undefined_value(); | 
| } else { | 
| @@ -1463,7 +1492,7 @@ | 
| } | 
| if (HasFastProperties()) { | 
| // Ensure the descriptor array does not get too big. | 
| - if (map()->instance_descriptors()->number_of_descriptors() < | 
| + if (map_of_this->instance_descriptors()->number_of_descriptors() < | 
| DescriptorArray::kMaxNumberOfDescriptors) { | 
| if (value->IsJSFunction() && !heap->InNewSpace(value)) { | 
| return AddConstantFunctionProperty(name, | 
| @@ -1537,7 +1566,7 @@ | 
| return result; | 
| } | 
| // Do not add transitions to the map of "new Object()". | 
| - if (map() == GetHeap()->isolate()->context()->global_context()-> | 
| + if (map() == old_map->heap()->isolate()->context()->global_context()-> | 
| object_function()->map()) { | 
| return result; | 
| } | 
| @@ -1836,8 +1865,9 @@ | 
| MaybeObject* Map::GetExternalArrayElementsMap(ExternalArrayType array_type, | 
| bool safe_to_add_transition) { | 
| + Heap* current_heap = heap(); | 
| DescriptorArray* descriptors = instance_descriptors(); | 
| - String* external_array_sentinel_name = GetIsolate()->heap()->empty_symbol(); | 
| + String* external_array_sentinel_name = current_heap->empty_symbol(); | 
| if (safe_to_add_transition) { | 
| // It's only safe to manipulate the descriptor array if it would be | 
| @@ -1845,7 +1875,8 @@ | 
| ASSERT(!is_shared()); // no transitions can be added to shared maps. | 
| // Check if the external array transition already exists. | 
| - DescriptorLookupCache* cache = heap()->isolate()->descriptor_lookup_cache(); | 
| + DescriptorLookupCache* cache = | 
| + current_heap->isolate()->descriptor_lookup_cache(); | 
| int index = cache->Lookup(descriptors, external_array_sentinel_name); | 
| if (index == DescriptorLookupCache::kAbsent) { | 
| index = descriptors->Search(external_array_sentinel_name); | 
| @@ -1979,7 +2010,6 @@ | 
| String* name, | 
| Object* value, | 
| bool check_prototype) { | 
| - Heap* heap = GetHeap(); | 
| if (check_prototype && !result->IsProperty()) { | 
| LookupCallbackSetterInPrototypes(name, result); | 
| } | 
| @@ -2020,6 +2050,7 @@ | 
| HandleScope scope; | 
| Handle<Object> value_handle(value); | 
| + Heap* heap = GetHeap(); | 
| heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 
| return *value_handle; | 
| } | 
| @@ -2157,7 +2188,6 @@ | 
| String* name, | 
| Object* value, | 
| PropertyAttributes attributes) { | 
| - Heap* heap = GetHeap(); | 
| // Make sure that the top context does not change when doing callbacks or | 
| // interceptor calls. | 
| @@ -2165,9 +2195,11 @@ | 
| LookupResult result; | 
| LocalLookup(name, &result); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() | 
| - && !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 
| - return SetPropertyWithFailedAccessCheck(&result, name, value, false); | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 
| + return SetPropertyWithFailedAccessCheck(&result, name, value, false); | 
| + } | 
| } | 
| if (IsJSGlobalProxy()) { | 
| @@ -2318,14 +2350,15 @@ | 
| LookupResult* result, | 
| String* name, | 
| bool continue_search) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { | 
| - return GetPropertyAttributeWithFailedAccessCheck(receiver, | 
| - result, | 
| - name, | 
| - continue_search); | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_HAS)) { | 
| + return GetPropertyAttributeWithFailedAccessCheck(receiver, | 
| + result, | 
| + name, | 
| + continue_search); | 
| + } | 
| } | 
| if (result->IsProperty()) { | 
| switch (result->type()) { | 
| @@ -2465,10 +2498,10 @@ | 
| // JSGlobalProxy must never be normalized | 
| ASSERT(!IsJSGlobalProxy()); | 
| - Heap* heap = GetHeap(); | 
| + Map* map_of_this = map(); | 
| // Allocate new content. | 
| - int property_count = map()->NumberOfDescribedProperties(); | 
| + int property_count = map_of_this->NumberOfDescribedProperties(); | 
| if (expected_additional_properties > 0) { | 
| property_count += expected_additional_properties; | 
| } else { | 
| @@ -2481,7 +2514,7 @@ | 
| } | 
| StringDictionary* dictionary = StringDictionary::cast(obj); | 
| - DescriptorArray* descs = map()->instance_descriptors(); | 
| + DescriptorArray* descs = map_of_this->instance_descriptors(); | 
| for (int i = 0; i < descs->number_of_descriptors(); i++) { | 
| PropertyDetails details = descs->GetDetails(i); | 
| switch (details.type()) { | 
| @@ -2531,11 +2564,14 @@ | 
| } | 
| } | 
| + Heap* current_heap = map_of_this->heap(); | 
| + | 
| // Copy the next enumeration index from instance descriptor. | 
| - int index = map()->instance_descriptors()->NextEnumerationIndex(); | 
| + int index = map_of_this->instance_descriptors()->NextEnumerationIndex(); | 
| dictionary->SetNextEnumerationIndex(index); | 
| - { MaybeObject* maybe_obj = heap->isolate()->context()->global_context()-> | 
| + { MaybeObject* maybe_obj = | 
| + current_heap->isolate()->context()->global_context()-> | 
| normalized_map_cache()->Get(this, mode); | 
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| } | 
| @@ -2546,17 +2582,17 @@ | 
| // Resize the object in the heap if necessary. | 
| int new_instance_size = new_map->instance_size(); | 
| - int instance_size_delta = map()->instance_size() - new_instance_size; | 
| + int instance_size_delta = map_of_this->instance_size() - new_instance_size; | 
| ASSERT(instance_size_delta >= 0); | 
| - heap->CreateFillerObjectAt(this->address() + new_instance_size, | 
| - instance_size_delta); | 
| + current_heap->CreateFillerObjectAt(this->address() + new_instance_size, | 
| + instance_size_delta); | 
| set_map(new_map); | 
| - map()->set_instance_descriptors(heap->empty_descriptor_array()); | 
| + new_map->set_instance_descriptors(current_heap->empty_descriptor_array()); | 
| set_properties(dictionary); | 
| - heap->isolate()->counters()->props_to_dictionary()->Increment(); | 
| + current_heap->isolate()->counters()->props_to_dictionary()->Increment(); | 
| #ifdef DEBUG | 
| if (FLAG_trace_normalization) { | 
| @@ -2579,10 +2615,11 @@ | 
| MaybeObject* JSObject::NormalizeElements() { | 
| ASSERT(!HasExternalArrayElements()); | 
| if (HasDictionaryElements()) return this; | 
| - ASSERT(map()->has_fast_elements()); | 
| + Map* old_map = map(); | 
| + ASSERT(old_map->has_fast_elements()); | 
| Object* obj; | 
| - { MaybeObject* maybe_obj = map()->GetSlowElementsMap(); | 
| + { MaybeObject* maybe_obj = old_map->GetSlowElementsMap(); | 
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| } | 
| Map* new_map = Map::cast(obj); | 
| @@ -2617,7 +2654,7 @@ | 
| set_map(new_map); | 
| set_elements(dictionary); | 
| - new_map->GetHeap()->isolate()->counters()->elements_to_dictionary()-> | 
| + new_map->heap()->isolate()->counters()->elements_to_dictionary()-> | 
| Increment(); | 
| #ifdef DEBUG | 
| @@ -2634,10 +2671,9 @@ | 
| MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name, | 
| DeleteMode mode) { | 
| // Check local property, ignore interceptor. | 
| - Heap* heap = GetHeap(); | 
| LookupResult result; | 
| LocalLookupRealNamedProperty(name, &result); | 
| - if (!result.IsProperty()) return heap->true_value(); | 
| + if (!result.IsProperty()) return GetHeap()->true_value(); | 
| // Normalize object if needed. | 
| Object* obj; | 
| @@ -2683,7 +2719,6 @@ | 
| MaybeObject* JSObject::DeleteElementPostInterceptor(uint32_t index, | 
| DeleteMode mode) { | 
| - Heap* heap = GetHeap(); | 
| ASSERT(!HasExternalArrayElements()); | 
| switch (GetElementsKind()) { | 
| case FAST_ELEMENTS: { | 
| @@ -2711,7 +2746,7 @@ | 
| UNREACHABLE(); | 
| break; | 
| } | 
| - return heap->true_value(); | 
| + return GetHeap()->true_value(); | 
| } | 
| @@ -2884,16 +2919,17 @@ | 
| // Check whether this object references another object. | 
| bool JSObject::ReferencesObject(Object* obj) { | 
| - Heap* heap = GetHeap(); | 
| + Map* map_of_this = map(); | 
| + Heap* heap = map_of_this->heap(); | 
| AssertNoAllocation no_alloc; | 
| // Is the object the constructor for this object? | 
| - if (map()->constructor() == obj) { | 
| + if (map_of_this->constructor() == obj) { | 
| return true; | 
| } | 
| // Is the object the prototype for this object? | 
| - if (map()->prototype() == obj) { | 
| + if (map_of_this->prototype() == obj) { | 
| return true; | 
| } | 
| @@ -3503,7 +3539,6 @@ | 
| Object* JSObject::SlowReverseLookup(Object* value) { | 
| - Heap* heap = GetHeap(); | 
| if (HasFastProperties()) { | 
| DescriptorArray* descs = map()->instance_descriptors(); | 
| for (int i = 0; i < descs->number_of_descriptors(); i++) { | 
| @@ -3517,7 +3552,7 @@ | 
| } | 
| } | 
| } | 
| - return heap->undefined_value(); | 
| + return GetHeap()->undefined_value(); | 
| } else { | 
| return property_dictionary()->SlowReverseLookup(value); | 
| } | 
| @@ -3621,7 +3656,7 @@ | 
| // Allocate the code cache if not present. | 
| if (code_cache()->IsFixedArray()) { | 
| Object* result; | 
| - { MaybeObject* maybe_result = GetHeap()->AllocateCodeCache(); | 
| + { MaybeObject* maybe_result = code->heap()->AllocateCodeCache(); | 
| if (!maybe_result->ToObject(&result)) return maybe_result; | 
| } | 
| set_code_cache(result); | 
| @@ -3807,7 +3842,6 @@ | 
| Object* CodeCache::LookupDefaultCache(String* name, Code::Flags flags) { | 
| - Heap* heap = GetHeap(); | 
| FixedArray* cache = default_cache(); | 
| int length = cache->length(); | 
| for (int i = 0; i < length; i += kCodeCacheEntrySize) { | 
| @@ -3822,7 +3856,7 @@ | 
| } | 
| } | 
| } | 
| - return heap->undefined_value(); | 
| + return GetHeap()->undefined_value(); | 
| } | 
| @@ -3913,7 +3947,7 @@ | 
| MUST_USE_RESULT MaybeObject* AsObject() { | 
| ASSERT(code_ != NULL); | 
| Object* obj; | 
| - { MaybeObject* maybe_obj = code_->GetHeap()->AllocateFixedArray(2); | 
| + { MaybeObject* maybe_obj = code_->heap()->AllocateFixedArray(2); | 
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| } | 
| FixedArray* pair = FixedArray::cast(obj); | 
| @@ -3991,7 +4025,6 @@ | 
| MaybeObject* FixedArray::AddKeysFromJSArray(JSArray* array) { | 
| - Heap* heap = GetHeap(); | 
| ASSERT(!array->HasExternalArrayElements()); | 
| switch (array->GetElementsKind()) { | 
| case JSObject::FAST_ELEMENTS: | 
| @@ -4002,7 +4035,7 @@ | 
| // Allocate a temporary fixed array. | 
| Object* object; | 
| - { MaybeObject* maybe_object = heap->AllocateFixedArray(size); | 
| + { MaybeObject* maybe_object = GetHeap()->AllocateFixedArray(size); | 
| if (!maybe_object->ToObject(&object)) return maybe_object; | 
| } | 
| FixedArray* key_array = FixedArray::cast(object); | 
| @@ -4022,12 +4055,11 @@ | 
| UNREACHABLE(); | 
| } | 
| UNREACHABLE(); | 
| - return heap->null_value(); // Failure case needs to "return" a value. | 
| + return GetHeap()->null_value(); // Failure case needs to "return" a value. | 
| } | 
| MaybeObject* FixedArray::UnionOfKeys(FixedArray* other) { | 
| - Heap* heap = GetHeap(); | 
| int len0 = length(); | 
| #ifdef DEBUG | 
| if (FLAG_enable_slow_asserts) { | 
| @@ -4053,7 +4085,7 @@ | 
| // Allocate the result | 
| Object* obj; | 
| - { MaybeObject* maybe_obj = heap->AllocateFixedArray(len0 + extra); | 
| + { MaybeObject* maybe_obj = GetHeap()->AllocateFixedArray(len0 + extra); | 
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| } | 
| // Fill in the content | 
| @@ -5373,7 +5405,7 @@ | 
| if (StringShape(this).IsSymbol()) return false; | 
| Map* map = this->map(); | 
| - Heap* heap = map->GetHeap(); | 
| + Heap* heap = map->heap(); | 
| if (map == heap->string_map()) { | 
| this->set_map(heap->undetectable_string_map()); | 
| return true; | 
| @@ -5702,17 +5734,18 @@ | 
| // used for constructing objects to the original object prototype. | 
| // See ECMA-262 13.2.2. | 
| if (!value->IsJSObject()) { | 
| - Heap* heap = GetHeap(); | 
| // Copy the map so this does not affect unrelated functions. | 
| // Remove map transitions because they point to maps with a | 
| // different prototype. | 
| - Object* new_map; | 
| + Object* new_object; | 
| { MaybeObject* maybe_new_map = map()->CopyDropTransitions(); | 
| - if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; | 
| + if (!maybe_new_map->ToObject(&new_object)) return maybe_new_map; | 
| } | 
| - set_map(Map::cast(new_map)); | 
| - map()->set_constructor(value); | 
| - map()->set_non_instance_prototype(true); | 
| + Map* new_map = Map::cast(new_object); | 
| + Heap* heap = new_map->heap(); | 
| + set_map(new_map); | 
| + new_map->set_constructor(value); | 
| + new_map->set_non_instance_prototype(true); | 
| construct_prototype = | 
| heap->isolate()->context()->global_context()-> | 
| initial_object_prototype(); | 
| @@ -5740,7 +5773,7 @@ | 
| ASSERT(shared()->strict_mode() || map() == global_context->function_map()); | 
| set_map(no_prototype_map); | 
| - set_prototype_or_initial_map(GetHeap()->the_hole_value()); | 
| + set_prototype_or_initial_map(no_prototype_map->heap()->the_hole_value()); | 
| return this; | 
| } | 
| @@ -5822,8 +5855,6 @@ | 
| bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { | 
| - Heap* heap = GetHeap(); | 
| - | 
| // Check the basic conditions for generating inline constructor code. | 
| if (!FLAG_inline_new | 
| || !has_only_simple_this_property_assignments() | 
| @@ -5837,6 +5868,8 @@ | 
| return true; | 
| } | 
| + Heap* heap = GetHeap(); | 
| + | 
| // Traverse the proposed prototype chain looking for setters for properties of | 
| // the same names as are set by the inline constructor. | 
| for (Object* obj = prototype; | 
| @@ -6156,7 +6189,7 @@ | 
| void Code::InvalidateRelocation() { | 
| - set_relocation_info(GetHeap()->empty_byte_array()); | 
| + set_relocation_info(heap()->empty_byte_array()); | 
| } | 
| @@ -6734,7 +6767,6 @@ | 
| MaybeObject* JSObject::SetElementsLength(Object* len) { | 
| - Heap* heap = GetHeap(); | 
| // We should never end in here with a pixel or external array. | 
| ASSERT(AllowsSetElementsLength()); | 
| @@ -6742,7 +6774,7 @@ | 
| Object* smi_length = Smi::FromInt(0); | 
| if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) { | 
| const int value = Smi::cast(smi_length)->value(); | 
| - if (value < 0) return ArrayLengthRangeError(heap); | 
| + if (value < 0) return ArrayLengthRangeError(GetHeap()); | 
| switch (GetElementsKind()) { | 
| case FAST_ELEMENTS: { | 
| int old_capacity = FixedArray::cast(elements())->length(); | 
| @@ -6808,14 +6840,14 @@ | 
| if (len->ToArrayIndex(&length)) { | 
| return SetSlowElements(len); | 
| } else { | 
| - return ArrayLengthRangeError(heap); | 
| + return ArrayLengthRangeError(GetHeap()); | 
| } | 
| } | 
| // len is not a number so make the array size one and | 
| // set only element to len. | 
| Object* obj; | 
| - { MaybeObject* maybe_obj = heap->AllocateFixedArray(1); | 
| + { MaybeObject* maybe_obj = GetHeap()->AllocateFixedArray(1); | 
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 
| } | 
| FixedArray::cast(obj)->set(0, len); | 
| @@ -6970,13 +7002,14 @@ | 
| JSObject::LocalElementType JSObject::HasLocalElement(uint32_t index) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| - return UNDEFINED_ELEMENT; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + return UNDEFINED_ELEMENT; | 
| + } | 
| } | 
| if (IsJSGlobalProxy()) { | 
| @@ -7042,13 +7075,13 @@ | 
| bool JSObject::HasElementWithReceiver(JSObject* receiver, uint32_t index) { | 
| - Heap* heap = GetHeap(); | 
| - | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| - return false; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + return false; | 
| + } | 
| } | 
| // Check for lookup interceptor | 
| @@ -7320,14 +7353,15 @@ | 
| Object* value, | 
| StrictModeFlag strict_mode, | 
| bool check_prototype) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 
| - HandleScope scope; | 
| - Handle<Object> value_handle(value); | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 
| - return *value_handle; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 
| + HandleScope scope; | 
| + Handle<Object> value_handle(value); | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 
| + return *value_handle; | 
| + } | 
| } | 
| if (IsJSGlobalProxy()) { | 
| @@ -7522,7 +7556,6 @@ | 
| MaybeObject* JSObject::GetElementPostInterceptor(Object* receiver, | 
| uint32_t index) { | 
| - Heap* heap = GetHeap(); | 
| // Get element works for both JSObject and JSArray since | 
| // JSArray::length cannot change. | 
| switch (GetElementsKind()) { | 
| @@ -7571,7 +7604,7 @@ | 
| // Continue searching via the prototype chain. | 
| Object* pt = GetPrototype(); | 
| - if (pt->IsNull()) return heap->undefined_value(); | 
| + if (pt->IsNull()) return GetHeap()->undefined_value(); | 
| return pt->GetElementWithReceiver(receiver, index); | 
| } | 
| @@ -7613,12 +7646,13 @@ | 
| MaybeObject* JSObject::GetElementWithReceiver(Object* receiver, | 
| uint32_t index) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_GET)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_GET); | 
| - return heap->undefined_value(); | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_GET)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_GET); | 
| + return heap->undefined_value(); | 
| + } | 
| } | 
| if (HasIndexedInterceptor()) { | 
| @@ -7669,6 +7703,7 @@ | 
| } | 
| Object* pt = GetPrototype(); | 
| + Heap* heap = GetHeap(); | 
| if (pt == heap->null_value()) return heap->undefined_value(); | 
| return pt->GetElementWithReceiver(receiver, index); | 
| } | 
| @@ -7895,7 +7930,6 @@ | 
| JSObject* receiver, | 
| String* name, | 
| PropertyAttributes* attributes) { | 
| - Heap* heap = GetHeap(); | 
| // Check local property in holder, ignore interceptor. | 
| LookupResult result; | 
| LocalLookupRealNamedProperty(name, &result); | 
| @@ -7905,7 +7939,7 @@ | 
| // Continue searching via the prototype chain. | 
| Object* pt = GetPrototype(); | 
| *attributes = ABSENT; | 
| - if (pt->IsNull()) return heap->undefined_value(); | 
| + if (pt->IsNull()) return GetHeap()->undefined_value(); | 
| return pt->GetPropertyWithReceiver(receiver, name, attributes); | 
| } | 
| @@ -7914,14 +7948,13 @@ | 
| JSObject* receiver, | 
| String* name, | 
| PropertyAttributes* attributes) { | 
| - Heap* heap = GetHeap(); | 
| // Check local property in holder, ignore interceptor. | 
| LookupResult result; | 
| LocalLookupRealNamedProperty(name, &result); | 
| if (result.IsProperty()) { | 
| return GetProperty(receiver, &result, name, attributes); | 
| } | 
| - return heap->undefined_value(); | 
| + return GetHeap()->undefined_value(); | 
| } | 
| @@ -7966,12 +7999,13 @@ | 
| bool JSObject::HasRealNamedProperty(String* key) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| - return false; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + return false; | 
| + } | 
| } | 
| LookupResult result; | 
| @@ -7981,12 +8015,13 @@ | 
| bool JSObject::HasRealElementProperty(uint32_t index) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| - return false; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_HAS)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + return false; | 
| + } | 
| } | 
| // Handle [] on String objects. | 
| @@ -8025,17 +8060,18 @@ | 
| } | 
| // All possibilities have been handled above already. | 
| UNREACHABLE(); | 
| - return heap->null_value(); | 
| + return GetHeap()->null_value(); | 
| } | 
| bool JSObject::HasRealNamedCallbackProperty(String* key) { | 
| - Heap* heap = GetHeap(); | 
| // Check access rights if needed. | 
| - if (IsAccessCheckNeeded() && | 
| - !heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 
| - heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| - return false; | 
| + if (IsAccessCheckNeeded()) { | 
| + Heap* heap = GetHeap(); | 
| + if (!heap->isolate()->MayNamedAccess(this, key, v8::ACCESS_HAS)) { | 
| + heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_HAS); | 
| + return false; | 
| + } | 
| } | 
| LookupResult result; | 
| @@ -8674,7 +8710,6 @@ | 
| template<typename Shape, typename Key> | 
| MaybeObject* HashTable<Shape, Key>::EnsureCapacity(int n, Key key) { | 
| - Heap* heap = GetHeap(); | 
| int capacity = Capacity(); | 
| int nof = NumberOfElements() + n; | 
| int nod = NumberOfDeletedElements(); | 
| @@ -8688,7 +8723,7 @@ | 
| const int kMinCapacityForPretenure = 256; | 
| bool pretenure = | 
| - (capacity > kMinCapacityForPretenure) && !heap->InNewSpace(this); | 
| + (capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this); | 
| Object* obj; | 
| { MaybeObject* maybe_obj = | 
| Allocate(nof * 2, pretenure ? TENURED : NOT_TENURED); | 
| @@ -8820,7 +8855,6 @@ | 
| // Collates undefined and unexisting elements below limit from position | 
| // zero of the elements. The object stays in Dictionary mode. | 
| MaybeObject* JSObject::PrepareSlowElementsForSort(uint32_t limit) { | 
| - Heap* heap = GetHeap(); | 
| ASSERT(HasDictionaryElements()); | 
| // Must stay in dictionary mode, either because of requires_slow_elements, | 
| // or because we are not going to sort (and therefore compact) all of the | 
| @@ -8830,7 +8864,7 @@ | 
| if (limit > static_cast<uint32_t>(Smi::kMaxValue)) { | 
| // Allocate space for result before we start mutating the object. | 
| Object* new_double; | 
| - { MaybeObject* maybe_new_double = heap->AllocateHeapNumber(0.0); | 
| + { MaybeObject* maybe_new_double = GetHeap()->AllocateHeapNumber(0.0); | 
| if (!maybe_new_double->ToObject(&new_double)) return maybe_new_double; | 
| } | 
| result_double = HeapNumber::cast(new_double); | 
| @@ -8890,6 +8924,7 @@ | 
| uint32_t result = pos; | 
| PropertyDetails no_details = PropertyDetails(NONE, NORMAL); | 
| + Heap* heap = GetHeap(); | 
| while (undefs > 0) { | 
| if (pos > static_cast<uint32_t>(Smi::kMaxValue)) { | 
| // Adding an entry with the key beyond smi-range requires | 
| @@ -8919,9 +8954,10 @@ | 
| // If the object is in dictionary mode, it is converted to fast elements | 
| // mode. | 
| MaybeObject* JSObject::PrepareElementsForSort(uint32_t limit) { | 
| - Heap* heap = GetHeap(); | 
| ASSERT(!HasExternalArrayElements()); | 
| + Heap* heap = GetHeap(); | 
| + | 
| if (HasDictionaryElements()) { | 
| // Convert to fast elements containing only the existing properties. | 
| // Ordering is irrelevant, since we are going to sort anyway. | 
| @@ -9175,9 +9211,9 @@ | 
| MaybeObject* GlobalObject::EnsurePropertyCell(String* name) { | 
| ASSERT(!HasFastProperties()); | 
| - Heap* heap = GetHeap(); | 
| int entry = property_dictionary()->FindEntry(name); | 
| if (entry == StringDictionary::kNotFound) { | 
| + Heap* heap = GetHeap(); | 
| Object* cell; | 
| { MaybeObject* maybe_cell = | 
| heap->AllocateJSGlobalPropertyCell(heap->the_hole_value()); | 
| @@ -9352,10 +9388,9 @@ | 
| Object* CompilationCacheTable::Lookup(String* src) { | 
| - Heap* heap = GetHeap(); | 
| StringKey key(src); | 
| int entry = FindEntry(&key); | 
| - if (entry == kNotFound) return heap->undefined_value(); | 
| + if (entry == kNotFound) return GetHeap()->undefined_value(); | 
| return get(EntryToIndex(entry) + 1); | 
| } | 
| @@ -9372,10 +9407,9 @@ | 
| Object* CompilationCacheTable::LookupRegExp(String* src, | 
| JSRegExp::Flags flags) { | 
| - Heap* heap = GetHeap(); | 
| RegExpKey key(src, flags); | 
| int entry = FindEntry(&key); | 
| - if (entry == kNotFound) return heap->undefined_value(); | 
| + if (entry == kNotFound) return GetHeap()->undefined_value(); | 
| return get(EntryToIndex(entry) + 1); | 
| } | 
| @@ -9495,10 +9529,9 @@ | 
| Object* MapCache::Lookup(FixedArray* array) { | 
| - Heap* heap = GetHeap(); | 
| SymbolsKey key(array); | 
| int entry = FindEntry(&key); | 
| - if (entry == kNotFound) return heap->undefined_value(); | 
| + if (entry == kNotFound) return GetHeap()->undefined_value(); | 
| return get(EntryToIndex(entry) + 1); | 
| } | 
| @@ -9854,7 +9887,6 @@ | 
| // Backwards lookup (slow). | 
| template<typename Shape, typename Key> | 
| Object* Dictionary<Shape, Key>::SlowReverseLookup(Object* value) { | 
| - Heap* heap = Dictionary<Shape, Key>::GetHeap(); | 
| int capacity = HashTable<Shape, Key>::Capacity(); | 
| for (int i = 0; i < capacity; i++) { | 
| Object* k = HashTable<Shape, Key>::KeyAt(i); | 
| @@ -9866,13 +9898,13 @@ | 
| if (e == value) return k; | 
| } | 
| } | 
| + Heap* heap = Dictionary<Shape, Key>::GetHeap(); | 
| return heap->undefined_value(); | 
| } | 
| MaybeObject* StringDictionary::TransformPropertiesToFastFor( | 
| JSObject* obj, int unused_property_fields) { | 
| - Heap* heap = GetHeap(); | 
| // Make sure we preserve dictionary representation if there are too many | 
| // descriptors. | 
| if (NumberOfElements() > DescriptorArray::kMaxNumberOfDescriptors) return obj; | 
| @@ -9892,6 +9924,8 @@ | 
| int instance_descriptor_length = 0; | 
| int number_of_fields = 0; | 
| + Heap* heap = GetHeap(); | 
| + | 
| // Compute the length of the instance descriptor. | 
| int capacity = Capacity(); | 
| for (int i = 0; i < capacity; i++) { | 
| @@ -10020,12 +10054,11 @@ | 
| // Get the break point info object for this code position. | 
| Object* DebugInfo::GetBreakPointInfo(int code_position) { | 
| - Heap* heap = GetHeap(); | 
| // Find the index of the break point info object for this code position. | 
| int index = GetBreakPointInfoIndex(code_position); | 
| // Return the break point info object if any. | 
| - if (index == kNoBreakPointInfo) return heap->undefined_value(); | 
| + if (index == kNoBreakPointInfo) return GetHeap()->undefined_value(); | 
| return BreakPointInfo::cast(break_points()->get(index)); | 
| } | 
| @@ -10098,10 +10131,9 @@ | 
| // Get the break point objects for a code position. | 
| Object* DebugInfo::GetBreakPointObjects(int code_position) { | 
| - Heap* heap = GetHeap(); | 
| Object* break_point_info = GetBreakPointInfo(code_position); | 
| if (break_point_info->IsUndefined()) { | 
| - return heap->undefined_value(); | 
| + return GetHeap()->undefined_value(); | 
| } | 
| return BreakPointInfo::cast(break_point_info)->break_point_objects(); | 
| } | 
| @@ -10124,7 +10156,7 @@ | 
| Object* DebugInfo::FindBreakPointInfo(Handle<DebugInfo> debug_info, | 
| Handle<Object> break_point_object) { | 
| - Heap* heap = Isolate::Current()->heap(); | 
| + Heap* heap = debug_info->GetHeap(); | 
| if (debug_info->break_points()->IsUndefined()) return heap->undefined_value(); | 
| for (int i = 0; i < debug_info->break_points()->length(); i++) { | 
| if (!debug_info->break_points()->get(i)->IsUndefined()) { |