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

Unified Diff: mojo/public/python/mojo/bindings/descriptor.py

Issue 643023003: mojo: Add maps to python bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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/python/mojo/bindings/descriptor.py
diff --git a/mojo/public/python/mojo/bindings/descriptor.py b/mojo/public/python/mojo/bindings/descriptor.py
index b97938ac52dae25bd11aad0fb21dd0413c072efc..5056072e46f46b4408e732ce76757eacd6fd3265 100644
--- a/mojo/public/python/mojo/bindings/descriptor.py
+++ b/mojo/public/python/mojo/bindings/descriptor.py
@@ -11,6 +11,7 @@ import itertools
import struct
# pylint: disable=F0401
+import mojo.bindings.reflection as reflection
import mojo.bindings.serialization as serialization
import mojo.system
@@ -403,6 +404,50 @@ class StructType(PointerType):
return self.struct_type.Deserialize(data, handles)
+class MapType(SerializableType):
+ """Type objects for maps."""
+
+ def __init__(self, key_type, value_type, nullable=False):
+ self._key_type = key_type
+ self._value_type = value_type
+ dictionary = {
+ '__metaclass__': reflection.MojoStructType,
+ '__module__': __name__,
+ 'DESCRIPTOR': {
+ 'fields': [
+ SingleFieldGroup('keys', GenericArrayType(key_type), 0, 0),
+ SingleFieldGroup('values', GenericArrayType(value_type), 1, 1),
+ ],
+ }
+ }
+ self.struct = reflection.MojoStructType('MapStruct', (object,), dictionary)
+ self.struct_type = StructType(lambda: self.struct, nullable)
+ SerializableType.__init__(self, self.struct_type.typecode)
+
+ def Convert(self, value):
+ if value is None:
+ return value
+ if isinstance(value, dict):
+ return dict([(self._key_type.Convert(x), self._value_type.Convert(y)) for
+ x, y in value.items()])
+ raise TypeError('%r is not a dictionary.')
+
+ def Serialize(self, value, data_offset, data, handle_offset):
+ s = None
+ if value:
+ key_values = value.items()
sdefresne 2014/10/10 15:10:26 nit: I think it would be clearer as: keys, values
qsr 2014/10/10 15:36:05 Done.
+ keys = [x[0] for x in key_values]
+ values = [x[1] for x in key_values]
+ s = self.struct(keys=keys, values=values)
+ return self.struct_type.Serialize(s, data_offset, data, handle_offset)
+
+ def Deserialize(self, value, data, handles):
+ s = self.struct_type.Deserialize(value, data, handles)
+ if s:
+ return dict(zip(s.keys, s.values))
+ return None
+
+
class NoneType(SerializableType):
"""Placeholder type, used temporarily until all mojo types are handled."""

Powered by Google App Engine
This is Rietveld 408576698