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

Unified Diff: third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py

Issue 1311043003: Update mojo sdk to rev c02a28868825edfa57ab77947b8cb15e741c5598 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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: third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
index 6c4767b7b6f0146bb9bea5e39214b394064a9996..cfd7e644cc2784d10100c04bc6d9c2c38f7da95c 100644
--- a/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
@@ -135,6 +135,103 @@ class MojoStructType(type):
raise AttributeError('can\'t delete attribute')
+class MojoUnionType(type):
+
+ def __new__(mcs, name, bases, dictionary):
+ dictionary['__slots__'] = ('_cur_field', '_data')
+ descriptor = dictionary.pop('DESCRIPTOR', {})
+
+ fields = descriptor.get('fields', [])
+ def _BuildUnionProperty(field):
+
+ # pylint: disable=W0212
+ def Get(self):
+ if self._cur_field != field:
+ raise AttributeError('%s is not currently set' % field.name,
+ field.name, self._cur_field.name)
+ return self._data
+
+ # pylint: disable=W0212
+ def Set(self, value):
+ self._cur_field = field
+ self._data = field.field_type.Convert(value)
+
+ return property(Get, Set)
+
+ for field in fields:
+ dictionary[field.name] = _BuildUnionProperty(field)
+
+ def UnionInit(self, **kwargs):
+ self.SetInternals(None, None)
+ items = kwargs.items()
+ if len(items) == 0:
+ return
+
+ if len(items) > 1:
+ raise TypeError('only 1 member may be set on a union.')
+
+ setattr(self, items[0][0], items[0][1])
+ dictionary['__init__'] = UnionInit
+
+ serializer = serialization.UnionSerializer(fields)
+ def SerializeUnionInline(self, handle_offset=0):
+ return serializer.SerializeInline(self, handle_offset)
+ dictionary['SerializeInline'] = SerializeUnionInline
+
+ def SerializeUnion(self, handle_offset=0):
+ return serializer.Serialize(self, handle_offset)
+ dictionary['Serialize'] = SerializeUnion
+
+ def DeserializeUnion(cls, context):
+ return serializer.Deserialize(context, cls)
+ dictionary['Deserialize'] = classmethod(DeserializeUnion)
+
+ class Tags(object):
+ __metaclass__ = MojoEnumType
+ VALUES = [(field.name, field.index) for field in fields]
+ dictionary['Tags'] = Tags
+
+ def GetTag(self):
+ return self._cur_field.index
+ dictionary['tag'] = property(GetTag, None)
+
+ def GetData(self):
+ return self._data
+ dictionary['data'] = property(GetData, None)
+
+ def IsUnknown(self):
+ return not self._cur_field
+ dictionary['IsUnknown'] = IsUnknown
+
+ def UnionEq(self, other):
+ return (
+ (type(self) is type(other))
+ and (self.tag == other.tag)
+ and (self.data == other.data))
+ dictionary['__eq__'] = UnionEq
+
+ def UnionNe(self, other):
+ return not self.__eq__(other)
+ dictionary['__ne__'] = UnionNe
+
+ def UnionStr(self):
+ return '<%s.%s(%s): %s>' % (
+ self.__class__.__name__,
+ self._cur_field.name,
+ self.tag,
+ self.data)
+ dictionary['__str__'] = UnionStr
+ dictionary['__repr__'] = UnionStr
+
+ def SetInternals(self, field, data):
+ self._cur_field = field
+ self._data = data
+ dictionary['SetInternals'] = SetInternals
+
+
+ return type.__new__(mcs, name, bases, dictionary)
+
+
class InterfaceRequest(object):
"""
An interface request allows to send a request for an interface to a remote

Powered by Google App Engine
This is Rietveld 408576698