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

Unified Diff: mojo/public/cpp/bindings/lib/map_serialization.h

Issue 1387993002: mojo::Serialize*_() calls now propogate/return validation errors. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fixed MOJO_DCHECK issues, removed SerializationWarningObserver & addressing trung's CL comments Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/cpp/bindings/lib/map_serialization.h
diff --git a/mojo/public/cpp/bindings/lib/map_serialization.h b/mojo/public/cpp/bindings/lib/map_serialization.h
index 8ef83b3a3a554947606e20eb0aa01beaa53d06a5..3f24b1a67c20c87dd00a96aa2817be57a25342f8 100644
--- a/mojo/public/cpp/bindings/lib/map_serialization.h
+++ b/mojo/public/cpp/bindings/lib/map_serialization.h
@@ -121,6 +121,11 @@ inline size_t GetSerializedSize_(const Map<MapKey, MapValue>& input) {
value_data_size;
}
+// SerializeMap_ will return VALIDATION_ERROR_NONE on success and set
+// |output| accordingly. On failure, |input| will be partially serialized into
+// |output| up until an error occurs (which is propagated up and returned by
+// SerializeMap_), in which case |buf| is also partially consumed.
+//
// We don't need an ArrayValidateParams instance for key validation since
// we can deduce it from the Key type. (which can only be primitive types or
// non-nullable strings.)
@@ -128,45 +133,54 @@ template <typename MapKey,
typename MapValue,
typename DataKey,
typename DataValue>
-inline void SerializeMap_(
+inline internal::ValidationError SerializeMap_(
Map<MapKey, MapValue>* input,
internal::Buffer* buf,
internal::Map_Data<DataKey, DataValue>** output,
const internal::ArrayValidateParams* value_validate_params) {
- if (input && *input) {
- internal::Map_Data<DataKey, DataValue>* result =
- internal::Map_Data<DataKey, DataValue>::New(buf);
- internal::Array_Data<DataKey>* keys_data =
- internal::Array_Data<DataKey>::New(input->size(), buf);
+ if (input->is_null()) {
+ // |input| could be a nullable map, in which case |output| is serialized as
+ // null, which is valid.
+ *output = nullptr;
+ return internal::VALIDATION_ERROR_NONE;
+ }
+
+ internal::Map_Data<DataKey, DataValue>* result =
+ internal::Map_Data<DataKey, DataValue>::New(buf);
- if (result && keys_data) {
- result->keys.ptr = keys_data;
+ // We *must* serialize the keys before we allocate an Array_Data for the
+ // values.
+ internal::Array_Data<DataKey>* keys_data =
+ internal::Array_Data<DataKey>::New(input->size(), buf);
+ result->keys.ptr = keys_data;
- // We *must* serialize the keys before we allocate an Array_Data for the
- // values.
- internal::MapKeyIterator<MapKey, MapValue> key_iter(input);
- const internal::ArrayValidateParams* key_validate_params =
- internal::MapKeyValidateParamsFactory<DataKey>::Get();
+ internal::MapKeyIterator<MapKey, MapValue> key_iter(input);
+ const internal::ArrayValidateParams* key_validate_params =
+ internal::MapKeyValidateParamsFactory<DataKey>::Get();
+ auto keys_retval =
internal::ArraySerializer<MapKey, DataKey>::SerializeElements(
key_iter.begin(), input->size(), buf, result->keys.ptr,
key_validate_params);
+ if (keys_retval != internal::VALIDATION_ERROR_NONE)
+ return keys_retval;
- // Now we try allocate an Array_Data for the values
- internal::Array_Data<DataValue>* values_data =
- internal::Array_Data<DataValue>::New(input->size(), buf);
- if (values_data) {
- result->values.ptr = values_data;
- internal::MapValueIterator<MapKey, MapValue> value_iter(input);
- internal::ArraySerializer<MapValue, DataValue>::SerializeElements(
- value_iter.begin(), input->size(), buf, result->values.ptr,
- value_validate_params);
- }
- }
- *output = result;
- } else {
- *output = nullptr;
- }
+ // Now we try allocate an Array_Data for the values
+ internal::Array_Data<DataValue>* values_data =
+ internal::Array_Data<DataValue>::New(input->size(), buf);
+ result->values.ptr = values_data;
+
+ internal::MapValueIterator<MapKey, MapValue> value_iter(input);
+
+ auto values_retval =
+ internal::ArraySerializer<MapValue, DataValue>::SerializeElements(
+ value_iter.begin(), input->size(), buf, result->values.ptr,
+ value_validate_params);
+ if (values_retval != internal::VALIDATION_ERROR_NONE)
+ return values_retval;
+
+ *output = result;
+ return internal::VALIDATION_ERROR_NONE;
}
template <typename MapKey,
« no previous file with comments | « mojo/public/cpp/bindings/lib/control_message_proxy.cc ('k') | mojo/public/cpp/bindings/lib/map_serialization_forward.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698