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