Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: src/value-serializer.cc

Issue 2712713002: ValueDeserializer: Make sure that an exception is the legacy path. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698