Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 4d2bf955f48f4692aecdcb004e6c71feab100940..361960dc22f6d7c7dbf432022bf3cfe016af089b 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -480,7 +480,8 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
Handle<JSFunction> object_fun = factory->NewFunction(object_name); |
Handle<Map> object_function_map = |
factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
- JSFunction::SetInitialMap(object_fun, object_function_map); |
+ JSFunction::SetInitialMap(object_fun, object_function_map, |
+ isolate->factory()->null_value()); |
object_function_map->set_unused_property_fields( |
JSObject::kInitialGlobalObjectUnusedPropertiesCount); |
@@ -490,6 +491,9 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
Handle<JSObject> prototype = factory->NewJSObject( |
isolate->object_function(), |
TENURED); |
+ Handle<Map> map = Map::Copy(handle(prototype->map())); |
+ map->set_is_prototype_map(true); |
+ prototype->set_map(*map); |
native_context()->set_initial_object_prototype(*prototype); |
// For bootstrapping set the array prototype to be the same as the object |
@@ -507,6 +511,15 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
Handle<JSFunction> empty_function = factory->NewFunctionWithoutPrototype( |
empty_string, code); |
+ // Allocate the function map first and then patch the prototype later |
+ Handle<Map> empty_function_map = |
+ CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
+ DCHECK(!empty_function_map->is_dictionary_map()); |
+ empty_function_map->set_prototype( |
+ native_context()->object_function()->prototype()); |
+ empty_function_map->set_is_prototype_map(true); |
+ empty_function->set_map(*empty_function_map); |
+ |
// --- E m p t y --- |
Handle<String> source = factory->NewStringFromStaticAscii("() {}"); |
Handle<Script> script = factory->NewScript(source); |
@@ -521,13 +534,6 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
native_context()->sloppy_function_without_prototype_map()-> |
set_prototype(*empty_function); |
sloppy_function_map_writable_prototype_->set_prototype(*empty_function); |
- |
- // Allocate the function map first and then patch the prototype later |
- Handle<Map> empty_function_map = |
- CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
- empty_function_map->set_prototype( |
- native_context()->object_function()->prototype()); |
- empty_function->set_map(*empty_function_map); |
return empty_function; |
} |
@@ -1082,6 +1088,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, |
Smi::FromInt(0), |
SKIP_WRITE_BARRIER); // It's a Smi. |
+ proto_map->set_is_prototype_map(true); |
initial_map->set_prototype(*proto); |
factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), |
JSRegExp::IRREGEXP, factory->empty_string(), |
@@ -1204,13 +1211,13 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> global_object, |
} |
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); |
DCHECK(!function->has_initial_map()); |
- JSFunction::SetInitialMap(function, map); |
+ JSFunction::SetInitialMap(function, map, |
+ isolate->initial_object_prototype()); |
DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); |
DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
@@ -1334,7 +1341,8 @@ void Genesis::InstallTypedArray( |
JS_TYPED_ARRAY_TYPE, |
JSTypedArray::kSizeWithInternalFields, |
elements_kind); |
- JSFunction::SetInitialMap(result, initial_map); |
+ JSFunction::SetInitialMap(result, initial_map, |
+ handle(initial_map->prototype(), isolate())); |
*fun = result; |
ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); |
@@ -1652,7 +1660,7 @@ Handle<JSFunction> Genesis::InstallInternalArray( |
Handle<Map> original_map(array_function->initial_map()); |
Handle<Map> initial_map = Map::Copy(original_map); |
initial_map->set_elements_kind(elements_kind); |
- JSFunction::SetInitialMap(array_function, initial_map); |
+ JSFunction::SetInitialMap(array_function, initial_map, prototype); |
// Make "length" magic on instances. |
Map::EnsureDescriptorSlack(initial_map, 1); |