Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index da8db2c45260e111710bb2a929447102457bebb1..8501cc39696f42335a200a4a91d8e75c9445e380 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -391,26 +391,27 @@ void Genesis::SetFunctionInstanceDescriptor( |
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 @@ void Genesis::SetFunctionInstanceDescriptor( |
} |
Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); |
CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); |
- descriptors->Append(&d, witness); |
+ map->AppendDescriptor(&d, witness); |
} |
- |
- map->set_instance_descriptors(*descriptors); |
} |
@@ -530,26 +529,27 @@ void Genesis::SetStrictFunctionInstanceDescriptor( |
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 @@ void Genesis::SetStrictFunctionInstanceDescriptor( |
} |
Handle<Foreign> f(factory()->NewForeign(&Accessors::FunctionPrototype)); |
CallbacksDescriptor d(*factory()->prototype_symbol(), *f, attribs); |
- descriptors->Append(&d, witness); |
+ map->AppendDescriptor(&d, witness); |
} |
- |
- map->set_instance_descriptors(*descriptors); |
} |
@@ -870,11 +868,12 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
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 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
// 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 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
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); |
+ string_map->AppendDescriptor(&d, witness); |
} |
- |
- Handle<Map> string_map = |
- Handle<Map>(global_context()->string_function()->initial_map()); |
- string_map->set_instance_descriptors(*string_descriptors); |
} |
{ // --- D a t e --- |
@@ -951,37 +948,39 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
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 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
FieldDescriptor field(heap->last_index_symbol(), |
JSRegExp::kLastIndexFieldIndex, |
writable); |
- descriptors->Append(&field, witness); |
+ initial_map->AppendDescriptor(&field, witness); |
} |
- initial_map->set_instance_descriptors(*descriptors); |
initial_map->set_inobject_properties(5); |
initial_map->set_pre_allocated_property_fields(5); |
@@ -1138,23 +1136,24 @@ bool Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
// 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->AppendDescriptor(&d, witness); |
} |
- map->set_instance_descriptors(*descriptors); |
map->set_function_with_prototype(true); |
map->set_prototype(global_context()->object_function()->prototype()); |
@@ -1483,54 +1482,55 @@ bool Genesis::InstallNatives() { |
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 @@ bool Genesis::InstallNatives() { |
&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 @@ bool Genesis::InstallNatives() { |
&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 @@ bool Genesis::InstallNatives() { |
*factory()->LookupAsciiSymbol("eval_from_script_position"), |
*f, |
attribs); |
- script_descriptors->Append(&d, witness); |
+ script_map->AppendDescriptor(&d, witness); |
} |
{ |
@@ -1580,11 +1580,9 @@ bool Genesis::InstallNatives() { |
*factory()->LookupAsciiSymbol("eval_from_function_name"), |
*f, |
attribs); |
- script_descriptors->Append(&d, witness); |
+ script_map->AppendDescriptor(&d, witness); |
} |
- script_map->set_instance_descriptors(*script_descriptors); |
- |
// Allocate the empty script. |
Handle<Script> script = factory()->NewScript(factory()->empty_string()); |
script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
@@ -1645,15 +1643,14 @@ bool Genesis::InstallNatives() { |
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->initial_map()->set_instance_descriptors(*array_descriptors); |
- |
global_context()->set_internal_array_function(*array_function); |
} |
@@ -1741,29 +1738,33 @@ bool Genesis::InstallNatives() { |
Handle<DescriptorArray> reresult_descriptors = |
factory()->NewDescriptorArray(3); |
DescriptorArray::WhitenessWitness witness(*reresult_descriptors); |
+ initial_map->set_instance_descriptors(*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); |
- |
+ { |
+ 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->AppendDescriptor(&input_field, witness); |
} |
- initial_map->set_instance_descriptors(*reresult_descriptors); |
initial_map->set_inobject_properties(2); |
initial_map->set_pre_allocated_property_fields(2); |