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/platform/platform.h" | 9 #include "src/base/platform/platform.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1844 // maybe left-over bytes that need to be padded. | 1844 // maybe left-over bytes that need to be padded. |
| 1845 int padding_size = allocation_size - SeqString::kHeaderSize - content_size; | 1845 int padding_size = allocation_size - SeqString::kHeaderSize - content_size; |
| 1846 DCHECK(0 <= padding_size && padding_size < kObjectAlignment); | 1846 DCHECK(0 <= padding_size && padding_size < kObjectAlignment); |
| 1847 for (int i = 0; i < padding_size; i++) sink_->PutSection(0, "StringPadding"); | 1847 for (int i = 0; i < padding_size; i++) sink_->PutSection(0, "StringPadding"); |
| 1848 | 1848 |
| 1849 sink_->Put(kSkip, "SkipAfterString"); | 1849 sink_->Put(kSkip, "SkipAfterString"); |
| 1850 sink_->PutInt(bytes_to_output, "SkipDistance"); | 1850 sink_->PutInt(bytes_to_output, "SkipDistance"); |
| 1851 } | 1851 } |
| 1852 | 1852 |
| 1853 | 1853 |
| 1854 // Clear and later restore the next link in the weak cell, if the object is one. | |
| 1855 class UnlinkWeakCellScope { | |
| 1856 public: | |
| 1857 explicit UnlinkWeakCellScope(HeapObject* object) : weak_cell_(NULL) { | |
| 1858 if (object->IsWeakCell()) { | |
| 1859 weak_cell_ = WeakCell::cast(object); | |
| 1860 next_ = weak_cell_->next(); | |
| 1861 weak_cell_->clear_next(object->GetHeap()); | |
| 1862 } | |
| 1863 } | |
| 1864 | |
| 1865 ~UnlinkWeakCellScope() { | |
| 1866 if (weak_cell_) weak_cell_->set_next(next_); | |
|
ulan
2015/06/24 11:11:19
set_next(next_, UPDATE_WEAK_WRITE_BARRIER)
| |
| 1867 } | |
| 1868 | |
| 1869 private: | |
| 1870 WeakCell* weak_cell_; | |
| 1871 Object* next_; | |
| 1872 }; | |
| 1873 | |
| 1874 | |
| 1854 void Serializer::ObjectSerializer::Serialize() { | 1875 void Serializer::ObjectSerializer::Serialize() { |
| 1855 if (FLAG_trace_serializer) { | 1876 if (FLAG_trace_serializer) { |
| 1856 PrintF(" Encoding heap object: "); | 1877 PrintF(" Encoding heap object: "); |
| 1857 object_->ShortPrint(); | 1878 object_->ShortPrint(); |
| 1858 PrintF("\n"); | 1879 PrintF("\n"); |
| 1859 } | 1880 } |
| 1860 | 1881 |
| 1861 // We cannot serialize typed array objects correctly. | 1882 // We cannot serialize typed array objects correctly. |
| 1862 DCHECK(!object_->IsJSTypedArray()); | 1883 DCHECK(!object_->IsJSTypedArray()); |
| 1863 | 1884 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1903 | 1924 |
| 1904 RecursionScope recursion(serializer_); | 1925 RecursionScope recursion(serializer_); |
| 1905 // Objects that are immediately post processed during deserialization | 1926 // Objects that are immediately post processed during deserialization |
| 1906 // cannot be deferred, since post processing requires the object content. | 1927 // cannot be deferred, since post processing requires the object content. |
| 1907 if (recursion.ExceedsMaximum() && CanBeDeferred(object_)) { | 1928 if (recursion.ExceedsMaximum() && CanBeDeferred(object_)) { |
| 1908 serializer_->QueueDeferredObject(object_); | 1929 serializer_->QueueDeferredObject(object_); |
| 1909 sink_->Put(kDeferred, "Deferring object content"); | 1930 sink_->Put(kDeferred, "Deferring object content"); |
| 1910 return; | 1931 return; |
| 1911 } | 1932 } |
| 1912 | 1933 |
| 1934 UnlinkWeakCellScope unlink_weak_cell(object_); | |
|
ulan
2015/06/24 11:11:19
Please add disallow allocation scope here or in Un
| |
| 1935 | |
| 1913 object_->IterateBody(map->instance_type(), size, this); | 1936 object_->IterateBody(map->instance_type(), size, this); |
| 1914 OutputRawData(object_->address() + size); | 1937 OutputRawData(object_->address() + size); |
| 1915 } | 1938 } |
| 1916 | 1939 |
| 1917 | 1940 |
| 1918 void Serializer::ObjectSerializer::SerializeDeferred() { | 1941 void Serializer::ObjectSerializer::SerializeDeferred() { |
| 1919 if (FLAG_trace_serializer) { | 1942 if (FLAG_trace_serializer) { |
| 1920 PrintF(" Encoding deferred heap object: "); | 1943 PrintF(" Encoding deferred heap object: "); |
| 1921 object_->ShortPrint(); | 1944 object_->ShortPrint(); |
| 1922 PrintF("\n"); | 1945 PrintF("\n"); |
| 1923 } | 1946 } |
| 1924 | 1947 |
| 1925 int size = object_->Size(); | 1948 int size = object_->Size(); |
| 1926 Map* map = object_->map(); | 1949 Map* map = object_->map(); |
| 1927 BackReference reference = serializer_->back_reference_map()->Lookup(object_); | 1950 BackReference reference = serializer_->back_reference_map()->Lookup(object_); |
| 1928 | 1951 |
| 1929 // Serialize the rest of the object. | 1952 // Serialize the rest of the object. |
| 1930 CHECK_EQ(0, bytes_processed_so_far_); | 1953 CHECK_EQ(0, bytes_processed_so_far_); |
| 1931 bytes_processed_so_far_ = kPointerSize; | 1954 bytes_processed_so_far_ = kPointerSize; |
| 1932 | 1955 |
| 1933 sink_->Put(kNewObject + reference.space(), "deferred object"); | 1956 sink_->Put(kNewObject + reference.space(), "deferred object"); |
| 1934 serializer_->PutBackReference(object_, reference); | 1957 serializer_->PutBackReference(object_, reference); |
| 1935 sink_->PutInt(size >> kPointerSizeLog2, "deferred object size"); | 1958 sink_->PutInt(size >> kPointerSizeLog2, "deferred object size"); |
| 1936 | 1959 |
| 1960 UnlinkWeakCellScope unlink_weak_cell(object_); | |
|
ulan
2015/06/24 11:11:19
Please add disallow allocation scope here or in Un
| |
| 1961 | |
| 1937 object_->IterateBody(map->instance_type(), size, this); | 1962 object_->IterateBody(map->instance_type(), size, this); |
| 1938 OutputRawData(object_->address() + size); | 1963 OutputRawData(object_->address() + size); |
| 1939 } | 1964 } |
| 1940 | 1965 |
| 1941 | 1966 |
| 1942 void Serializer::ObjectSerializer::VisitPointers(Object** start, | 1967 void Serializer::ObjectSerializer::VisitPointers(Object** start, |
| 1943 Object** end) { | 1968 Object** end) { |
| 1944 Object** current = start; | 1969 Object** current = start; |
| 1945 while (current < end) { | 1970 while (current < end) { |
| 1946 while (current < end && (*current)->IsSmi()) current++; | 1971 while (current < end && (*current)->IsSmi()) current++; |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2708 SerializedCodeData* scd = new SerializedCodeData(cached_data); | 2733 SerializedCodeData* scd = new SerializedCodeData(cached_data); |
| 2709 SanityCheckResult r = scd->SanityCheck(isolate, source); | 2734 SanityCheckResult r = scd->SanityCheck(isolate, source); |
| 2710 if (r == CHECK_SUCCESS) return scd; | 2735 if (r == CHECK_SUCCESS) return scd; |
| 2711 cached_data->Reject(); | 2736 cached_data->Reject(); |
| 2712 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); | 2737 source->GetIsolate()->counters()->code_cache_reject_reason()->AddSample(r); |
| 2713 delete scd; | 2738 delete scd; |
| 2714 return NULL; | 2739 return NULL; |
| 2715 } | 2740 } |
| 2716 } // namespace internal | 2741 } // namespace internal |
| 2717 } // namespace v8 | 2742 } // namespace v8 |
| OLD | NEW |