Chromium Code Reviews| Index: src/heap.cc | 
| diff --git a/src/heap.cc b/src/heap.cc | 
| index f09922986e92cae9a9eb70b5246ef42b685201d9..ba75873ac85b69c2b91fb5a72ab50277e04adfea 100644 | 
| --- a/src/heap.cc | 
| +++ b/src/heap.cc | 
| @@ -2735,18 +2735,6 @@ MaybeObject* Heap::AllocatePropertyCell() { | 
| } | 
| -MaybeObject* Heap::CreateOddball(Map* map, | 
| - const char* to_string, | 
| - Object* to_number, | 
| - byte kind) { | 
| - Object* result; | 
| - { MaybeObject* maybe_result = Allocate(map, OLD_POINTER_SPACE); | 
| - if (!maybe_result->ToObject(&result)) return maybe_result; | 
| - } | 
| - return Oddball::cast(result)->Initialize(this, to_string, to_number, kind); | 
| -} | 
| - | 
| - | 
| bool Heap::CreateApiObjects() { | 
| Object* obj; | 
| @@ -2819,116 +2807,83 @@ void Heap::CreateFixedStubs() { | 
| bool Heap::CreateInitialObjects() { | 
| - Object* obj; | 
| + HandleScope scope(isolate()); | 
| + Factory* factory = isolate()->factory(); | 
| // The -0 value must be set before NumberFromDouble works. | 
| - { MaybeObject* maybe_obj = AllocateHeapNumber(-0.0, TENURED); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_minus_zero_value(HeapNumber::cast(obj)); | 
| + set_minus_zero_value(*factory->NewHeapNumber(-0.0, TENURED)); | 
| ASSERT(std::signbit(minus_zero_value()->Number()) != 0); | 
| - { MaybeObject* maybe_obj = AllocateHeapNumber(OS::nan_value(), TENURED); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_nan_value(HeapNumber::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = AllocateHeapNumber(V8_INFINITY, TENURED); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_infinity_value(HeapNumber::cast(obj)); | 
| + set_nan_value(*factory->NewHeapNumber(OS::nan_value(), TENURED)); | 
| + set_infinity_value(*factory->NewHeapNumber(V8_INFINITY, TENURED)); | 
| // The hole has not been created yet, but we want to put something | 
| // predictable in the gaps in the string table, so lets make that Smi zero. | 
| set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0))); | 
| // Allocate initial string table. | 
| - { MaybeObject* maybe_obj = | 
| - StringTable::Allocate(this, kInitialStringTableSize); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - // Don't use set_string_table() due to asserts. | 
| - roots_[kStringTableRootIndex] = obj; | 
| + set_string_table(*StringTable::New(isolate(), kInitialStringTableSize)); | 
| // Finish initializing oddballs after creating the string table. | 
| - { MaybeObject* maybe_obj = | 
| - undefined_value()->Initialize(this, | 
| - "undefined", | 
| - nan_value(), | 
| - Oddball::kUndefined); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| + Oddball::Initialize(isolate(), | 
| + factory->undefined_value(), | 
| + "undefined", | 
| + factory->nan_value(), | 
| + Oddball::kUndefined); | 
| // Initialize the null_value. | 
| - { MaybeObject* maybe_obj = null_value()->Initialize( | 
| - this, "null", Smi::FromInt(0), Oddball::kNull); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(boolean_map(), | 
| - "true", | 
| - Smi::FromInt(1), | 
| - Oddball::kTrue); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_true_value(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(boolean_map(), | 
| - "false", | 
| - Smi::FromInt(0), | 
| - Oddball::kFalse); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_false_value(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(the_hole_map(), | 
| - "hole", | 
| - Smi::FromInt(-1), | 
| - Oddball::kTheHole); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_the_hole_value(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(uninitialized_map(), | 
| - "uninitialized", | 
| - Smi::FromInt(-1), | 
| - Oddball::kUninitialized); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_uninitialized_value(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(arguments_marker_map(), | 
| - "arguments_marker", | 
| - Smi::FromInt(-4), | 
| - Oddball::kArgumentMarker); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_arguments_marker(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(no_interceptor_result_sentinel_map(), | 
| - "no_interceptor_result_sentinel", | 
| - Smi::FromInt(-2), | 
| - Oddball::kOther); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_no_interceptor_result_sentinel(Oddball::cast(obj)); | 
| - | 
| - { MaybeObject* maybe_obj = CreateOddball(termination_exception_map(), | 
| - "termination_exception", | 
| - Smi::FromInt(-3), | 
| - Oddball::kOther); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - set_termination_exception(Oddball::cast(obj)); | 
| + Oddball::Initialize(isolate(), | 
| + factory->null_value(), | 
| + "null", | 
| + handle(Smi::FromInt(0), isolate()), | 
| + Oddball::kNull); | 
| + | 
| + set_true_value(*factory->NewOddball(factory->boolean_map(), | 
| + "true", | 
| + handle(Smi::FromInt(1), isolate()), | 
| + Oddball::kTrue)); | 
| + | 
| + set_false_value(*factory->NewOddball(factory->boolean_map(), | 
| + "false", | 
| + handle(Smi::FromInt(0), isolate()), | 
| + Oddball::kFalse)); | 
| + | 
| + set_the_hole_value(*factory->NewOddball(factory->the_hole_map(), | 
| + "hole", | 
| + handle(Smi::FromInt(-1), isolate()), | 
| + Oddball::kTheHole)); | 
| + | 
| + set_uninitialized_value( | 
| + *factory->NewOddball(factory->uninitialized_map(), | 
| + "uninitialized", | 
| + handle(Smi::FromInt(-1), isolate()), | 
| + Oddball::kUninitialized)); | 
| + | 
| + set_arguments_marker(*factory->NewOddball(factory->arguments_marker_map(), | 
| + "arguments_marker", | 
| + handle(Smi::FromInt(-4), isolate()), | 
| + Oddball::kArgumentMarker)); | 
| + | 
| + set_no_interceptor_result_sentinel( | 
| + *factory->NewOddball(factory->no_interceptor_result_sentinel_map(), | 
| + "no_interceptor_result_sentinel", | 
| + handle(Smi::FromInt(-2), isolate()), | 
| + Oddball::kOther)); | 
| + | 
| + set_termination_exception( | 
| + *factory->NewOddball(factory->termination_exception_map(), | 
| + "termination_exception", | 
| + handle(Smi::FromInt(-3), isolate()), | 
| + Oddball::kOther)); | 
| for (unsigned i = 0; i < ARRAY_SIZE(constant_string_table); i++) { | 
| - { MaybeObject* maybe_obj = | 
| - InternalizeUtf8String(constant_string_table[i].contents); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| - } | 
| - roots_[constant_string_table[i].index] = String::cast(obj); | 
| + Handle<String> str = | 
| + factory->InternalizeUtf8String(constant_string_table[i].contents); | 
| + roots_[constant_string_table[i].index] = *str; | 
| } | 
| + Object* obj; | 
| + | 
| // Allocate the hidden string which is used to identify the hidden properties | 
| // in JSObjects. The hash code has a special value so that it will not match | 
| // the empty string when searching for the property. It cannot be part of the | 
| @@ -2968,11 +2923,12 @@ bool Heap::CreateInitialObjects() { | 
| CreateFixedStubs(); | 
| // Allocate the dictionary of intrinsic function names. | 
| - { MaybeObject* maybe_obj = | 
| - NameDictionary::Allocate(this, Runtime::kNumFunctions); | 
| - if (!maybe_obj->ToObject(&obj)) return false; | 
| + { | 
| + Handle<NameDictionary> function_names = | 
| + NameDictionary::New(isolate(), Runtime::kNumFunctions); | 
| 
 
Igor Sheludko
2014/04/16 13:45:17
This change caused the problem. I didn't add Dicti
 
 | 
| + Runtime::InitializeIntrinsicFunctionNames(isolate(), function_names); | 
| + set_intrinsic_function_names(*function_names); | 
| } | 
| - set_intrinsic_function_names(NameDictionary::cast(obj)); | 
| { MaybeObject* maybe_obj = AllocateInitialNumberStringCache(); | 
| if (!maybe_obj->ToObject(&obj)) return false; | 
| @@ -3171,60 +3127,58 @@ Object* RegExpResultsCache::Lookup(Heap* heap, | 
| } | 
| -void RegExpResultsCache::Enter(Heap* heap, | 
| - String* key_string, | 
| - Object* key_pattern, | 
| - FixedArray* value_array, | 
| +void RegExpResultsCache::Enter(Isolate* isolate, | 
| + Handle<String> key_string, | 
| + Handle<Object> key_pattern, | 
| + Handle<FixedArray> value_array, | 
| ResultsCacheType type) { | 
| - FixedArray* cache; | 
| + Factory* factory = isolate->factory(); | 
| + Handle<FixedArray> cache; | 
| if (!key_string->IsInternalizedString()) return; | 
| if (type == STRING_SPLIT_SUBSTRINGS) { | 
| ASSERT(key_pattern->IsString()); | 
| if (!key_pattern->IsInternalizedString()) return; | 
| - cache = heap->string_split_cache(); | 
| + cache = factory->string_split_cache(); | 
| } else { | 
| ASSERT(type == REGEXP_MULTIPLE_INDICES); | 
| ASSERT(key_pattern->IsFixedArray()); | 
| - cache = heap->regexp_multiple_cache(); | 
| + cache = factory->regexp_multiple_cache(); | 
| } | 
| uint32_t hash = key_string->Hash(); | 
| uint32_t index = ((hash & (kRegExpResultsCacheSize - 1)) & | 
| ~(kArrayEntriesPerCacheEntry - 1)); | 
| if (cache->get(index + kStringOffset) == Smi::FromInt(0)) { | 
| - cache->set(index + kStringOffset, key_string); | 
| - cache->set(index + kPatternOffset, key_pattern); | 
| - cache->set(index + kArrayOffset, value_array); | 
| + cache->set(index + kStringOffset, *key_string); | 
| + cache->set(index + kPatternOffset, *key_pattern); | 
| + cache->set(index + kArrayOffset, *value_array); | 
| } else { | 
| uint32_t index2 = | 
| ((index + kArrayEntriesPerCacheEntry) & (kRegExpResultsCacheSize - 1)); | 
| if (cache->get(index2 + kStringOffset) == Smi::FromInt(0)) { | 
| - cache->set(index2 + kStringOffset, key_string); | 
| - cache->set(index2 + kPatternOffset, key_pattern); | 
| - cache->set(index2 + kArrayOffset, value_array); | 
| + cache->set(index2 + kStringOffset, *key_string); | 
| + cache->set(index2 + kPatternOffset, *key_pattern); | 
| + cache->set(index2 + kArrayOffset, *value_array); | 
| } else { | 
| 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, key_string); | 
| - cache->set(index + kPatternOffset, key_pattern); | 
| - cache->set(index + kArrayOffset, value_array); | 
| + cache->set(index + kStringOffset, *key_string); | 
| + cache->set(index + kPatternOffset, *key_pattern); | 
| + cache->set(index + kArrayOffset, *value_array); | 
| } | 
| } | 
| // If the array is a reasonably short list of substrings, convert it into a | 
| // list of internalized strings. | 
| if (type == STRING_SPLIT_SUBSTRINGS && value_array->length() < 100) { | 
| for (int i = 0; i < value_array->length(); i++) { | 
| - String* str = String::cast(value_array->get(i)); | 
| - Object* internalized_str; | 
| - MaybeObject* maybe_string = heap->InternalizeString(str); | 
| - if (maybe_string->ToObject(&internalized_str)) { | 
| - value_array->set(i, internalized_str); | 
| - } | 
| + Handle<String> str(String::cast(value_array->get(i)), isolate); | 
| + Handle<String> internalized_str = factory->InternalizeString(str); | 
| + value_array->set(i, *internalized_str); | 
| } | 
| } | 
| // Convert backing store to a copy-on-write array. | 
| - value_array->set_map_no_write_barrier(heap->fixed_cow_array_map()); | 
| + value_array->set_map_no_write_barrier(*factory->fixed_cow_array_map()); | 
| } | 
| @@ -5878,16 +5832,12 @@ bool Heap::CreateHeapObjects() { | 
| // Create initial objects | 
| if (!CreateInitialObjects()) return false; | 
| + CHECK_EQ(0, gc_count_); | 
| native_contexts_list_ = undefined_value(); | 
| array_buffers_list_ = undefined_value(); | 
| allocation_sites_list_ = undefined_value(); | 
| weak_object_to_code_table_ = undefined_value(); | 
| - | 
| - HandleScope scope(isolate()); | 
| - Runtime::InitializeIntrinsicFunctionNames( | 
| - isolate(), handle(intrinsic_function_names(), isolate())); | 
| - | 
| return true; | 
| } |