Revision: 24088
Author:   verwa...@chromium.org
Date:     Fri Sep 19 13:40:38 2014 UTC
Log: Use the initial map of the Object function for empty object literals

BUG=
R=jkumme...@chromium.org

Review URL: https://codereview.chromium.org/586673002
https://code.google.com/p/v8/source/detail?r=24088

Modified:
 /branches/bleeding_edge/src/bootstrapper.cc
 /branches/bleeding_edge/src/factory.cc
 /branches/bleeding_edge/src/hydrogen.cc

=======================================
--- /branches/bleeding_edge/src/bootstrapper.cc Fri Sep 19 08:01:35 2014 UTC
+++ /branches/bleeding_edge/src/bootstrapper.cc Fri Sep 19 13:40:38 2014 UTC
@@ -483,12 +483,14 @@

   {  // --- O b j e c t ---
     Handle<JSFunction> object_fun = factory->NewFunction(object_name);
+    int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount;
+    int instance_size = JSObject::kHeaderSize + kPointerSize * unused;
     Handle<Map> 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 @@
   {  // Set up the iterator result object
     STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2);
Handle<JSFunction> object_function(native_context()->object_function());
-    DCHECK(object_function->initial_map()->inobject_properties() == 0);
     Handle<Map> 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 @@
                                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);
=======================================
--- /branches/bleeding_edge/src/factory.cc      Thu Sep 18 13:24:02 2014 UTC
+++ /branches/bleeding_edge/src/factory.cc      Fri Sep 19 13:40:38 2014 UTC
@@ -2328,9 +2328,12 @@
       Handle<MapCache>(MapCache::cast(context->map_cache()));
   Handle<Object> result = Handle<Object>(cache->Lookup(*keys), isolate());
   if (result->IsMap()) return Handle<Map>::cast(result);
-  // Create a new map and add it to the cache.
-  Handle<Map> 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> map =
+      length == 0 ? handle(context->object_function()->initial_map())
+ : Map::Create(handle(context->object_function()), length);
   AddToMapCache(context, keys, map);
   return map;
 }
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Fri Sep 19 11:08:04 2014 UTC
+++ /branches/bleeding_edge/src/hydrogen.cc     Fri Sep 19 13:40:38 2014 UTC
@@ -11001,7 +11001,8 @@
   }

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

--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to