Chromium Code Reviews| Index: src/bootstrapper.cc |
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
| index 72ca6bfdc53303bf860b7a2c060eda4a8e74bc0b..735d0992d7eeab142a438eb1eec93c58220edf41 100644 |
| --- a/src/bootstrapper.cc |
| +++ b/src/bootstrapper.cc |
| @@ -1133,80 +1133,59 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
| InstallFunction(global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, |
| isolate->initial_object_prototype(), Builtins::kIllegal); |
| - { // --- arguments_boilerplate_ |
| + { // --- sloppy arguments map |
| // Make sure we can recognize argument objects at runtime. |
| // This is done by introducing an anonymous function with |
| // class_name equals 'Arguments'. |
| Handle<String> arguments_string = factory->InternalizeOneByteString( |
| STATIC_ASCII_VECTOR("Arguments")); |
| Handle<Code> code(isolate->builtins()->builtin(Builtins::kIllegal)); |
| - |
| Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( |
| arguments_string, code); |
| - ASSERT(!function->has_initial_map()); |
| function->shared()->set_instance_class_name(*arguments_string); |
| - function->shared()->set_expected_nof_properties(2); |
| - function->set_prototype_or_initial_map( |
| - native_context()->object_function()->prototype()); |
| - Handle<JSObject> result = factory->NewJSObject(function); |
| - |
| - native_context()->set_sloppy_arguments_boilerplate(*result); |
| - // Note: length must be added as the first property and |
| - // callee must be added as the second property. |
| - JSObject::AddProperty( |
| - result, factory->length_string(), |
| - factory->undefined_value(), DONT_ENUM, |
| - Object::FORCE_TAGGED, FORCE_FIELD); |
| - JSObject::AddProperty( |
| - result, factory->callee_string(), |
| - factory->undefined_value(), DONT_ENUM, |
| - Object::FORCE_TAGGED, FORCE_FIELD); |
| + |
| + Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, |
| + Heap::kSloppyArgumentsObjectSize); |
| + // Create the descriptor array for the arguments object. |
| + Map::EnsureDescriptorSlack(map, 2); |
| + |
| + { // length |
| + FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, |
| + DONT_ENUM, Representation::Tagged()); |
| + map->AppendDescriptor(&d); |
| + } |
| + { // callee |
| + FieldDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, |
| + DONT_ENUM, Representation::Tagged()); |
| + map->AppendDescriptor(&d); |
| + } |
| + |
| + map->set_function_with_prototype(true); |
| + map->set_prototype(native_context()->object_function()->prototype()); |
| + map->set_pre_allocated_property_fields(2); |
| + map->set_inobject_properties(2); |
| + native_context()->set_sloppy_arguments_map(*map); |
| + |
| + ASSERT(!function->has_initial_map()); |
| + function->set_initial_map(*map); |
| + map->set_constructor(*function); |
| #ifdef DEBUG |
|
Igor Sheludko
2014/07/02 14:17:14
Probably we don't need #ifdef DEBUG anymore
|
| - LookupResult lookup(isolate); |
| - result->LookupOwn(factory->callee_string(), &lookup); |
| - ASSERT(lookup.IsField()); |
| - ASSERT(lookup.GetFieldIndex().property_index() == |
| - Heap::kArgumentsCalleeIndex); |
| - |
| - result->LookupOwn(factory->length_string(), &lookup); |
| - ASSERT(lookup.IsField()); |
| - ASSERT(lookup.GetFieldIndex().property_index() == |
| - Heap::kArgumentsLengthIndex); |
| - |
| - ASSERT(result->map()->inobject_properties() > Heap::kArgumentsCalleeIndex); |
| - ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); |
| - |
| - // Check the state of the object. |
| - ASSERT(result->HasFastProperties()); |
| - ASSERT(result->HasFastObjectElements()); |
| + ASSERT(map->inobject_properties() > Heap::kArgumentsCalleeIndex); |
| + ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
| + ASSERT(!map->is_dictionary_map()); |
| + ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
| #endif |
| } |
| - { // --- aliased_arguments_boilerplate_ |
| - // Set up a well-formed parameter map to make assertions happy. |
| - Handle<FixedArray> elements = factory->NewFixedArray(2); |
| - elements->set_map(heap->sloppy_arguments_elements_map()); |
| - Handle<FixedArray> array; |
| - array = factory->NewFixedArray(0); |
| - elements->set(0, *array); |
| - array = factory->NewFixedArray(0); |
| - elements->set(1, *array); |
| - |
| - Handle<Map> old_map( |
| - native_context()->sloppy_arguments_boilerplate()->map()); |
| - Handle<Map> new_map = Map::Copy(old_map); |
| - new_map->set_pre_allocated_property_fields(2); |
| - Handle<JSObject> result = factory->NewJSObjectFromMap(new_map); |
| - // Set elements kind after allocating the object because |
| - // NewJSObjectFromMap assumes a fast elements map. |
| - new_map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); |
| - result->set_elements(*elements); |
| - ASSERT(result->HasSloppyArgumentsElements()); |
| - native_context()->set_aliased_arguments_boilerplate(*result); |
| - } |
| - |
| - { // --- strict mode arguments boilerplate |
| + { // --- aliased arguments map |
| + Handle<Map> map = Map::Copy(isolate->sloppy_arguments_map()); |
| + map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); |
| + ASSERT_EQ(2, map->pre_allocated_property_fields()); |
| + native_context()->set_aliased_arguments_map(*map); |
| + } |
| + |
| + { // --- strict mode arguments map |
| const PropertyAttributes attributes = |
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| @@ -1229,20 +1208,16 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
| Map::EnsureDescriptorSlack(map, 3); |
| { // length |
| - FieldDescriptor d( |
| - factory->length_string(), 0, DONT_ENUM, Representation::Tagged()); |
| + FieldDescriptor d(factory->length_string(), Heap::kArgumentsLengthIndex, |
| + DONT_ENUM, Representation::Tagged()); |
| map->AppendDescriptor(&d); |
| } |
| { // callee |
| - CallbacksDescriptor d(factory->callee_string(), |
| - callee, |
| - attributes); |
| + CallbacksDescriptor d(factory->callee_string(), callee, attributes); |
| map->AppendDescriptor(&d); |
| } |
| { // caller |
| - CallbacksDescriptor d(factory->caller_string(), |
| - caller, |
| - attributes); |
| + CallbacksDescriptor d(factory->caller_string(), caller, attributes); |
| map->AppendDescriptor(&d); |
| } |
| @@ -1253,28 +1228,14 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
| // Copy constructor from the sloppy arguments boilerplate. |
| map->set_constructor( |
| - native_context()->sloppy_arguments_boilerplate()->map()->constructor()); |
| + native_context()->sloppy_arguments_map()->constructor()); |
| - // Allocate the arguments boilerplate object. |
| - Handle<JSObject> result = factory->NewJSObjectFromMap(map); |
| - native_context()->set_strict_arguments_boilerplate(*result); |
| + native_context()->set_strict_arguments_map(*map); |
| #ifdef DEBUG |
|
Igor Sheludko
2014/07/02 14:17:14
Same here.
|
| - LookupResult lookup(isolate); |
| - result->LookupOwn(factory->length_string(), &lookup); |
| - ASSERT(lookup.IsField()); |
| - ASSERT(lookup.GetFieldIndex().property_index() == |
| - Heap::kArgumentsLengthIndex); |
| - |
| - Handle<Object> length_value = Object::GetProperty( |
| - result, factory->length_string()).ToHandleChecked(); |
| - ASSERT_EQ(heap->undefined_value(), *length_value); |
| - |
| - ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); |
| - |
| - // Check the state of the object. |
| - ASSERT(result->HasFastProperties()); |
| - ASSERT(result->HasFastObjectElements()); |
| + ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
| + ASSERT(!map->is_dictionary_map()); |
| + ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
| #endif |
| } |