Revision: 12141
Author:   [email protected]
Date:     Thu Jul 19 03:01:52 2012
Log:      Append to descriptors over map.

Review URL: https://chromiumcodereview.appspot.com/10800033
http://code.google.com/p/v8/source/detail?r=12141

Modified:
 /branches/bleeding_edge/src/bootstrapper.cc
 /branches/bleeding_edge/src/factory.cc
 /branches/bleeding_edge/src/objects-inl.h
 /branches/bleeding_edge/src/objects.h

=======================================
--- /branches/bleeding_edge/src/bootstrapper.cc Wed Jul 18 08:38:58 2012
+++ /branches/bleeding_edge/src/bootstrapper.cc Thu Jul 19 03:01:52 2012
@@ -391,26 +391,27 @@
       DONT_ENUM | DONT_DELETE | READ_ONLY);

   DescriptorArray::WhitenessWitness witness(*descriptors);
+  map->set_instance_descriptors(*descriptors);

   {  // Add length.
     Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength));
     CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add name.
     Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName));
     CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add arguments.
Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionArguments));
     CallbacksDescriptor d(*factory()->arguments_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add caller.
     Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionCaller));
     CallbacksDescriptor d(*factory()->caller_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   if (prototypeMode != DONT_ADD_PROTOTYPE) {
     // Add prototype.
@@ -419,10 +420,8 @@
     }
Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype));
     CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
-  }
-
-  map->set_instance_descriptors(*descriptors);
+    map->AppendDescriptor(&d, witness);
+  }
 }


@@ -530,26 +529,27 @@
       DONT_ENUM | DONT_DELETE);

   DescriptorArray::WhitenessWitness witness(*descriptors);
+  map->set_instance_descriptors(*descriptors);

   {  // Add length.
     Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionLength));
     CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add name.
     Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionName));
     CallbacksDescriptor d(*factory()->name_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add arguments.
     Handle<AccessorPair> arguments(factory()->NewAccessorPair());
CallbacksDescriptor d(*factory()->arguments_symbol(), *arguments, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }
   {  // Add caller.
     Handle<AccessorPair> caller(factory()->NewAccessorPair());
     CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attribs);
-    descriptors->Append(&d, witness);
+    map->AppendDescriptor(&d, witness);
   }

   if (prototypeMode != DONT_ADD_PROTOTYPE) {
@@ -559,10 +559,8 @@
     }
Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype));
     CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs);
-    descriptors->Append(&d, witness);
-  }
-
-  map->set_instance_descriptors(*descriptors);
+    map->AppendDescriptor(&d, witness);
+  }
 }


@@ -870,11 +868,12 @@
         DONT_ENUM | DONT_DELETE);

     DescriptorArray::WhitenessWitness witness(*array_descriptors);
+ array_function->initial_map()->set_instance_descriptors(*array_descriptors);

     {  // Add length.
       Handle<Foreign> f(factory->NewForeign(&Accessors::ArrayLength));
       CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
-      array_descriptors->Append(&d, witness);
+      array_function->initial_map()->AppendDescriptor(&d, witness);
     }

// array_function is used internally. JS code creating array object should
@@ -882,7 +881,6 @@
     // as the constructor. 'Array' property on a global object can be
     // overwritten by JS code.
     global_context()->set_array_function(*array_function);
- array_function->initial_map()->set_instance_descriptors(*array_descriptors);
   }

   {  // --- N u m b e r ---
@@ -910,21 +908,20 @@
         isolate->builtins()->builtin(Builtins::kStringConstructCode));
     global_context()->set_string_function(*string_fun);

+    Handle<Map> string_map =
+        Handle<Map>(global_context()->string_function()->initial_map());
Handle<DescriptorArray> string_descriptors(factory->NewDescriptorArray(1));
     PropertyAttributes attribs = static_cast<PropertyAttributes>(
         DONT_ENUM | DONT_DELETE | READ_ONLY);

     DescriptorArray::WhitenessWitness witness(*string_descriptors);
+    string_map->set_instance_descriptors(*string_descriptors);

     {  // Add length.
       Handle<Foreign> f(factory->NewForeign(&Accessors::StringLength));
       CallbacksDescriptor d(*factory->length_symbol(), *f, attribs);
-      string_descriptors->Append(&d, witness);
-    }
-
-    Handle<Map> string_map =
-        Handle<Map>(global_context()->string_function()->initial_map());
-    string_map->set_instance_descriptors(*string_descriptors);
+      string_map->AppendDescriptor(&d, witness);
+    }
   }

   {  // --- D a t e ---
@@ -951,37 +948,39 @@

     ASSERT_EQ(0, initial_map->inobject_properties());

-    Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5);
-    DescriptorArray::WhitenessWitness witness(*descriptors);
     PropertyAttributes final =
static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
+    Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(5);
+    DescriptorArray::WhitenessWitness witness(*descriptors);
+    initial_map->set_instance_descriptors(*descriptors);
+
     {
       // ECMA-262, section 15.10.7.1.
       FieldDescriptor field(heap->source_symbol(),
                             JSRegExp::kSourceFieldIndex,
                             final);
-      descriptors->Append(&field, witness);
+      initial_map->AppendDescriptor(&field, witness);
     }
     {
       // ECMA-262, section 15.10.7.2.
       FieldDescriptor field(heap->global_symbol(),
                             JSRegExp::kGlobalFieldIndex,
                             final);
-      descriptors->Append(&field, witness);
+      initial_map->AppendDescriptor(&field, witness);
     }
     {
       // ECMA-262, section 15.10.7.3.
       FieldDescriptor field(heap->ignore_case_symbol(),
                             JSRegExp::kIgnoreCaseFieldIndex,
                             final);
-      descriptors->Append(&field, witness);
+      initial_map->AppendDescriptor(&field, witness);
     }
     {
       // ECMA-262, section 15.10.7.4.
       FieldDescriptor field(heap->multiline_symbol(),
                             JSRegExp::kMultilineFieldIndex,
                             final);
-      descriptors->Append(&field, witness);
+      initial_map->AppendDescriptor(&field, witness);
     }
     {
       // ECMA-262, section 15.10.7.5.
@@ -990,9 +989,8 @@
       FieldDescriptor field(heap->last_index_symbol(),
                             JSRegExp::kLastIndexFieldIndex,
                             writable);
-      descriptors->Append(&field, witness);
-    }
-    initial_map->set_instance_descriptors(*descriptors);
+      initial_map->AppendDescriptor(&field, witness);
+    }

     initial_map->set_inobject_properties(5);
     initial_map->set_pre_allocated_property_fields(5);
@@ -1138,23 +1136,24 @@
     // Create the descriptor array for the arguments object.
     Handle<DescriptorArray> descriptors = factory->NewDescriptorArray(3);
     DescriptorArray::WhitenessWitness witness(*descriptors);
+    map->set_instance_descriptors(*descriptors);
+
     {  // length
       FieldDescriptor d(*factory->length_symbol(), 0, DONT_ENUM);
-      descriptors->Append(&d, witness);
+      map->AppendDescriptor(&d, witness);
     }
     {  // callee
       CallbacksDescriptor d(*factory->callee_symbol(),
                             *callee,
                             attributes);
-      descriptors->Append(&d, witness);
+      map->AppendDescriptor(&d, witness);
     }
     {  // caller
       CallbacksDescriptor d(*factory->caller_symbol(),
                             *caller,
                             attributes);
-      descriptors->Append(&d, witness);
-    }
-    map->set_instance_descriptors(*descriptors);
+      map->AppendDescriptor(&d, witness);
+    }

     map->set_function_with_prototype(true);
     map->set_prototype(global_context()->object_function()->prototype());
@@ -1483,54 +1482,55 @@
         factory()->NewDescriptorArray(13));

     DescriptorArray::WhitenessWitness witness(*script_descriptors);
+    script_map->set_instance_descriptors(*script_descriptors);

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptSource));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("source"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptName));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("name"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptId));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("id"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineOffset));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("line_offset"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptColumnOffset));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("column_offset"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptData));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("data"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptType));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("type"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
@@ -1538,21 +1538,21 @@
           &Accessors::ScriptCompilationType));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("compilation_type"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptLineEnds));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("line_ends"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
Handle<Foreign> f(factory()->NewForeign(&Accessors::ScriptContextData));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("context_data"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
@@ -1560,7 +1560,7 @@
           &Accessors::ScriptEvalFromScript));
       CallbacksDescriptor d(
           *factory()->LookupAsciiSymbol("eval_from_script"), *f, attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
@@ -1570,7 +1570,7 @@
           *factory()->LookupAsciiSymbol("eval_from_script_position"),
           *f,
           attribs);
-      script_descriptors->Append(&d, witness);
+      script_map->AppendDescriptor(&d, witness);
     }

     {
@@ -1580,10 +1580,8 @@
           *factory()->LookupAsciiSymbol("eval_from_function_name"),
           *f,
           attribs);
-      script_descriptors->Append(&d, witness);
-    }
-
-    script_map->set_instance_descriptors(*script_descriptors);
+      script_map->AppendDescriptor(&d, witness);
+    }

     // Allocate the empty script.
Handle<Script> script = factory()->NewScript(factory()->empty_string());
@@ -1645,14 +1643,13 @@
         DONT_ENUM | DONT_DELETE);

     DescriptorArray::WhitenessWitness witness(*array_descriptors);
+ array_function->initial_map()->set_instance_descriptors(*array_descriptors);

     {  // Add length.
       Handle<Foreign> f(factory()->NewForeign(&Accessors::ArrayLength));
       CallbacksDescriptor d(*factory()->length_symbol(), *f, attribs);
-      array_descriptors->Append(&d, witness);
-    }
-
- array_function->initial_map()->set_instance_descriptors(*array_descriptors);
+      array_function->initial_map()->AppendDescriptor(&d, witness);
+    }

     global_context()->set_internal_array_function(*array_function);
   }
@@ -1741,29 +1738,33 @@
     Handle<DescriptorArray> reresult_descriptors =
         factory()->NewDescriptorArray(3);
     DescriptorArray::WhitenessWitness witness(*reresult_descriptors);
-
-    JSFunction* array_function = global_context()->array_function();
-    Handle<DescriptorArray> array_descriptors(
-        array_function->initial_map()->instance_descriptors());
-    int old = array_descriptors->SearchWithCache(heap()->length_symbol());
-    reresult_descriptors->CopyFrom(0, *array_descriptors, old, witness);
-
-    reresult_descriptors->SetLastAdded(0);
-
+    initial_map->set_instance_descriptors(*reresult_descriptors);
+
+    {
+      JSFunction* array_function = global_context()->array_function();
+      Handle<DescriptorArray> array_descriptors(
+          array_function->initial_map()->instance_descriptors());
+      String* length = heap()->length_symbol();
+      int old = array_descriptors->SearchWithCache(length);
+      ASSERT(old != DescriptorArray::kNotFound);
+      CallbacksDescriptor desc(length,
+                               array_descriptors->GetValue(old),
+ array_descriptors->GetDetails(old).attributes());
+      initial_map->AppendDescriptor(&desc, witness);
+    }
     {
       FieldDescriptor index_field(heap()->index_symbol(),
                                   JSRegExpResult::kIndexIndex,
                                   NONE);
-      reresult_descriptors->Append(&index_field, witness);
+      initial_map->AppendDescriptor(&index_field, witness);
     }

     {
       FieldDescriptor input_field(heap()->input_symbol(),
                                   JSRegExpResult::kInputIndex,
                                   NONE);
-      reresult_descriptors->Append(&input_field, witness);
-    }
-    initial_map->set_instance_descriptors(*reresult_descriptors);
+      initial_map->AppendDescriptor(&input_field, witness);
+    }

     initial_map->set_inobject_properties(2);
     initial_map->set_pre_allocated_property_fields(2);
=======================================
--- /branches/bleeding_edge/src/factory.cc      Wed Jul 18 08:38:58 2012
+++ /branches/bleeding_edge/src/factory.cc      Thu Jul 19 03:01:52 2012
@@ -911,6 +911,8 @@
       result->CopyFrom(i, *array, i, witness);
     }
   }
+
+  map->set_instance_descriptors(*result);

   // Fill in new callback descriptors.  Process the callbacks from
   // back to front so that the last callback with a given name takes
@@ -925,13 +927,16 @@
     if (LinearSearch(*result, *key, result->NumberOfSetDescriptors()) ==
         DescriptorArray::kNotFound) {
       CallbacksDescriptor desc(*key, *entry, entry->property_attributes());
-      result->Append(&desc, witness);
+      map->AppendDescriptor(&desc, witness);
     }
   }

   int new_number_of_descriptors = result->NumberOfSetDescriptors();
-  // Don't replace the descriptor array if there were no new elements.
-  if (new_number_of_descriptors == descriptor_count) return;
+  // Reinstall the original descriptor array if no new elements were added.
+  if (new_number_of_descriptors == descriptor_count) {
+    map->set_instance_descriptors(*array);
+    return;
+  }

   // If duplicates were detected, allocate a result of the right size
   // and transfer the elements.
@@ -942,10 +947,8 @@
       new_result->CopyFrom(i, *result, i, witness);
     }
     new_result->SetLastAdded(result->LastAdded());
-    result = new_result;
-  }
-
-  map->set_instance_descriptors(*result);
+    map->set_instance_descriptors(*new_result);
+  }
 }


=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Thu Jul 19 00:32:58 2012
+++ /branches/bleeding_edge/src/objects-inl.h   Thu Jul 19 03:01:52 2012
@@ -2110,9 +2110,10 @@
 }


-void DescriptorArray::Append(Descriptor* desc,
-                             const WhitenessWitness& witness) {
-  int descriptor_number = NumberOfSetDescriptors();
+int DescriptorArray::Append(Descriptor* desc,
+                            const WhitenessWitness& witness,
+                            int number_of_set_descriptors) {
+  int descriptor_number = number_of_set_descriptors;
   int enumeration_index = descriptor_number + 1;
   desc->SetEnumerationIndex(enumeration_index);

@@ -2128,7 +2129,7 @@
   }

   Set(descriptor_number, desc, witness);
-  SetLastAdded(descriptor_number);
+  return descriptor_number;
 }


@@ -3553,6 +3554,14 @@
heap, this, kInstanceDescriptorsOrBackPointerOffset, back_pointer, mode);
 }

+
+void Map::AppendDescriptor(Descriptor* desc,
+ const DescriptorArray::WhitenessWitness& witness) {
+  DescriptorArray* descriptors = instance_descriptors();
+  int set_descriptors = descriptors->NumberOfSetDescriptors();
+  int new_last_added = descriptors->Append(desc, witness, set_descriptors);
+  descriptors->SetLastAdded(new_last_added);
+}


 Object* Map::GetBackPointer() {
=======================================
--- /branches/bleeding_edge/src/objects.h       Wed Jul 18 08:38:58 2012
+++ /branches/bleeding_edge/src/objects.h       Thu Jul 19 03:01:52 2012
@@ -2544,8 +2544,9 @@
// Append automatically sets the enumeration index. This should only be used // to add descriptors in bulk at the end, followed by sorting the descriptor
   // array.
-  inline void Append(Descriptor* desc,
-                     const WhitenessWitness&);
+  inline int Append(Descriptor* desc,
+                    const WhitenessWitness&,
+                    int number_of_set_descriptors);

   // Transfer a complete descriptor from the src descriptor array to this
   // descriptor array.
@@ -4925,6 +4926,9 @@
MUST_USE_RESULT MaybeObject* CopyNormalized(PropertyNormalizationMode mode, NormalizedMapSharingMode sharing);

+  inline void AppendDescriptor(Descriptor* desc,
+                               const DescriptorArray::WhitenessWitness&);
+
   // Returns a copy of the map, with all transitions dropped from the
   // instance descriptors.
MUST_USE_RESULT MaybeObject* Copy(DescriptorArray::SharedMode shared_mode);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to