Chromium Code Reviews| Index: src/bootstrapper.cc |
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
| index 246428680ef8eee5676376b1d03c49127fb0a833..6d1b08808bab4cebb50452a95a9492cce3d208da 100644 |
| --- a/src/bootstrapper.cc |
| +++ b/src/bootstrapper.cc |
| @@ -994,12 +994,12 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
| Handle<JSObject> result = Factory::NewJSObject(function); |
| global_context()->set_arguments_boilerplate(*result); |
| - // Note: callee must be added as the first property and |
| - // length must be added as the second property. |
| - SetLocalPropertyNoThrow(result, Factory::callee_symbol(), |
| + // Note: length must be added as the first property and |
| + // callee must be added as the second property. |
|
Lasse Reichstein
2011/03/15 09:58:40
These are swapped because length is the only one r
Martin Maly
2011/03/16 01:21:24
Yes. We always have length, calee is only on non-s
|
| + SetLocalPropertyNoThrow(result, Factory::length_symbol(), |
| Factory::undefined_value(), |
| DONT_ENUM); |
| - SetLocalPropertyNoThrow(result, Factory::length_symbol(), |
| + SetLocalPropertyNoThrow(result, Factory::callee_symbol(), |
| Factory::undefined_value(), |
| DONT_ENUM); |
| @@ -1022,6 +1022,68 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
| #endif |
| } |
| + { // --- strict mode arguments boilerplate |
| + const PropertyAttributes attributes = |
| + static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| + |
| + // 1. Create the poison pills. |
| + Handle<FixedArray> callee = Factory::NewFixedArray(2, TENURED); |
| + Handle<FixedArray> caller = Factory::NewFixedArray(2, TENURED); |
| + CreateThrowTypeErrorCallbacks(callee, Builtins::StrictArgumentsCallee); |
| + CreateThrowTypeErrorCallbacks(caller, Builtins::StrictArgumentsCaller); |
| + |
| + // 2. Create the descriptor array for the arguments object. |
| + Handle<DescriptorArray> descriptors = Factory::NewDescriptorArray(3); |
| + { // length |
| + FieldDescriptor d(*Factory::length_symbol(), 0, DONT_ENUM); |
| + descriptors->Set(0, &d); |
| + } |
| + { // callee |
| + CallbacksDescriptor d(*Factory::callee_symbol(), *callee, attributes); |
| + descriptors->Set(1, &d); |
| + } |
| + { // caller |
| + CallbacksDescriptor d(*Factory::caller_symbol(), *caller, attributes); |
| + descriptors->Set(2, &d); |
| + } |
| + descriptors->Sort(); |
| + |
| + // 3. Create the map. Allocate one in-object field for length. |
| + Handle<Map> map = Factory::NewMap(JS_OBJECT_TYPE, |
| + Heap::kArgumentsObjectSizeStrict); |
| + map->set_instance_descriptors(*descriptors); |
| + map->set_function_with_prototype(true); |
| + map->set_prototype(global_context()->object_function()->prototype()); |
| + map->set_pre_allocated_property_fields(1); |
| + map->set_inobject_properties(1); |
| + |
| + // 4. Copy constructor from the non-strict arguments boilerplate. |
| + map->set_constructor( |
| + global_context()->arguments_boilerplate()->map()->constructor()); |
| + |
| + // 5. Allocate the arguments boilerplate object. |
| + Handle<JSObject> result = Factory::NewJSObjectFromMap(map); |
| + global_context()->set_arguments_boilerplate_strict(*result); |
| + |
| + // 6. Add length property only for strict mode boilerplate. |
| + SetLocalPropertyNoThrow(result, Factory::length_symbol(), |
| + Factory::undefined_value(), |
| + DONT_ENUM); |
| + |
| +#ifdef DEBUG |
| + LookupResult lookup; |
| + result->LocalLookup(Heap::length_symbol(), &lookup); |
| + ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); |
| + ASSERT(lookup.GetFieldIndex() == Heap::arguments_length_index); |
| + |
| + ASSERT(result->map()->inobject_properties() > Heap::arguments_length_index); |
| + |
| + // Check the state of the object. |
| + ASSERT(result->HasFastProperties()); |
| + ASSERT(result->HasFastElements()); |
| +#endif |
| + } |
| + |
| { // --- context extension |
| // Create a function for the context extension objects. |
| Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal)); |