| 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.
|
| + 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));
|
|
|