Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/base/once.h" | 9 #include "src/base/once.h" |
| 10 #include "src/base/utils/random-number-generator.h" | 10 #include "src/base/utils/random-number-generator.h" |
| (...skipping 2859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2870 | 2870 |
| 2871 set_detailed_stack_trace_symbol(*factory->NewPrivateSymbol()); | 2871 set_detailed_stack_trace_symbol(*factory->NewPrivateSymbol()); |
| 2872 set_elements_transition_symbol(*factory->NewPrivateSymbol()); | 2872 set_elements_transition_symbol(*factory->NewPrivateSymbol()); |
| 2873 set_frozen_symbol(*factory->NewPrivateSymbol()); | 2873 set_frozen_symbol(*factory->NewPrivateSymbol()); |
| 2874 set_megamorphic_symbol(*factory->NewPrivateSymbol()); | 2874 set_megamorphic_symbol(*factory->NewPrivateSymbol()); |
| 2875 set_nonexistent_symbol(*factory->NewPrivateSymbol()); | 2875 set_nonexistent_symbol(*factory->NewPrivateSymbol()); |
| 2876 set_normal_ic_symbol(*factory->NewPrivateSymbol()); | 2876 set_normal_ic_symbol(*factory->NewPrivateSymbol()); |
| 2877 set_observed_symbol(*factory->NewPrivateSymbol()); | 2877 set_observed_symbol(*factory->NewPrivateSymbol()); |
| 2878 set_stack_trace_symbol(*factory->NewPrivateSymbol()); | 2878 set_stack_trace_symbol(*factory->NewPrivateSymbol()); |
| 2879 set_uninitialized_symbol(*factory->NewPrivateSymbol()); | 2879 set_uninitialized_symbol(*factory->NewPrivateSymbol()); |
| 2880 set_home_object_symbol(*factory->NewPrivateOwnSymbol()); | |
| 2880 | 2881 |
| 2881 Handle<SeededNumberDictionary> slow_element_dictionary = | 2882 Handle<SeededNumberDictionary> slow_element_dictionary = |
| 2882 SeededNumberDictionary::New(isolate(), 0, TENURED); | 2883 SeededNumberDictionary::New(isolate(), 0, TENURED); |
| 2883 slow_element_dictionary->set_requires_slow_elements(); | 2884 slow_element_dictionary->set_requires_slow_elements(); |
| 2884 set_empty_slow_element_dictionary(*slow_element_dictionary); | 2885 set_empty_slow_element_dictionary(*slow_element_dictionary); |
| 2885 | 2886 |
| 2886 set_materialized_objects(*factory->NewFixedArray(0, TENURED)); | 2887 set_materialized_objects(*factory->NewFixedArray(0, TENURED)); |
| 2887 | 2888 |
| 2888 // Handling of script id generation is in Factory::NewScript. | 2889 // Handling of script id generation is in Factory::NewScript. |
| 2889 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId)); | 2890 set_last_script_id(Smi::FromInt(v8::UnboundScript::kNoScriptId)); |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3672 #ifdef DEBUG | 3673 #ifdef DEBUG |
| 3673 // Make sure result is NOT a global object if valid. | 3674 // Make sure result is NOT a global object if valid. |
| 3674 HeapObject* obj; | 3675 HeapObject* obj; |
| 3675 DCHECK(!allocation.To(&obj) || !obj->IsGlobalObject()); | 3676 DCHECK(!allocation.To(&obj) || !obj->IsGlobalObject()); |
| 3676 #endif | 3677 #endif |
| 3677 return allocation; | 3678 return allocation; |
| 3678 } | 3679 } |
| 3679 | 3680 |
| 3680 | 3681 |
| 3681 AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { | 3682 AllocationResult Heap::CopyJSObject(JSObject* source, AllocationSite* site) { |
| 3682 // Never used to copy functions. If functions need to be copied we | |
| 3683 // have to be careful to clear the literals array. | |
| 3684 SLOW_DCHECK(!source->IsJSFunction()); | |
| 3685 | |
| 3686 // Make the clone. | 3683 // Make the clone. |
| 3687 Map* map = source->map(); | 3684 Map* map = source->map(); |
| 3688 int object_size = map->instance_size(); | 3685 int object_size = map->instance_size(); |
| 3689 HeapObject* clone; | 3686 HeapObject* clone; |
| 3690 | 3687 |
| 3691 DCHECK(site == NULL || AllocationSite::CanTrack(map->instance_type())); | 3688 DCHECK(site == NULL || AllocationSite::CanTrack(map->instance_type())); |
| 3692 | 3689 |
| 3693 WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER; | 3690 WriteBarrierMode wb_mode = UPDATE_WRITE_BARRIER; |
| 3694 | 3691 |
| 3695 // If we're forced to always allocate, we use the general allocation | 3692 // If we're forced to always allocate, we use the general allocation |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3749 } | 3746 } |
| 3750 // Update properties if necessary. | 3747 // Update properties if necessary. |
| 3751 if (properties->length() > 0) { | 3748 if (properties->length() > 0) { |
| 3752 FixedArray* prop; | 3749 FixedArray* prop; |
| 3753 { | 3750 { |
| 3754 AllocationResult allocation = CopyFixedArray(properties); | 3751 AllocationResult allocation = CopyFixedArray(properties); |
| 3755 if (!allocation.To(&prop)) return allocation; | 3752 if (!allocation.To(&prop)) return allocation; |
| 3756 } | 3753 } |
| 3757 JSObject::cast(clone)->set_properties(prop, wb_mode); | 3754 JSObject::cast(clone)->set_properties(prop, wb_mode); |
| 3758 } | 3755 } |
| 3756 | |
| 3757 // Clean up literals array. | |
| 3758 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
| |
| 3759 SLOW_DCHECK(clone->IsJSFunction()); | |
| 3760 JSFunction* source_fun = JSFunction::cast(source); | |
| 3761 JSFunction* clone_fun = JSFunction::cast(clone); | |
| 3762 SharedFunctionInfo* info = source_fun->shared(); | |
| 3763 if (!info->bound()) { | |
| 3764 int num_literals = info->num_literals(); | |
| 3765 HeapObject* obj; | |
| 3766 { | |
| 3767 AllocationResult allocation = AllocateFixedArrayWithFiller( | |
| 3768 num_literals, NOT_TENURED, undefined_value()); | |
| 3769 if (!allocation.To(&obj)) return allocation; | |
| 3770 } | |
| 3771 FixedArray* new_literals = FixedArray::cast(obj); | |
| 3772 if (num_literals > 0) { | |
| 3773 new_literals->set(JSFunction::kLiteralNativeContextIndex, | |
| 3774 JSFunction::NativeContextFromLiterals(source_fun->literals())); | |
| 3775 } | |
| 3776 clone_fun->set_literals(new_literals); | |
| 3777 } | |
| 3778 } | |
| 3759 // Return the new clone. | 3779 // Return the new clone. |
| 3760 return clone; | 3780 return clone; |
| 3761 } | 3781 } |
| 3762 | 3782 |
| 3763 | 3783 |
| 3764 static inline void WriteOneByteData(Vector<const char> vector, uint8_t* chars, | 3784 static inline void WriteOneByteData(Vector<const char> vector, uint8_t* chars, |
| 3765 int len) { | 3785 int len) { |
| 3766 // Only works for ascii. | 3786 // Only works for ascii. |
| 3767 DCHECK(vector.length() == len); | 3787 DCHECK(vector.length() == len); |
| 3768 MemCopy(chars, vector.start(), len); | 3788 MemCopy(chars, vector.start(), len); |
| (...skipping 2374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6143 static_cast<int>(object_sizes_last_time_[index])); | 6163 static_cast<int>(object_sizes_last_time_[index])); |
| 6144 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6164 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 6145 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6165 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 6146 | 6166 |
| 6147 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6167 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 6148 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6168 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 6149 ClearObjectStats(); | 6169 ClearObjectStats(); |
| 6150 } | 6170 } |
| 6151 } | 6171 } |
| 6152 } // namespace v8::internal | 6172 } // namespace v8::internal |
| OLD | NEW |