From e2cc4baaf34de8cfcceb252d7a0700356c294ed4 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Fri, 19 Sep 2014 13:40:38 +0000 Subject: [PATCH] Use the initial map of the Object function for empty object literals BUG= R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/586673002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24088 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/bootstrapper.cc | 16 ++++++++++------ src/factory.cc | 9 ++++++--- src/hydrogen.cc | 3 ++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index 9e564a8..5abd954 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -483,12 +483,14 @@ Handle Genesis::CreateEmptyFunction(Isolate* isolate) { { // --- O b j e c t --- Handle object_fun = factory->NewFunction(object_name); + int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount; + int instance_size = JSObject::kHeaderSize + kPointerSize * unused; Handle object_function_map = - factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); + factory->NewMap(JS_OBJECT_TYPE, instance_size); + object_function_map->set_inobject_properties(unused); JSFunction::SetInitialMap(object_fun, object_function_map, isolate->factory()->null_value()); - object_function_map->set_unused_property_fields( - JSObject::kInitialGlobalObjectUnusedPropertiesCount); + object_function_map->set_unused_property_fields(unused); native_context()->set_object_function(*object_fun); @@ -1153,11 +1155,8 @@ void Genesis::InitializeGlobal(Handle global_object, { // Set up the iterator result object STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2); Handle object_function(native_context()->object_function()); - DCHECK(object_function->initial_map()->inobject_properties() == 0); Handle iterator_result_map = Map::Create(object_function, JSGeneratorObject::kResultPropertyCount); - DCHECK(iterator_result_map->inobject_properties() == - JSGeneratorObject::kResultPropertyCount); Map::EnsureDescriptorSlack(iterator_result_map, JSGeneratorObject::kResultPropertyCount); @@ -1171,7 +1170,12 @@ void Genesis::InitializeGlobal(Handle global_object, NONE, Representation::Tagged()); iterator_result_map->AppendDescriptor(&done_descr); + iterator_result_map->set_instance_size(JSGeneratorObject::kResultSize); iterator_result_map->set_unused_property_fields(0); + iterator_result_map->set_inobject_properties( + JSGeneratorObject::kResultPropertyCount); + iterator_result_map->set_pre_allocated_property_fields( + JSGeneratorObject::kResultPropertyCount); DCHECK_EQ(JSGeneratorObject::kResultSize, iterator_result_map->instance_size()); native_context()->set_iterator_result_map(*iterator_result_map); diff --git a/src/factory.cc b/src/factory.cc index 5eefda2..4e5b559 100644 --- a/src/factory.cc +++ b/src/factory.cc @@ -2328,9 +2328,12 @@ Handle Factory::ObjectLiteralMapFromCache(Handle context, Handle(MapCache::cast(context->map_cache())); Handle result = Handle(cache->Lookup(*keys), isolate()); if (result->IsMap()) return Handle::cast(result); - // Create a new map and add it to the cache. - Handle map = Map::Create( - handle(context->object_function()), keys->length()); + int length = keys->length(); + // Create a new map and add it to the cache. Reuse the initial map of the + // Object function if the literal has no predeclared properties. + Handle map = + length == 0 ? handle(context->object_function()->initial_map()) + : Map::Create(handle(context->object_function()), length); AddToMapCache(context, keys, map); return map; } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 345cce3..ae63db7 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -11001,7 +11001,8 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( } // Copy in-object properties. - if (boilerplate_object->map()->NumberOfFields() != 0) { + if (boilerplate_object->map()->NumberOfFields() != 0 || + boilerplate_object->map()->unused_property_fields() > 0) { BuildEmitInObjectProperties(boilerplate_object, object, site_context, pretenure_flag); } -- 2.7.4