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 |