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; |
| } |