Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index fd08c8292f812c8c3084fb699eb9f65dcc98b4a7..6881be085e73df5d23a7055e27302663d0cbc537 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -2877,6 +2877,7 @@ void Heap::CreateInitialObjects() { |
| set_observed_symbol(*factory->NewPrivateSymbol()); |
| set_stack_trace_symbol(*factory->NewPrivateSymbol()); |
| set_uninitialized_symbol(*factory->NewPrivateSymbol()); |
| + set_home_object_symbol(*factory->NewPrivateOwnSymbol()); |
| Handle<SeededNumberDictionary> slow_element_dictionary = |
| SeededNumberDictionary::New(isolate(), 0, TENURED); |
| @@ -3679,10 +3680,6 @@ AllocationResult Heap::AllocateJSObject(JSFunction* constructor, |
| AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
| - // Never used to copy functions. If functions need to be copied we |
| - // have to be careful to clear the literals array. |
| - SLOW_DCHECK(!source->IsJSFunction()); |
| - |
| // Make the clone. |
| Map* map = source->map(); |
| int object_size = map->instance_size(); |
| @@ -3756,6 +3753,29 @@ AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
| } |
| JSObject::cast(clone)->set_properties(prop, wb_mode); |
| } |
| + |
| + // Clean up literals array. |
| + if (source->IsJSFunction()) { |
|
Toon Verwaest
2014/08/18 14:15:35
Are you sure this works? What code object does thi
Dmitry Lomov (no reviews)
2014/08/19 13:47:42
You are quite right, it is easy to write a test th
|
| + SLOW_DCHECK(clone->IsJSFunction()); |
| + JSFunction* source_fun = JSFunction::cast(source); |
| + JSFunction* clone_fun = JSFunction::cast(clone); |
| + SharedFunctionInfo* info = source_fun->shared(); |
| + if (!info->bound()) { |
| + int num_literals = info->num_literals(); |
| + HeapObject* obj; |
| + { |
| + AllocationResult allocation = AllocateFixedArrayWithFiller( |
| + num_literals, NOT_TENURED, undefined_value()); |
| + if (!allocation.To(&obj)) return allocation; |
| + } |
| + FixedArray* new_literals = FixedArray::cast(obj); |
| + if (num_literals > 0) { |
| + new_literals->set(JSFunction::kLiteralNativeContextIndex, |
| + JSFunction::NativeContextFromLiterals(source_fun->literals())); |
| + } |
| + clone_fun->set_literals(new_literals); |
| + } |
| + } |
| // Return the new clone. |
| return clone; |
| } |