| 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 |