Index: src/builtins/builtins-constructor.cc |
diff --git a/src/builtins/builtins-constructor.cc b/src/builtins/builtins-constructor.cc |
index 0d303c90c156b3dad8c11e8dc70469bfe49ea05a..ae6dd2d6e1ce51df9905e66b162430705fef092b 100644 |
--- a/src/builtins/builtins-constructor.cc |
+++ b/src/builtins/builtins-constructor.cc |
@@ -714,7 +714,6 @@ Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( |
offset.Bind(IntPtrAdd(offset.value(), IntPtrConstant(kPointerSize))); |
GotoIfNot(IntPtrGreaterThanOrEqual(offset.value(), end_offset), &loop_body); |
} |
- |
if (FLAG_allocation_site_pretenuring) { |
Node* memento = InnerAllocate(copy, object_size); |
StoreMapNoWriteBarrier(memento, Heap::kAllocationMementoMapRootIndex); |
@@ -729,6 +728,24 @@ Node* ConstructorBuiltinsAssembler::EmitFastCloneShallowObject( |
memento_create_count); |
} |
+ // Directly copy over the property store for dict-mode boilerplates. |
+ Label dict_properties(this), done(this); |
+ Branch(IsDictionaryMap(boilerplate_map), &dict_properties, &done); |
+ Bind(&dict_properties); |
+ { |
+ Comment("Copy boilderplate property dict"); |
+ Node* boilerplate_properties = LoadProperties(boilerplate); |
+ // TODO(cbruni): Use inner allocate for name dictionary |
+ Node* properties = AllocateNameDictionary( |
+ SmiUntag(GetCapacity<NameDictionary>(boilerplate_properties))); |
+ CopyFixedArrayElements(FAST_ELEMENTS, boilerplate_properties, properties, |
+ LoadFixedArrayBaseLength(boilerplate_properties), |
+ SKIP_WRITE_BARRIER, SMI_PARAMETERS); |
Toon Verwaest
2017/03/14 13:27:47
With black allocation I'm not sure this is safe if
Camillo Bruni
2017/03/17 16:40:55
Adding separate helper to make the contract cleare
|
+ StoreObjectField(copy, JSObject::kPropertiesOffset, properties); |
+ Goto(&done); |
+ } |
+ Bind(&done); |
+ |
// TODO(verwaest): Allocate and fill in double boxes. |
return copy; |
} |