| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index d7e1abd7798850463bead3309b791d3f053b8b64..0c1cc570cadc66810ec121efb7f29b0f63700c9b 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -2397,11 +2397,6 @@ MaybeObject* Heap::AllocateFillerObject(int size,
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocatePolymorphicCodeCache() {
|
| - return AllocateStruct(POLYMORPHIC_CODE_CACHE_TYPE);
|
| -}
|
| -
|
| -
|
| const Heap::StringTypeTable Heap::string_type_table[] = {
|
| #define STRING_TYPE_ELEMENT(type, size, name, camel_name) \
|
| {type, size, k##camel_name##MapRootIndex},
|
| @@ -2721,32 +2716,24 @@ MaybeObject* Heap::AllocatePropertyCell() {
|
| }
|
|
|
|
|
| -bool Heap::CreateApiObjects() {
|
| - Object* obj;
|
| +void Heap::CreateApiObjects() {
|
| + HandleScope scope(isolate());
|
| + Factory* factory = isolate()->factory();
|
| + Handle<Map> new_neander_map =
|
| + factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
|
|
| - { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| // Don't use Smi-only elements optimizations for objects with the neander
|
| // map. There are too many cases where element values are set directly with a
|
| // bottleneck to trap the Smi-only -> fast elements transition, and there
|
| // appears to be no benefit for optimize this case.
|
| - Map* new_neander_map = Map::cast(obj);
|
| new_neander_map->set_elements_kind(TERMINAL_FAST_ELEMENTS_KIND);
|
| - set_neander_map(new_neander_map);
|
| + set_neander_map(*new_neander_map);
|
|
|
| - { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map());
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Object* elements;
|
| - { MaybeObject* maybe_elements = AllocateFixedArray(2);
|
| - if (!maybe_elements->ToObject(&elements)) return false;
|
| - }
|
| - FixedArray::cast(elements)->set(0, Smi::FromInt(0));
|
| - JSObject::cast(obj)->set_elements(FixedArray::cast(elements));
|
| - set_message_listeners(JSObject::cast(obj));
|
| -
|
| - return true;
|
| + Handle<JSObject> listeners = factory->NewNeanderObject();
|
| + Handle<FixedArray> elements = factory->NewFixedArray(2);
|
| + elements->set(0, Smi::FromInt(0));
|
| + listeners->set_elements(*elements);
|
| + set_message_listeners(*listeners);
|
| }
|
|
|
|
|
| @@ -2792,7 +2779,7 @@ void Heap::CreateFixedStubs() {
|
| }
|
|
|
|
|
| -bool Heap::CreateInitialObjects() {
|
| +void Heap::CreateInitialObjects() {
|
| HandleScope scope(isolate());
|
| Factory* factory = isolate()->factory();
|
|
|
| @@ -2874,19 +2861,14 @@ bool Heap::CreateInitialObjects() {
|
| 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
|
| // loop above because it needs to be allocated manually with the special
|
| // hash code in place. The hash code for the hidden_string is zero to ensure
|
| // that it will always be at the first entry in property descriptors.
|
| - { MaybeObject* maybe_obj = AllocateOneByteInternalizedString(
|
| + hidden_string_ = *factory->NewOneByteInternalizedString(
|
| OneByteVector("", 0), String::kEmptyStringHash);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - hidden_string_ = String::cast(obj);
|
|
|
| // Create the code_stubs dictionary. The initial size is set to avoid
|
| // expanding the dictionary during bootstrapping.
|
| @@ -2896,10 +2878,8 @@ bool Heap::CreateInitialObjects() {
|
| // is set to avoid expanding the dictionary during bootstrapping.
|
| set_non_monomorphic_cache(*UnseededNumberDictionary::New(isolate(), 64));
|
|
|
| - { MaybeObject* maybe_obj = AllocatePolymorphicCodeCache();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_polymorphic_code_cache(PolymorphicCodeCache::cast(obj));
|
| + set_polymorphic_code_cache(PolymorphicCodeCache::cast(
|
| + *factory->NewStruct(POLYMORPHIC_CODE_CACHE_TYPE)));
|
|
|
| set_instanceof_cache_function(Smi::FromInt(0));
|
| set_instanceof_cache_map(Smi::FromInt(0));
|
| @@ -2908,125 +2888,60 @@ bool Heap::CreateInitialObjects() {
|
| CreateFixedStubs();
|
|
|
| // Allocate the dictionary of intrinsic function names.
|
| - {
|
| - Handle<NameDictionary> function_names =
|
| - NameDictionary::New(isolate(), Runtime::kNumFunctions);
|
| - Runtime::InitializeIntrinsicFunctionNames(isolate(), function_names);
|
| - set_intrinsic_function_names(*function_names);
|
| - }
|
| + Handle<NameDictionary> intrinsic_names =
|
| + NameDictionary::New(isolate(), Runtime::kNumFunctions);
|
| + Runtime::InitializeIntrinsicFunctionNames(isolate(), intrinsic_names);
|
| + set_intrinsic_function_names(*intrinsic_names);
|
|
|
| - { MaybeObject* maybe_obj = AllocateInitialNumberStringCache();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_number_string_cache(FixedArray::cast(obj));
|
| + set_number_string_cache(*factory->NewFixedArray(
|
| + kInitialNumberStringCacheSize * 2, TENURED));
|
|
|
| // Allocate cache for single character one byte strings.
|
| - { MaybeObject* maybe_obj =
|
| - AllocateFixedArray(String::kMaxOneByteCharCode + 1, TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_single_character_string_cache(FixedArray::cast(obj));
|
| -
|
| - // Allocate cache for string split.
|
| - { MaybeObject* maybe_obj = AllocateFixedArray(
|
| - RegExpResultsCache::kRegExpResultsCacheSize, TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_string_split_cache(FixedArray::cast(obj));
|
| + set_single_character_string_cache(*factory->NewFixedArray(
|
| + String::kMaxOneByteCharCode + 1, TENURED));
|
|
|
| - { MaybeObject* maybe_obj = AllocateFixedArray(
|
| - RegExpResultsCache::kRegExpResultsCacheSize, TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_regexp_multiple_cache(FixedArray::cast(obj));
|
| + // Allocate cache for string split and regexp-multiple.
|
| + set_string_split_cache(*factory->NewFixedArray(
|
| + RegExpResultsCache::kRegExpResultsCacheSize, TENURED));
|
| + set_regexp_multiple_cache(*factory->NewFixedArray(
|
| + RegExpResultsCache::kRegExpResultsCacheSize, TENURED));
|
|
|
| // Allocate cache for external strings pointing to native source code.
|
| - { MaybeObject* maybe_obj = AllocateFixedArray(Natives::GetBuiltinsCount());
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_natives_source_cache(FixedArray::cast(obj));
|
| + set_natives_source_cache(*factory->NewFixedArray(
|
| + Natives::GetBuiltinsCount()));
|
|
|
| - { MaybeObject* maybe_obj = AllocateCell(undefined_value());
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_undefined_cell(Cell::cast(obj));
|
| + set_undefined_cell(*factory->NewCell(factory->undefined_value()));
|
|
|
| // The symbol registry is initialized lazily.
|
| set_symbol_registry(undefined_value());
|
|
|
| // Allocate object to hold object observation state.
|
| - { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - { MaybeObject* maybe_obj = AllocateJSObjectFromMap(Map::cast(obj));
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_observation_state(JSObject::cast(obj));
|
| + set_observation_state(*factory->NewJSObjectFromMap(
|
| + factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize)));
|
|
|
| // Allocate object to hold object microtask state.
|
| - { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - { MaybeObject* maybe_obj = AllocateJSObjectFromMap(Map::cast(obj));
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_microtask_state(JSObject::cast(obj));
|
| + set_microtask_state(*factory->NewJSObjectFromMap(
|
| + factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize)));
|
|
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_frozen_symbol(Symbol::cast(obj));
|
| + set_frozen_symbol(*factory->NewPrivateSymbol());
|
| + set_nonexistent_symbol(*factory->NewPrivateSymbol());
|
| + set_elements_transition_symbol(*factory->NewPrivateSymbol());
|
| + set_uninitialized_symbol(*factory->NewPrivateSymbol());
|
| + set_megamorphic_symbol(*factory->NewPrivateSymbol());
|
| + set_observed_symbol(*factory->NewPrivateSymbol());
|
|
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_nonexistent_symbol(Symbol::cast(obj));
|
| + Handle<SeededNumberDictionary> slow_element_dictionary =
|
| + SeededNumberDictionary::New(isolate(), 0, TENURED);
|
| + slow_element_dictionary->set_requires_slow_elements();
|
| + set_empty_slow_element_dictionary(*slow_element_dictionary);
|
|
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_elements_transition_symbol(Symbol::cast(obj));
|
| -
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_uninitialized_symbol(Symbol::cast(obj));
|
| -
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_megamorphic_symbol(Symbol::cast(obj));
|
| -
|
| - {
|
| - Handle<SeededNumberDictionary> dict =
|
| - SeededNumberDictionary::New(isolate(), 0, TENURED);
|
| - dict->set_requires_slow_elements();
|
| - set_empty_slow_element_dictionary(*dict);
|
| - }
|
| -
|
| - { MaybeObject* maybe_obj = AllocateSymbol();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - Symbol::cast(obj)->set_is_private(true);
|
| - set_observed_symbol(Symbol::cast(obj));
|
| -
|
| - { MaybeObject* maybe_obj = AllocateFixedArray(0, TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_materialized_objects(FixedArray::cast(obj));
|
| + set_materialized_objects(*factory->NewFixedArray(0, TENURED));
|
|
|
| // Handling of script id generation is in Factory::NewScript.
|
| set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId));
|
|
|
| - { MaybeObject* maybe_obj = AllocateAllocationSitesScratchpad();
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_allocation_sites_scratchpad(FixedArray::cast(obj));
|
| + set_allocation_sites_scratchpad(*factory->NewFixedArray(
|
| + kAllocationSiteScratchpadSize, TENURED));
|
| InitializeAllocationSitesScratchpad();
|
|
|
| // Initialize keyed lookup cache.
|
| @@ -3040,8 +2955,6 @@ bool Heap::CreateInitialObjects() {
|
|
|
| // Initialize compilation cache.
|
| isolate_->compilation_cache()->Clear();
|
| -
|
| - return true;
|
| }
|
|
|
|
|
| @@ -3175,13 +3088,6 @@ void RegExpResultsCache::Clear(FixedArray* cache) {
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateInitialNumberStringCache() {
|
| - MaybeObject* maybe_obj =
|
| - AllocateFixedArray(kInitialNumberStringCacheSize * 2, TENURED);
|
| - return maybe_obj;
|
| -}
|
| -
|
| -
|
| int Heap::FullSizeNumberStringCacheLength() {
|
| // Compute the size of the number string cache based on the max newspace size.
|
| // The number string cache has a minimum size based on twice the initial cache
|
| @@ -3204,13 +3110,6 @@ void Heap::FlushNumberStringCache() {
|
| }
|
|
|
|
|
| -MaybeObject* Heap::AllocateAllocationSitesScratchpad() {
|
| - MaybeObject* maybe_obj =
|
| - AllocateFixedArray(kAllocationSiteScratchpadSize, TENURED);
|
| - return maybe_obj;
|
| -}
|
| -
|
| -
|
| void Heap::FlushAllocationSitesScratchpad() {
|
| for (int i = 0; i < allocation_sites_scratchpad_length_; i++) {
|
| allocation_sites_scratchpad()->set_undefined(i);
|
| @@ -5419,10 +5318,10 @@ bool Heap::SetUp() {
|
| bool Heap::CreateHeapObjects() {
|
| // Create initial maps.
|
| if (!CreateInitialMaps()) return false;
|
| - if (!CreateApiObjects()) return false;
|
| + CreateApiObjects();
|
|
|
| // Create initial objects
|
| - if (!CreateInitialObjects()) return false;
|
| + CreateInitialObjects();
|
| CHECK_EQ(0, gc_count_);
|
|
|
| native_contexts_list_ = undefined_value();
|
|
|