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

Side by Side Diff: mojo/public/tools/bindings/pylib/mojom/generate/module.py

Issue 437643002: Support nullable types in mojom. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 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 # This module's classes provide an interface to mojo modules. Modules are 5 # This module's classes provide an interface to mojo modules. Modules are
6 # collections of interfaces and structs to be used by mojo ipc clients and 6 # collections of interfaces and structs to be used by mojo ipc clients and
7 # servers. 7 # servers.
8 # 8 #
9 # A simple interface would be created this way: 9 # A simple interface would be created this way:
10 # module = mojom.generate.module.Module('Foo') 10 # module = mojom.generate.module.Module('Foo')
11 # interface = module.AddInterface('Bar') 11 # interface = module.AddInterface('Bar')
12 # method = interface.AddMethod('Tat', 0) 12 # method = interface.AddMethod('Tat', 0)
13 # method.AddParameter('baz', 0, mojom.INT32) 13 # method.AddParameter('baz', 0, mojom.INT32)
14 # 14
15 15
16 class Kind(object): 16 class Kind(object):
17 def __init__(self, spec=None): 17 def __init__(self, spec=None):
18 self.spec = spec 18 self.spec = spec
19 self.parent_kind = None 19 self.parent_kind = None
20 20
21
22 class ReferenceKind(Kind):
23 """ReferenceKind represents pointer types and handle types.
24 A type is nullable means that NULL (for pointer types) or invalid handle
25 (for handle types) is a legal value for the type.
26 """
27
28 def __init__(self, spec=None, is_nullable=False):
29 assert spec is None or is_nullable == spec.startswith('?')
30 Kind.__init__(self, spec)
31 self.is_nullable = is_nullable
32 self.shared_definition = {}
33
34 def MakeNullableKind(self):
35 assert not self.is_nullable
36
37 if self == STRING:
38 return NULLABLE_STRING
39 if self == HANDLE:
40 return NULLABLE_HANDLE
41 if self == DCPIPE:
42 return NULLABLE_DCPIPE
43 if self == DPPIPE:
44 return NULLABLE_DPPIPE
45 if self == MSGPIPE:
46 return NULLABLE_MSGPIPE
47 if self == SHAREDBUFFER:
48 return NULLABLE_SHAREDBUFFER
49
50 nullable_kind = type(self)()
51 nullable_kind.shared_definition = self.shared_definition
52 if self.spec is not None:
53 nullable_kind.spec = '?' + self.spec
54 nullable_kind.is_nullable = True
55
56 return nullable_kind
57
58 @classmethod
59 def AddSharedProperty(cls, name):
60 """Adds a property |name| to |cls|, which accesses the corresponding item in
61 |shared_definition|.
62
63 The reason of adding such indirection is to enable sharing definition
64 between a reference kind and its nullable variation. For example:
65 a = Struct('test_struct_1')
66 b = a.MakeNullableKind()
67 a.name = 'test_struct_2'
68 print b.name # Outputs 'test_struct_2'.
69 """
70 def Get(self):
71 return self.shared_definition[name]
72
73 def Set(self, value):
74 self.shared_definition[name] = value
75
76 setattr(cls, name, property(Get, Set))
77
78
21 # Initialize the set of primitive types. These can be accessed by clients. 79 # Initialize the set of primitive types. These can be accessed by clients.
22 BOOL = Kind('b') 80 BOOL = Kind('b')
23 INT8 = Kind('i8') 81 INT8 = Kind('i8')
24 INT16 = Kind('i16') 82 INT16 = Kind('i16')
25 INT32 = Kind('i32') 83 INT32 = Kind('i32')
26 INT64 = Kind('i64') 84 INT64 = Kind('i64')
27 UINT8 = Kind('u8') 85 UINT8 = Kind('u8')
28 UINT16 = Kind('u16') 86 UINT16 = Kind('u16')
29 UINT32 = Kind('u32') 87 UINT32 = Kind('u32')
30 UINT64 = Kind('u64') 88 UINT64 = Kind('u64')
31 FLOAT = Kind('f') 89 FLOAT = Kind('f')
32 DOUBLE = Kind('d') 90 DOUBLE = Kind('d')
33 STRING = Kind('s') 91 STRING = ReferenceKind('s')
34 HANDLE = Kind('h') 92 HANDLE = ReferenceKind('h')
35 DCPIPE = Kind('h:d:c') 93 DCPIPE = ReferenceKind('h:d:c')
36 DPPIPE = Kind('h:d:p') 94 DPPIPE = ReferenceKind('h:d:p')
37 MSGPIPE = Kind('h:m') 95 MSGPIPE = ReferenceKind('h:m')
38 SHAREDBUFFER = Kind('h:s') 96 SHAREDBUFFER = ReferenceKind('h:s')
97 NULLABLE_STRING = ReferenceKind('?s', True)
98 NULLABLE_HANDLE = ReferenceKind('?h', True)
99 NULLABLE_DCPIPE = ReferenceKind('?h:d:c', True)
100 NULLABLE_DPPIPE = ReferenceKind('?h:d:p', True)
101 NULLABLE_MSGPIPE = ReferenceKind('?h:m', True)
102 NULLABLE_SHAREDBUFFER = ReferenceKind('?h:s', True)
39 103
40 104
41 # Collection of all Primitive types 105 # Collection of all Primitive types
42 PRIMITIVES = ( 106 PRIMITIVES = (
43 BOOL, 107 BOOL,
44 INT8, 108 INT8,
45 INT16, 109 INT16,
46 INT32, 110 INT32,
47 INT64, 111 INT64,
48 UINT8, 112 UINT8,
49 UINT16, 113 UINT16,
50 UINT32, 114 UINT32,
51 UINT64, 115 UINT64,
52 FLOAT, 116 FLOAT,
53 DOUBLE, 117 DOUBLE,
54 STRING, 118 STRING,
55 HANDLE, 119 HANDLE,
56 DCPIPE, 120 DCPIPE,
57 DPPIPE, 121 DPPIPE,
58 MSGPIPE, 122 MSGPIPE,
59 SHAREDBUFFER 123 SHAREDBUFFER,
124 NULLABLE_STRING,
125 NULLABLE_HANDLE,
126 NULLABLE_DCPIPE,
127 NULLABLE_DPPIPE,
128 NULLABLE_MSGPIPE,
129 NULLABLE_SHAREDBUFFER
60 ) 130 )
61 131
62 132
63 class NamedValue(object): 133 class NamedValue(object):
64 def __init__(self, module, parent_kind, name): 134 def __init__(self, module, parent_kind, name):
65 self.module = module 135 self.module = module
66 self.namespace = module.namespace 136 self.namespace = module.namespace
67 self.parent_kind = parent_kind 137 self.parent_kind = parent_kind
68 self.name = name 138 self.name = name
69 self.imported_from = None 139 self.imported_from = None
(...skipping 23 matching lines...) Expand all
93 163
94 164
95 class Field(object): 165 class Field(object):
96 def __init__(self, name=None, kind=None, ordinal=None, default=None): 166 def __init__(self, name=None, kind=None, ordinal=None, default=None):
97 self.name = name 167 self.name = name
98 self.kind = kind 168 self.kind = kind
99 self.ordinal = ordinal 169 self.ordinal = ordinal
100 self.default = default 170 self.default = default
101 171
102 172
103 class Struct(Kind): 173 class Struct(ReferenceKind):
174 ReferenceKind.AddSharedProperty('name')
175 ReferenceKind.AddSharedProperty('module')
176 ReferenceKind.AddSharedProperty('imported_from')
177 ReferenceKind.AddSharedProperty('fields')
178
104 def __init__(self, name=None, module=None): 179 def __init__(self, name=None, module=None):
105 self.name = name
106 self.module = module
107 self.imported_from = None
108 if name is not None: 180 if name is not None:
109 spec = 'x:' + name 181 spec = 'x:' + name
110 else: 182 else:
111 spec = None 183 spec = None
112 Kind.__init__(self, spec) 184 ReferenceKind.__init__(self, spec)
185 self.name = name
186 self.module = module
187 self.imported_from = None
113 self.fields = [] 188 self.fields = []
114 189
115 def AddField(self, name, kind, ordinal=None, default=None): 190 def AddField(self, name, kind, ordinal=None, default=None):
116 field = Field(name, kind, ordinal, default) 191 field = Field(name, kind, ordinal, default)
117 self.fields.append(field) 192 self.fields.append(field)
118 return field 193 return field
119 194
120 195
121 class Array(Kind): 196 class Array(ReferenceKind):
197 ReferenceKind.AddSharedProperty('kind')
198
122 def __init__(self, kind=None): 199 def __init__(self, kind=None):
200 if kind is not None:
201 ReferenceKind.__init__(self, 'a:' + kind.spec)
202 else:
203 ReferenceKind.__init__(self)
123 self.kind = kind 204 self.kind = kind
205
206
207 class FixedArray(ReferenceKind):
208 ReferenceKind.AddSharedProperty('kind')
209 ReferenceKind.AddSharedProperty('length')
210
211 def __init__(self, length=-1, kind=None):
124 if kind is not None: 212 if kind is not None:
125 Kind.__init__(self, 'a:' + kind.spec) 213 ReferenceKind.__init__(self, 'a%d:%s' % (length, kind.spec))
126 else: 214 else:
127 Kind.__init__(self) 215 ReferenceKind.__init__(self)
128
129 class FixedArray(Kind):
130 def __init__(self, length, kind=None):
131 self.kind = kind 216 self.kind = kind
132 self.length = length 217 self.length = length
218
219
220 class InterfaceRequest(ReferenceKind):
221 ReferenceKind.AddSharedProperty('kind')
222
223 def __init__(self, kind=None):
133 if kind is not None: 224 if kind is not None:
134 Kind.__init__(self, 'a' + length + ':' + kind.spec) 225 ReferenceKind.__init__(self, 'r:' + kind.spec)
135 else: 226 else:
136 Kind.__init__(self) 227 ReferenceKind.__init__(self)
137
138 class InterfaceRequest(Kind):
139 def __init__(self, kind=None):
140 self.kind = kind 228 self.kind = kind
141 if kind is not None:
142 Kind.__init__(self, 'r:' + kind.spec)
143 else:
144 Kind.__init__(self)
145 229
146 230
147 class Parameter(object): 231 class Parameter(object):
148 def __init__(self, name=None, kind=None, ordinal=None, default=None): 232 def __init__(self, name=None, kind=None, ordinal=None, default=None):
149 self.name = name 233 self.name = name
150 self.ordinal = ordinal 234 self.ordinal = ordinal
151 self.kind = kind 235 self.kind = kind
152 self.default = default 236 self.default = default
153 237
154 238
(...skipping 11 matching lines...) Expand all
166 return parameter 250 return parameter
167 251
168 def AddResponseParameter(self, name, kind, ordinal=None, default=None): 252 def AddResponseParameter(self, name, kind, ordinal=None, default=None):
169 if self.response_parameters == None: 253 if self.response_parameters == None:
170 self.response_parameters = [] 254 self.response_parameters = []
171 parameter = Parameter(name, kind, ordinal, default) 255 parameter = Parameter(name, kind, ordinal, default)
172 self.response_parameters.append(parameter) 256 self.response_parameters.append(parameter)
173 return parameter 257 return parameter
174 258
175 259
176 class Interface(Kind): 260 class Interface(ReferenceKind):
261 ReferenceKind.AddSharedProperty('module')
262 ReferenceKind.AddSharedProperty('name')
263 ReferenceKind.AddSharedProperty('imported_from')
264 ReferenceKind.AddSharedProperty('client')
265 ReferenceKind.AddSharedProperty('methods')
266
177 def __init__(self, name=None, client=None, module=None): 267 def __init__(self, name=None, client=None, module=None):
178 self.module = module
179 self.name = name
180 self.imported_from = None
181 if name is not None: 268 if name is not None:
182 spec = 'x:' + name 269 spec = 'x:' + name
183 else: 270 else:
184 spec = None 271 spec = None
185 Kind.__init__(self, spec) 272 ReferenceKind.__init__(self, spec)
273 self.module = module
274 self.name = name
275 self.imported_from = None
186 self.client = client 276 self.client = client
187 self.methods = [] 277 self.methods = []
188 278
189 def AddMethod(self, name, ordinal=None): 279 def AddMethod(self, name, ordinal=None):
190 method = Method(self, name, ordinal=ordinal) 280 method = Method(self, name, ordinal=ordinal)
191 self.methods.append(method) 281 self.methods.append(method)
192 return method 282 return method
193 283
194 284
195 class EnumField(object): 285 class EnumField(object):
(...skipping 25 matching lines...) Expand all
221 311
222 def AddInterface(self, name): 312 def AddInterface(self, name):
223 interface=Interface(name, module=self); 313 interface=Interface(name, module=self);
224 self.interfaces.append(interface) 314 self.interfaces.append(interface)
225 return interface 315 return interface
226 316
227 def AddStruct(self, name): 317 def AddStruct(self, name):
228 struct=Struct(name, module=self) 318 struct=Struct(name, module=self)
229 self.structs.append(struct) 319 self.structs.append(struct)
230 return struct 320 return struct
OLDNEW
« no previous file with comments | « mojo/public/tools/bindings/pylib/mojom/generate/data.py ('k') | mojo/public/tools/bindings/pylib/mojom/generate/pack.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698