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

Side by Side Diff: src/api.cc

Issue 2308053002: Handle errors in v8::ValueDeserializer by throwing exceptions. (Closed)
Patch Set: minor cleanup Created 4 years, 3 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 | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 2840 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 2851
2852 ValueSerializer::~ValueSerializer() { delete private_; } 2852 ValueSerializer::~ValueSerializer() { delete private_; }
2853 2853
2854 void ValueSerializer::WriteHeader() { private_->serializer.WriteHeader(); } 2854 void ValueSerializer::WriteHeader() { private_->serializer.WriteHeader(); }
2855 2855
2856 Maybe<bool> ValueSerializer::WriteValue(Local<Context> context, 2856 Maybe<bool> ValueSerializer::WriteValue(Local<Context> context,
2857 Local<Value> value) { 2857 Local<Value> value) {
2858 PREPARE_FOR_EXECUTION_PRIMITIVE(context, ValueSerializer, WriteValue, bool); 2858 PREPARE_FOR_EXECUTION_PRIMITIVE(context, ValueSerializer, WriteValue, bool);
2859 i::Handle<i::Object> object = Utils::OpenHandle(*value); 2859 i::Handle<i::Object> object = Utils::OpenHandle(*value);
2860 Maybe<bool> result = private_->serializer.WriteObject(object); 2860 Maybe<bool> result = private_->serializer.WriteObject(object);
2861 if (result.IsNothing()) { 2861 has_pending_exception = result.IsNothing();
2862 has_pending_exception = private_->isolate->has_pending_exception(); 2862 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2863 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2864 }
2865 return result; 2863 return result;
2866 } 2864 }
2867 2865
2868 std::vector<uint8_t> ValueSerializer::ReleaseBuffer() { 2866 std::vector<uint8_t> ValueSerializer::ReleaseBuffer() {
2869 return private_->serializer.ReleaseBuffer(); 2867 return private_->serializer.ReleaseBuffer();
2870 } 2868 }
2871 2869
2872 void ValueSerializer::TransferArrayBuffer(uint32_t transfer_id, 2870 void ValueSerializer::TransferArrayBuffer(uint32_t transfer_id,
2873 Local<ArrayBuffer> array_buffer) { 2871 Local<ArrayBuffer> array_buffer) {
2874 private_->serializer.TransferArrayBuffer(transfer_id, 2872 private_->serializer.TransferArrayBuffer(transfer_id,
2875 Utils::OpenHandle(*array_buffer)); 2873 Utils::OpenHandle(*array_buffer));
2876 } 2874 }
2877 2875
2878 void ValueSerializer::TransferSharedArrayBuffer( 2876 void ValueSerializer::TransferSharedArrayBuffer(
2879 uint32_t transfer_id, Local<SharedArrayBuffer> shared_array_buffer) { 2877 uint32_t transfer_id, Local<SharedArrayBuffer> shared_array_buffer) {
2880 private_->serializer.TransferArrayBuffer( 2878 private_->serializer.TransferArrayBuffer(
2881 transfer_id, Utils::OpenHandle(*shared_array_buffer)); 2879 transfer_id, Utils::OpenHandle(*shared_array_buffer));
2882 } 2880 }
2883 2881
2884 struct ValueDeserializer::PrivateData { 2882 struct ValueDeserializer::PrivateData {
2885 PrivateData(i::Isolate* i, i::Vector<const uint8_t> data) 2883 PrivateData(i::Isolate* i, i::Vector<const uint8_t> data)
2886 : isolate(i), deserializer(i, data) {} 2884 : isolate(i), deserializer(i, data) {}
2887 i::Isolate* isolate; 2885 i::Isolate* isolate;
2888 i::ValueDeserializer deserializer; 2886 i::ValueDeserializer deserializer;
2887 bool has_aborted = false;
2889 bool supports_legacy_wire_format = false; 2888 bool supports_legacy_wire_format = false;
2890 }; 2889 };
2891 2890
2892 ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data, 2891 ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data,
2893 size_t size) { 2892 size_t size) {
2894 if (base::IsValueInRangeForNumericType<int>(size)) { 2893 if (base::IsValueInRangeForNumericType<int>(size)) {
2895 private_ = 2894 private_ =
2896 new PrivateData(reinterpret_cast<i::Isolate*>(isolate), 2895 new PrivateData(reinterpret_cast<i::Isolate*>(isolate),
2897 i::Vector<const uint8_t>(data, static_cast<int>(size))); 2896 i::Vector<const uint8_t>(data, static_cast<int>(size)));
2898 } else { 2897 } else {
2899 private_ = nullptr; 2898 private_ = new PrivateData(reinterpret_cast<i::Isolate*>(isolate),
2899 i::Vector<const uint8_t>(nullptr, 0));
2900 private_->has_aborted = true;
2900 } 2901 }
2901 } 2902 }
2902 2903
2903 ValueDeserializer::~ValueDeserializer() { delete private_; } 2904 ValueDeserializer::~ValueDeserializer() { delete private_; }
2904 2905
2905 Maybe<bool> ValueDeserializer::ReadHeader() { 2906 Maybe<bool> ValueDeserializer::ReadHeader(Local<Context> context) {
2907 PREPARE_FOR_EXECUTION_PRIMITIVE(context, ValueDeserializer, ReadHeader, bool);
2908
2909 // We could have aborted during the constructor.
2910 // If so, ReadHeader is where we report it.
2911 if (private_->has_aborted) {
2912 isolate->Throw(*isolate->factory()->NewError(
2913 i::MessageTemplate::kDataCloneDeserializationError));
2914 has_pending_exception = true;
2915 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2916 }
2917
2918 bool read_header = false;
2919 has_pending_exception = !private_->deserializer.ReadHeader().To(&read_header);
2920 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2921 DCHECK(read_header);
2922
2906 // TODO(jbroman): Today, all wire formats are "legacy". When a more supported 2923 // TODO(jbroman): Today, all wire formats are "legacy". When a more supported
2907 // format is added, compare the version of the internal serializer to the 2924 // format is added, compare the version of the internal serializer to the
2908 // minimum non-legacy version number. 2925 // minimum non-legacy version number.
2909 if (!private_ || !private_->deserializer.ReadHeader().FromMaybe(false) || 2926 if (!private_->supports_legacy_wire_format) {
2910 !private_->supports_legacy_wire_format) { 2927 isolate->Throw(*isolate->factory()->NewError(
2911 delete private_; 2928 i::MessageTemplate::kDataCloneDeserializationVersionError));
2912 private_ = nullptr; 2929 has_pending_exception = true;
2913 return Nothing<bool>(); 2930 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2914 } 2931 }
2932
2915 return Just(true); 2933 return Just(true);
2916 } 2934 }
2917 2935
2936 Maybe<bool> ValueDeserializer::ReadHeader() {
2937 Isolate* isolate = reinterpret_cast<Isolate*>(private_->isolate);
2938 return ReadHeader(isolate->GetEnteredContext());
2939 }
2940
2918 void ValueDeserializer::SetSupportsLegacyWireFormat( 2941 void ValueDeserializer::SetSupportsLegacyWireFormat(
2919 bool supports_legacy_wire_format) { 2942 bool supports_legacy_wire_format) {
2920 if (!private_) return;
2921 private_->supports_legacy_wire_format = supports_legacy_wire_format; 2943 private_->supports_legacy_wire_format = supports_legacy_wire_format;
2922 } 2944 }
2923 2945
2924 uint32_t ValueDeserializer::GetWireFormatVersion() const { 2946 uint32_t ValueDeserializer::GetWireFormatVersion() const {
2925 CHECK(private_); 2947 CHECK(!private_->has_aborted);
2926 return private_->deserializer.GetWireFormatVersion(); 2948 return private_->deserializer.GetWireFormatVersion();
2927 } 2949 }
2928 2950
2929 MaybeLocal<Value> ValueDeserializer::ReadValue(Local<Context> context) { 2951 MaybeLocal<Value> ValueDeserializer::ReadValue(Local<Context> context) {
2930 CHECK(private_); 2952 CHECK(!private_->has_aborted);
2931 PREPARE_FOR_EXECUTION(context, ValueDeserializer, ReadValue, Value); 2953 PREPARE_FOR_EXECUTION(context, ValueDeserializer, ReadValue, Value);
2932 i::MaybeHandle<i::Object> result; 2954 i::MaybeHandle<i::Object> result;
2933 if (GetWireFormatVersion() > 0) { 2955 if (GetWireFormatVersion() > 0) {
2934 result = private_->deserializer.ReadObject(); 2956 result = private_->deserializer.ReadObject();
2935 } else { 2957 } else {
2936 result = 2958 result =
2937 private_->deserializer.ReadObjectUsingEntireBufferForLegacyFormat(); 2959 private_->deserializer.ReadObjectUsingEntireBufferForLegacyFormat();
2938 } 2960 }
2939 Local<Value> value; 2961 Local<Value> value;
2940 if (!ToLocal(result, &value)) { 2962 has_pending_exception = !ToLocal(result, &value);
2941 has_pending_exception = private_->isolate->has_pending_exception(); 2963 RETURN_ON_FAILED_EXECUTION(Value);
2942 RETURN_ON_FAILED_EXECUTION(Value);
2943 return MaybeLocal<Value>();
2944 }
2945 RETURN_ESCAPED(value); 2964 RETURN_ESCAPED(value);
2946 } 2965 }
2947 2966
2948 void ValueDeserializer::TransferArrayBuffer(uint32_t transfer_id, 2967 void ValueDeserializer::TransferArrayBuffer(uint32_t transfer_id,
2949 Local<ArrayBuffer> array_buffer) { 2968 Local<ArrayBuffer> array_buffer) {
2969 CHECK(!private_->has_aborted);
2950 private_->deserializer.TransferArrayBuffer(transfer_id, 2970 private_->deserializer.TransferArrayBuffer(transfer_id,
2951 Utils::OpenHandle(*array_buffer)); 2971 Utils::OpenHandle(*array_buffer));
2952 } 2972 }
2953 2973
2954 void ValueDeserializer::TransferSharedArrayBuffer( 2974 void ValueDeserializer::TransferSharedArrayBuffer(
2955 uint32_t transfer_id, Local<SharedArrayBuffer> shared_array_buffer) { 2975 uint32_t transfer_id, Local<SharedArrayBuffer> shared_array_buffer) {
2976 CHECK(!private_->has_aborted);
2956 private_->deserializer.TransferArrayBuffer( 2977 private_->deserializer.TransferArrayBuffer(
2957 transfer_id, Utils::OpenHandle(*shared_array_buffer)); 2978 transfer_id, Utils::OpenHandle(*shared_array_buffer));
2958 } 2979 }
2959 2980
2960 // --- D a t a --- 2981 // --- D a t a ---
2961 2982
2962 bool Value::FullIsUndefined() const { 2983 bool Value::FullIsUndefined() const {
2963 i::Handle<i::Object> object = Utils::OpenHandle(this); 2984 i::Handle<i::Object> object = Utils::OpenHandle(this);
2964 bool result = false; 2985 bool result = false;
2965 if (!object->IsSmi()) { 2986 if (!object->IsSmi()) {
(...skipping 6243 matching lines...) Expand 10 before | Expand all | Expand 10 after
9209 Address callback_address = 9230 Address callback_address =
9210 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9231 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9211 VMState<EXTERNAL> state(isolate); 9232 VMState<EXTERNAL> state(isolate);
9212 ExternalCallbackScope call_scope(isolate, callback_address); 9233 ExternalCallbackScope call_scope(isolate, callback_address);
9213 callback(info); 9234 callback(info);
9214 } 9235 }
9215 9236
9216 9237
9217 } // namespace internal 9238 } // namespace internal
9218 } // namespace v8 9239 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698