Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: src/heap/heap.cc

Issue 880043003: Avoid issuing write barriers for unboxed double fields in Heap::CopyJSObject(). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | test/cctest/test-unboxed-doubles.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 3875 matching lines...) Expand 10 before | Expand all | Expand 10 after
3886 // If we're forced to always allocate, we use the general allocation 3886 // If we're forced to always allocate, we use the general allocation
3887 // functions which may leave us with an object in old space. 3887 // functions which may leave us with an object in old space.
3888 if (always_allocate()) { 3888 if (always_allocate()) {
3889 { 3889 {
3890 AllocationResult allocation = 3890 AllocationResult allocation =
3891 AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE); 3891 AllocateRaw(object_size, NEW_SPACE, OLD_POINTER_SPACE);
3892 if (!allocation.To(&clone)) return allocation; 3892 if (!allocation.To(&clone)) return allocation;
3893 } 3893 }
3894 Address clone_address = clone->address(); 3894 Address clone_address = clone->address();
3895 CopyBlock(clone_address, source->address(), object_size); 3895 CopyBlock(clone_address, source->address(), object_size);
3896 // Update write barrier for all fields that lie beyond the header. 3896
3897 RecordWrites(clone_address, JSObject::kHeaderSize, 3897 // Update write barrier for all tagged fields that lie beyond the header.
3898 (object_size - JSObject::kHeaderSize) / kPointerSize); 3898 const int start_offset = JSObject::kHeaderSize;
3899 const int end_offset = object_size;
3900
3901 #if V8_DOUBLE_FIELDS_UNBOXING
3902 LayoutDescriptorHelper helper(map);
3903 bool has_only_tagged_fields = helper.all_fields_tagged();
3904
3905 if (!has_only_tagged_fields) {
3906 for (int offset = start_offset; offset < end_offset;) {
3907 int end_of_region_offset;
3908 if (helper.IsTagged(offset, end_offset, &end_of_region_offset)) {
3909 RecordWrites(clone_address, offset,
3910 (end_of_region_offset - offset) / kPointerSize);
3911 }
3912 offset = end_of_region_offset;
3913 }
3914 } else {
3915 #endif
3916 // Object has only tagged fields.
3917 RecordWrites(clone_address, start_offset,
3918 (end_offset - start_offset) / kPointerSize);
3919 #if V8_DOUBLE_FIELDS_UNBOXING
3920 }
3921 #endif
3922
3899 } else { 3923 } else {
3900 wb_mode = SKIP_WRITE_BARRIER; 3924 wb_mode = SKIP_WRITE_BARRIER;
3901 3925
3902 { 3926 {
3903 int adjusted_object_size = 3927 int adjusted_object_size =
3904 site != NULL ? object_size + AllocationMemento::kSize : object_size; 3928 site != NULL ? object_size + AllocationMemento::kSize : object_size;
3905 AllocationResult allocation = 3929 AllocationResult allocation =
3906 AllocateRaw(adjusted_object_size, NEW_SPACE, NEW_SPACE); 3930 AllocateRaw(adjusted_object_size, NEW_SPACE, NEW_SPACE);
3907 if (!allocation.To(&clone)) return allocation; 3931 if (!allocation.To(&clone)) return allocation;
3908 } 3932 }
(...skipping 2541 matching lines...) Expand 10 before | Expand all | Expand 10 after
6450 static_cast<int>(object_sizes_last_time_[index])); 6474 static_cast<int>(object_sizes_last_time_[index]));
6451 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6475 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6452 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6476 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6453 6477
6454 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6478 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6455 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6479 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6456 ClearObjectStats(); 6480 ClearObjectStats();
6457 } 6481 }
6458 } 6482 }
6459 } // namespace v8::internal 6483 } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-unboxed-doubles.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698