OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/value-serializer.h" | 5 #include "src/value-serializer.h" |
6 | 6 |
7 #include <type_traits> | 7 #include <type_traits> |
8 | 8 |
9 #include "src/base/logging.h" | 9 #include "src/base/logging.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 1831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 isolate, object, key, &success, LookupIterator::OWN); | 1842 isolate, object, key, &success, LookupIterator::OWN); |
1843 if (!success || | 1843 if (!success || |
1844 JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE) | 1844 JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE) |
1845 .is_null()) { | 1845 .is_null()) { |
1846 return Nothing<bool>(); | 1846 return Nothing<bool>(); |
1847 } | 1847 } |
1848 } | 1848 } |
1849 return Just(true); | 1849 return Just(true); |
1850 } | 1850 } |
1851 | 1851 |
| 1852 namespace { |
| 1853 |
| 1854 // Throws a generic "deserialization failed" exception by default, unless a more |
| 1855 // specific exception has already been thrown. |
| 1856 void ThrowDeserializationExceptionIfNonePending(Isolate* isolate) { |
| 1857 if (!isolate->has_pending_exception()) { |
| 1858 isolate->Throw(*isolate->factory()->NewError( |
| 1859 MessageTemplate::kDataCloneDeserializationError)); |
| 1860 } |
| 1861 DCHECK(isolate->has_pending_exception()); |
| 1862 } |
| 1863 |
| 1864 } // namespace |
| 1865 |
1852 MaybeHandle<Object> | 1866 MaybeHandle<Object> |
1853 ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { | 1867 ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { |
1854 DCHECK_EQ(version_, 0u); | 1868 DCHECK_EQ(version_, 0u); |
1855 HandleScope scope(isolate_); | 1869 HandleScope scope(isolate_); |
1856 std::vector<Handle<Object>> stack; | 1870 std::vector<Handle<Object>> stack; |
1857 while (position_ < end_) { | 1871 while (position_ < end_) { |
1858 SerializationTag tag; | 1872 SerializationTag tag; |
1859 if (!PeekTag().To(&tag)) break; | 1873 if (!PeekTag().To(&tag)) break; |
1860 | 1874 |
1861 Handle<Object> new_object; | 1875 Handle<Object> new_object; |
(...skipping 12 matching lines...) Expand all Loading... |
1874 } | 1888 } |
1875 | 1889 |
1876 size_t begin_properties = | 1890 size_t begin_properties = |
1877 stack.size() - 2 * static_cast<size_t>(num_properties); | 1891 stack.size() - 2 * static_cast<size_t>(num_properties); |
1878 Handle<JSObject> js_object = isolate_->factory()->NewJSObject( | 1892 Handle<JSObject> js_object = isolate_->factory()->NewJSObject( |
1879 isolate_->object_function(), pretenure_); | 1893 isolate_->object_function(), pretenure_); |
1880 if (num_properties && | 1894 if (num_properties && |
1881 !SetPropertiesFromKeyValuePairs( | 1895 !SetPropertiesFromKeyValuePairs( |
1882 isolate_, js_object, &stack[begin_properties], num_properties) | 1896 isolate_, js_object, &stack[begin_properties], num_properties) |
1883 .FromMaybe(false)) { | 1897 .FromMaybe(false)) { |
1884 DCHECK(isolate_->has_pending_exception()); | 1898 ThrowDeserializationExceptionIfNonePending(isolate_); |
1885 return MaybeHandle<Object>(); | 1899 return MaybeHandle<Object>(); |
1886 } | 1900 } |
1887 | 1901 |
1888 stack.resize(begin_properties); | 1902 stack.resize(begin_properties); |
1889 new_object = js_object; | 1903 new_object = js_object; |
1890 break; | 1904 break; |
1891 } | 1905 } |
1892 case SerializationTag::kEndSparseJSArray: { | 1906 case SerializationTag::kEndSparseJSArray: { |
1893 ConsumeTag(SerializationTag::kEndSparseJSArray); | 1907 ConsumeTag(SerializationTag::kEndSparseJSArray); |
1894 | 1908 |
(...skipping 10 matching lines...) Expand all Loading... |
1905 | 1919 |
1906 Handle<JSArray> js_array = isolate_->factory()->NewJSArray( | 1920 Handle<JSArray> js_array = isolate_->factory()->NewJSArray( |
1907 0, TERMINAL_FAST_ELEMENTS_KIND, pretenure_); | 1921 0, TERMINAL_FAST_ELEMENTS_KIND, pretenure_); |
1908 JSArray::SetLength(js_array, length); | 1922 JSArray::SetLength(js_array, length); |
1909 size_t begin_properties = | 1923 size_t begin_properties = |
1910 stack.size() - 2 * static_cast<size_t>(num_properties); | 1924 stack.size() - 2 * static_cast<size_t>(num_properties); |
1911 if (num_properties && | 1925 if (num_properties && |
1912 !SetPropertiesFromKeyValuePairs( | 1926 !SetPropertiesFromKeyValuePairs( |
1913 isolate_, js_array, &stack[begin_properties], num_properties) | 1927 isolate_, js_array, &stack[begin_properties], num_properties) |
1914 .FromMaybe(false)) { | 1928 .FromMaybe(false)) { |
1915 DCHECK(isolate_->has_pending_exception()); | 1929 ThrowDeserializationExceptionIfNonePending(isolate_); |
1916 return MaybeHandle<Object>(); | 1930 return MaybeHandle<Object>(); |
1917 } | 1931 } |
1918 | 1932 |
1919 stack.resize(begin_properties); | 1933 stack.resize(begin_properties); |
1920 new_object = js_array; | 1934 new_object = js_array; |
1921 break; | 1935 break; |
1922 } | 1936 } |
1923 case SerializationTag::kEndDenseJSArray: { | 1937 case SerializationTag::kEndDenseJSArray: { |
1924 // This was already broken in Chromium, and apparently wasn't missed. | 1938 // This was already broken in Chromium, and apparently wasn't missed. |
1925 isolate_->Throw(*isolate_->factory()->NewError( | 1939 isolate_->Throw(*isolate_->factory()->NewError( |
(...skipping 18 matching lines...) Expand all Loading... |
1944 if (stack.size() != 1) { | 1958 if (stack.size() != 1) { |
1945 isolate_->Throw(*isolate_->factory()->NewError( | 1959 isolate_->Throw(*isolate_->factory()->NewError( |
1946 MessageTemplate::kDataCloneDeserializationError)); | 1960 MessageTemplate::kDataCloneDeserializationError)); |
1947 return MaybeHandle<Object>(); | 1961 return MaybeHandle<Object>(); |
1948 } | 1962 } |
1949 return scope.CloseAndEscape(stack[0]); | 1963 return scope.CloseAndEscape(stack[0]); |
1950 } | 1964 } |
1951 | 1965 |
1952 } // namespace internal | 1966 } // namespace internal |
1953 } // namespace v8 | 1967 } // namespace v8 |
OLD | NEW |