Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 42e3e6993b1bdcc5b5d8fc1b9711f11912a936e1..6051447bcdf5e4dce001a0947c79d48890abf592 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -769,16 +769,17 @@ Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
Handle<String> name = Handle<String>(heap()->empty_string()); |
Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( |
Builtins::kIllegal)); |
- js_global_object_function = factory()->NewFunction( |
- name, code, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize); |
- // Change the constructor property of the prototype of the |
- // hidden global function to refer to the Object function. |
Handle<JSObject> prototype = |
- Handle<JSObject>( |
- JSObject::cast(js_global_object_function->instance_prototype())); |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- prototype, factory()->constructor_string(), |
- isolate()->object_function(), NONE).Check(); |
+ factory()->NewFunctionPrototype(isolate()->object_function()); |
+ js_global_object_function = factory()->NewFunction( |
+ name, code, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize); |
+#ifdef DEBUG |
+ LookupIterator it(prototype, factory()->constructor_string(), |
+ LookupIterator::CHECK_OWN_REAL); |
+ Handle<Object> value = JSReceiver::GetProperty(&it).ToHandleChecked(); |
+ ASSERT(it.IsFound()); |
+ ASSERT_EQ(*isolate()->object_function(), *value); |
+#endif |
} else { |
Handle<FunctionTemplateInfo> js_global_object_constructor( |
FunctionTemplateInfo::cast(js_global_object_template->constructor())); |
@@ -1133,80 +1134,57 @@ 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); |
-#ifdef DEBUG |
- 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()); |
-#endif |
+ 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); |
+ |
+ ASSERT(map->inobject_properties() > Heap::kArgumentsCalleeIndex); |
+ ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
+ ASSERT(!map->is_dictionary_map()); |
+ ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
} |
- { // --- 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 +1207,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,29 +1227,13 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
// Copy constructor from the sloppy arguments boilerplate. |
map->set_constructor( |
- native_context()->sloppy_arguments_boilerplate()->map()->constructor()); |
- |
- // Allocate the arguments boilerplate object. |
- Handle<JSObject> result = factory->NewJSObjectFromMap(map); |
- native_context()->set_strict_arguments_boilerplate(*result); |
- |
-#ifdef DEBUG |
- LookupResult lookup(isolate); |
- result->LookupOwn(factory->length_string(), &lookup); |
- ASSERT(lookup.IsField()); |
- ASSERT(lookup.GetFieldIndex().property_index() == |
- Heap::kArgumentsLengthIndex); |
+ native_context()->sloppy_arguments_map()->constructor()); |
- Handle<Object> length_value = Object::GetProperty( |
- result, factory->length_string()).ToHandleChecked(); |
- ASSERT_EQ(heap->undefined_value(), *length_value); |
+ native_context()->set_strict_arguments_map(*map); |
- ASSERT(result->map()->inobject_properties() > Heap::kArgumentsLengthIndex); |
- |
- // Check the state of the object. |
- ASSERT(result->HasFastProperties()); |
- ASSERT(result->HasFastObjectElements()); |
-#endif |
+ ASSERT(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
+ ASSERT(!map->is_dictionary_map()); |
+ ASSERT(IsFastObjectElementsKind(map->elements_kind())); |
} |
{ // --- context extension |
@@ -2192,33 +2150,27 @@ bool Bootstrapper::InstallExtensions(Handle<Context> native_context, |
bool Genesis::InstallSpecialObjects(Handle<Context> native_context) { |
Isolate* isolate = native_context->GetIsolate(); |
+ // Don't install extensions into the snapshot. |
+ if (isolate->serializer_enabled()) return true; |
+ |
Factory* factory = isolate->factory(); |
HandleScope scope(isolate); |
Handle<JSGlobalObject> global(JSGlobalObject::cast( |
native_context->global_object())); |
+ |
+ Handle<JSObject> Error = Handle<JSObject>::cast( |
+ Object::GetProperty(isolate, global, "Error").ToHandleChecked()); |
+ Handle<String> name = |
+ factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("stackTraceLimit")); |
+ Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate); |
+ JSObject::AddProperty(Error, name, stack_trace_limit, NONE); |
+ |
// Expose the natives in global if a name for it is specified. |
if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { |
Handle<String> natives = |
factory->InternalizeUtf8String(FLAG_expose_natives_as); |
- RETURN_ON_EXCEPTION_VALUE( |
- isolate, |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- global, natives, Handle<JSObject>(global->builtins()), DONT_ENUM), |
- false); |
- } |
- |
- Handle<Object> Error = Object::GetProperty( |
- isolate, global, "Error").ToHandleChecked(); |
- if (Error->IsJSObject()) { |
- Handle<String> name = factory->InternalizeOneByteString( |
- STATIC_ASCII_VECTOR("stackTraceLimit")); |
- Handle<Smi> stack_trace_limit( |
- Smi::FromInt(FLAG_stack_trace_limit), isolate); |
- RETURN_ON_EXCEPTION_VALUE( |
- isolate, |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- Handle<JSObject>::cast(Error), name, stack_trace_limit, NONE), |
- false); |
+ JSObject::AddProperty(global, natives, handle(global->builtins()), |
+ DONT_ENUM); |
} |
// Expose the stack trace symbol to native JS. |
@@ -2246,11 +2198,7 @@ bool Genesis::InstallSpecialObjects(Handle<Context> native_context) { |
Handle<String> debug_string = |
factory->InternalizeUtf8String(FLAG_expose_debug_as); |
Handle<Object> global_proxy(debug_context->global_proxy(), isolate); |
- RETURN_ON_EXCEPTION_VALUE( |
- isolate, |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- global, debug_string, global_proxy, DONT_ENUM), |
- false); |
+ JSObject::AddProperty(global, debug_string, global_proxy, DONT_ENUM); |
} |
return true; |
} |