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

Side by Side Diff: mojo/public/python/mojo_bindings/reflection.py

Issue 1218023006: Implement python mojo bindings unions. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 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
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium 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 """The metaclasses used by the mojo python bindings.""" 5 """The metaclasses used by the mojo python bindings."""
6 6
7 import itertools 7 import itertools
8 8
9 # pylint: disable=F0401 9 # pylint: disable=F0401
10 import mojo_bindings.serialization as serialization 10 import mojo_bindings.serialization as serialization
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 101
102 # Add init 102 # Add init
103 dictionary['__init__'] = _StructInit(fields) 103 dictionary['__init__'] = _StructInit(fields)
104 104
105 # Add serialization method 105 # Add serialization method
106 serialization_object = serialization.Serialization(groups) 106 serialization_object = serialization.Serialization(groups)
107 def Serialize(self, handle_offset=0): 107 def Serialize(self, handle_offset=0):
108 return serialization_object.Serialize(self, handle_offset) 108 return serialization_object.Serialize(self, handle_offset)
109 dictionary['Serialize'] = Serialize 109 dictionary['Serialize'] = Serialize
110 110
111 dictionary['GetS'] = classmethod(lambda s: serialization_object)
qsr 2015/07/16 09:35:25 What is this? I didn't find where it was used? By
azani 2015/07/16 21:57:38 Sorry, that was here for debugging.
112
111 # pylint: disable=W0212 113 # pylint: disable=W0212
112 def AsDict(self): 114 def AsDict(self):
113 return self._fields 115 return self._fields
114 dictionary['AsDict'] = AsDict 116 dictionary['AsDict'] = AsDict
115 117
116 def Deserialize(cls, context): 118 def Deserialize(cls, context):
117 result = cls.__new__(cls) 119 result = cls.__new__(cls)
118 fields = {} 120 fields = {}
119 serialization_object.Deserialize(fields, context) 121 serialization_object.Deserialize(fields, context)
120 result._fields = fields 122 result._fields = fields
121 return result 123 return result
122 dictionary['Deserialize'] = classmethod(Deserialize) 124 dictionary['Deserialize'] = classmethod(Deserialize)
123 125
124 dictionary['__eq__'] = _StructEq(fields) 126 dictionary['__eq__'] = _StructEq(fields)
125 dictionary['__ne__'] = _StructNe 127 dictionary['__ne__'] = _StructNe
126 128
127 return type.__new__(mcs, name, bases, dictionary) 129 return type.__new__(mcs, name, bases, dictionary)
128 130
129 # Prevent adding new attributes, or mutating constants. 131 # Prevent adding new attributes, or mutating constants.
130 def __setattr__(cls, key, value): 132 def __setattr__(cls, key, value):
131 raise AttributeError('can\'t set attribute') 133 raise AttributeError('can\'t set attribute')
132 134
133 # Prevent deleting constants. 135 # Prevent deleting constants.
134 def __delattr__(cls, key): 136 def __delattr__(cls, key):
135 raise AttributeError('can\'t delete attribute') 137 raise AttributeError('can\'t delete attribute')
136 138
137 139
140 class MojoUnionType(type):
141
142 def __new__(mcs, name, bases, dictionary):
143 dictionary['__slots__'] = ('_fields', '_tags', '_tag', '_data')
144 descriptor = dictionary.pop('DESCRIPTOR', {})
145
146 fields = descriptor.get('fields', [])
147 def _BuildUnionProperty(field):
148
149 # pylint: disable=W0212
150 def Get(self):
151 if self._tag != self._tags[field.name]:
qsr 2015/07/16 09:35:25 I might be wrong, but I think you do not need to p
azani 2015/07/16 21:57:38 Done.
152 raise AttributeError('%s is not currently set' % field.name,
153 field.name, self._tag_names[self._tag])
154 return self._data
155
156 # pylint: disable=W0212
157 def Set(self, value):
158 self._tag = self._tags[field.name]
159 self._data = field.field_type.Convert(value)
160
161 return property(Get, Set)
162
163 for field in fields:
164 dictionary[field.name] = _BuildUnionProperty(field)
165
166 dictionary['_tags'] = {field.name: field.index for field in fields}
167 dictionary['_tag_names'] = {field.index: field.name for field in fields}
168
169 def UnionInit(self, **kwargs):
170 items = kwargs.items()
171 if len(items) == 0:
172 return
173
174 if len(items) > 1:
175 raise TypeError('only 1 member may be set on a union.')
176
177 setattr(self, items[0][0], items[0][1])
178 dictionary['__init__'] = UnionInit
179
180 serializer = serialization.UnionSerializer(fields)
181 def SerializeUnionInline(self, handle_offset=0):
182 return serializer.SerializeInline(self, handle_offset)
183 dictionary['SerializeInline'] = SerializeUnionInline
184
185 def SerializeUnion(self, handle_offset=0):
186 return serializer.Serialize(self, handle_offset)
187 dictionary['Serialize'] = SerializeUnion
188
189 def DeserializeUnion(cls, context):
190 return serializer.Deserialize(context, cls)
191 dictionary['Deserialize'] = classmethod(DeserializeUnion)
192
193 def GetTag(self):
194 return self._tag
195 dictionary['tag'] = property(GetTag, None)
qsr 2015/07/16 09:35:25 What can I compare tag with? I think you are missi
azani 2015/07/16 21:57:38 Done.
196
197 def GetData(self):
198 return self._data
199 dictionary['data'] = property(GetData, None)
200
201 def UnionEq(self, other):
202 return (
203 (type(self) is type(other))
204 and (self.tag == other.tag)
205 and (self.data == other.data))
206 dictionary['__eq__'] = UnionEq
207
208 def UnionNe(self, other):
209 return not self.__eq__(other)
210 dictionary['__ne__'] = UnionNe
211
212 def UnionStr(self):
213 return '<%s.%s(%s): %s>' % (
214 self.__class__.__name__,
215 self._tag_names[self.tag],
216 self.tag,
217 self.data)
218 dictionary['__str__'] = UnionStr
219 dictionary['__repr__'] = UnionStr
220
221 return type.__new__(mcs, name, bases, dictionary)
222
223
224 class UnionData(object):
225 __slots__ = ('data', 'tag')
qsr 2015/07/16 09:35:25 What is this used for.
azani 2015/07/16 21:57:38 Sorry, left over from previous iteration.
226
227
228
229
138 class InterfaceRequest(object): 230 class InterfaceRequest(object):
139 """ 231 """
140 An interface request allows to send a request for an interface to a remote 232 An interface request allows to send a request for an interface to a remote
141 object and start using it immediately. 233 object and start using it immediately.
142 """ 234 """
143 235
144 def __init__(self, handle): 236 def __init__(self, handle):
145 self._handle = handle 237 self._handle = handle
146 238
147 def IsPending(self): 239 def IsPending(self):
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 if type(self) is not type(other): 296 if type(self) is not type(other):
205 return False 297 return False
206 for field in fields: 298 for field in fields:
207 if getattr(self, field.name) != getattr(other, field.name): 299 if getattr(self, field.name) != getattr(other, field.name):
208 return False 300 return False
209 return True 301 return True
210 return _Eq 302 return _Eq
211 303
212 def _StructNe(self, other): 304 def _StructNe(self, other):
213 return not self.__eq__(other) 305 return not self.__eq__(other)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698