Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1696 Object* value, | 1696 Object* value, |
| 1697 WriteBarrierMode mode) { | 1697 WriteBarrierMode mode) { |
| 1698 ASSERT(map() != HEAP->fixed_cow_array_map()); | 1698 ASSERT(map() != HEAP->fixed_cow_array_map()); |
| 1699 ASSERT(index >= 0 && index < this->length()); | 1699 ASSERT(index >= 0 && index < this->length()); |
| 1700 int offset = kHeaderSize + index * kPointerSize; | 1700 int offset = kHeaderSize + index * kPointerSize; |
| 1701 WRITE_FIELD(this, offset, value); | 1701 WRITE_FIELD(this, offset, value); |
| 1702 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); | 1702 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); |
| 1703 } | 1703 } |
| 1704 | 1704 |
| 1705 | 1705 |
| 1706 void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array, | |
| 1707 int index, | |
| 1708 Object* value) { | |
| 1709 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map()); | |
| 1710 ASSERT(index >= 0 && index < array->length()); | |
| 1711 int offset = kHeaderSize + index * kPointerSize; | |
| 1712 WRITE_FIELD(array, offset, value); | |
| 1713 if (array->GetHeap()->InNewSpace(value)) { | |
|
Vyacheslav Egorov (Chromium)
2011/12/02 12:44:42
Get heap once and cache it locally.
fschneider
2011/12/02 13:51:19
Done.
| |
| 1714 array->GetHeap()->RecordWrite(array->address(), offset); | |
| 1715 } | |
| 1716 } | |
| 1717 | |
| 1718 | |
| 1706 void FixedArray::NoWriteBarrierSet(FixedArray* array, | 1719 void FixedArray::NoWriteBarrierSet(FixedArray* array, |
| 1707 int index, | 1720 int index, |
| 1708 Object* value) { | 1721 Object* value) { |
| 1709 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map()); | 1722 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map()); |
| 1710 ASSERT(index >= 0 && index < array->length()); | 1723 ASSERT(index >= 0 && index < array->length()); |
| 1711 ASSERT(!HEAP->InNewSpace(value)); | 1724 ASSERT(!HEAP->InNewSpace(value)); |
| 1712 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); | 1725 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); |
| 1713 } | 1726 } |
| 1714 | 1727 |
| 1715 | 1728 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1790 Object* storage = READ_FIELD(this, kBitField3StorageOffset); | 1803 Object* storage = READ_FIELD(this, kBitField3StorageOffset); |
| 1791 return Smi::cast(storage)->value(); | 1804 return Smi::cast(storage)->value(); |
| 1792 } | 1805 } |
| 1793 | 1806 |
| 1794 void DescriptorArray::set_bit_field3_storage(int value) { | 1807 void DescriptorArray::set_bit_field3_storage(int value) { |
| 1795 ASSERT(!IsEmpty()); | 1808 ASSERT(!IsEmpty()); |
| 1796 WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value)); | 1809 WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value)); |
| 1797 } | 1810 } |
| 1798 | 1811 |
| 1799 | 1812 |
| 1800 void DescriptorArray::NoWriteBarrierSwap(FixedArray* array, | 1813 void DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array, |
| 1801 int first, | 1814 int first, |
| 1802 int second) { | 1815 int second) { |
| 1803 Object* tmp = array->get(first); | 1816 Object* tmp = array->get(first); |
| 1804 NoWriteBarrierSet(array, first, array->get(second)); | 1817 NoIncrementalWriteBarrierSet(array, first, array->get(second)); |
| 1805 NoWriteBarrierSet(array, second, tmp); | 1818 NoIncrementalWriteBarrierSet(array, second, tmp); |
| 1806 } | 1819 } |
| 1807 | 1820 |
| 1808 | 1821 |
| 1809 int DescriptorArray::Search(String* name) { | 1822 int DescriptorArray::Search(String* name) { |
| 1810 SLOW_ASSERT(IsSortedNoDuplicates()); | 1823 SLOW_ASSERT(IsSortedNoDuplicates()); |
| 1811 | 1824 |
| 1812 // Check for empty descriptor array. | 1825 // Check for empty descriptor array. |
| 1813 int nof = number_of_descriptors(); | 1826 int nof = number_of_descriptors(); |
| 1814 if (nof == 0) return kNotFound; | 1827 if (nof == 0) return kNotFound; |
| 1815 | 1828 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1907 PropertyDetails(GetDetails(descriptor_number))); | 1920 PropertyDetails(GetDetails(descriptor_number))); |
| 1908 } | 1921 } |
| 1909 | 1922 |
| 1910 | 1923 |
| 1911 void DescriptorArray::Set(int descriptor_number, | 1924 void DescriptorArray::Set(int descriptor_number, |
| 1912 Descriptor* desc, | 1925 Descriptor* desc, |
| 1913 const WhitenessWitness&) { | 1926 const WhitenessWitness&) { |
| 1914 // Range check. | 1927 // Range check. |
| 1915 ASSERT(descriptor_number < number_of_descriptors()); | 1928 ASSERT(descriptor_number < number_of_descriptors()); |
| 1916 | 1929 |
| 1917 // Make sure none of the elements in desc are in new space. | 1930 NoIncrementalWriteBarrierSet(this, |
| 1918 ASSERT(!HEAP->InNewSpace(desc->GetKey())); | 1931 ToKeyIndex(descriptor_number), |
| 1919 ASSERT(!HEAP->InNewSpace(desc->GetValue())); | 1932 desc->GetKey()); |
| 1920 | |
| 1921 NoWriteBarrierSet(this, | |
| 1922 ToKeyIndex(descriptor_number), | |
| 1923 desc->GetKey()); | |
| 1924 FixedArray* content_array = GetContentArray(); | 1933 FixedArray* content_array = GetContentArray(); |
| 1925 NoWriteBarrierSet(content_array, | 1934 NoIncrementalWriteBarrierSet(content_array, |
| 1926 ToValueIndex(descriptor_number), | 1935 ToValueIndex(descriptor_number), |
| 1927 desc->GetValue()); | 1936 desc->GetValue()); |
| 1928 NoWriteBarrierSet(content_array, | 1937 NoIncrementalWriteBarrierSet(content_array, |
| 1929 ToDetailsIndex(descriptor_number), | 1938 ToDetailsIndex(descriptor_number), |
| 1930 desc->GetDetails().AsSmi()); | 1939 desc->GetDetails().AsSmi()); |
| 1931 } | 1940 } |
| 1932 | 1941 |
| 1933 | 1942 |
| 1934 void DescriptorArray::CopyFrom(int index, | 1943 void DescriptorArray::CopyFrom(int index, |
| 1935 DescriptorArray* src, | 1944 DescriptorArray* src, |
| 1936 int src_index, | 1945 int src_index, |
| 1937 const WhitenessWitness& witness) { | 1946 const WhitenessWitness& witness) { |
| 1938 Descriptor desc; | 1947 Descriptor desc; |
| 1939 src->Get(src_index, &desc); | 1948 src->Get(src_index, &desc); |
| 1940 Set(index, &desc, witness); | 1949 Set(index, &desc, witness); |
| 1941 } | 1950 } |
| 1942 | 1951 |
| 1943 | 1952 |
| 1944 void DescriptorArray::NoWriteBarrierSwapDescriptors(int first, int second) { | 1953 void DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors( |
| 1945 NoWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second)); | 1954 int first, int second) { |
| 1955 NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second)); | |
| 1946 FixedArray* content_array = GetContentArray(); | 1956 FixedArray* content_array = GetContentArray(); |
| 1947 NoWriteBarrierSwap(content_array, | 1957 NoIncrementalWriteBarrierSwap(content_array, |
| 1948 ToValueIndex(first), | 1958 ToValueIndex(first), |
| 1949 ToValueIndex(second)); | 1959 ToValueIndex(second)); |
| 1950 NoWriteBarrierSwap(content_array, | 1960 NoIncrementalWriteBarrierSwap(content_array, |
| 1951 ToDetailsIndex(first), | 1961 ToDetailsIndex(first), |
| 1952 ToDetailsIndex(second)); | 1962 ToDetailsIndex(second)); |
| 1953 } | 1963 } |
| 1954 | 1964 |
| 1955 | 1965 |
| 1956 DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array) | 1966 DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array) |
| 1957 : marking_(array->GetHeap()->incremental_marking()) { | 1967 : marking_(array->GetHeap()->incremental_marking()) { |
| 1958 marking_->EnterNoMarkingScope(); | 1968 marking_->EnterNoMarkingScope(); |
| 1959 if (array->number_of_descriptors() > 0) { | 1969 if (array->number_of_descriptors() > 0) { |
| 1960 ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT); | 1970 ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT); |
| 1961 ASSERT(Marking::Color(array->GetContentArray()) == Marking::WHITE_OBJECT); | 1971 ASSERT(Marking::Color(array->GetContentArray()) == Marking::WHITE_OBJECT); |
| 1962 } | 1972 } |
| (...skipping 2728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4691 #undef WRITE_INT_FIELD | 4701 #undef WRITE_INT_FIELD |
| 4692 #undef READ_SHORT_FIELD | 4702 #undef READ_SHORT_FIELD |
| 4693 #undef WRITE_SHORT_FIELD | 4703 #undef WRITE_SHORT_FIELD |
| 4694 #undef READ_BYTE_FIELD | 4704 #undef READ_BYTE_FIELD |
| 4695 #undef WRITE_BYTE_FIELD | 4705 #undef WRITE_BYTE_FIELD |
| 4696 | 4706 |
| 4697 | 4707 |
| 4698 } } // namespace v8::internal | 4708 } } // namespace v8::internal |
| 4699 | 4709 |
| 4700 #endif // V8_OBJECTS_INL_H_ | 4710 #endif // V8_OBJECTS_INL_H_ |
| OLD | NEW |