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