OLD | NEW |
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 """Generates C++ source files from a mojom.Module.""" | 5 """Generates C++ source files from a mojom.Module.""" |
6 | 6 |
7 import mojom.generate.generator as generator | 7 import mojom.generate.generator as generator |
8 import mojom.generate.module as mojom | 8 import mojom.generate.module as mojom |
9 import mojom.generate.pack as pack | 9 import mojom.generate.pack as pack |
10 from mojom.generate.template_expander import UseJinja | 10 from mojom.generate.template_expander import UseJinja |
(...skipping 11 matching lines...) Expand all Loading... |
22 mojom.HANDLE: "mojo::Handle", | 22 mojom.HANDLE: "mojo::Handle", |
23 mojom.DCPIPE: "mojo::DataPipeConsumerHandle", | 23 mojom.DCPIPE: "mojo::DataPipeConsumerHandle", |
24 mojom.DPPIPE: "mojo::DataPipeProducerHandle", | 24 mojom.DPPIPE: "mojo::DataPipeProducerHandle", |
25 mojom.MSGPIPE: "mojo::MessagePipeHandle", | 25 mojom.MSGPIPE: "mojo::MessagePipeHandle", |
26 mojom.SHAREDBUFFER: "mojo::SharedBufferHandle", | 26 mojom.SHAREDBUFFER: "mojo::SharedBufferHandle", |
27 mojom.INT64: "int64_t", | 27 mojom.INT64: "int64_t", |
28 mojom.UINT64: "uint64_t", | 28 mojom.UINT64: "uint64_t", |
29 mojom.DOUBLE: "double", | 29 mojom.DOUBLE: "double", |
30 } | 30 } |
31 | 31 |
| 32 _kind_to_cpp_literal_suffix = { |
| 33 mojom.UINT8: "U", |
| 34 mojom.UINT16: "U", |
| 35 mojom.UINT32: "U", |
| 36 mojom.FLOAT: "f", |
| 37 mojom.UINT64: "ULL", |
| 38 } |
| 39 |
| 40 def ConstantValue(constant): |
| 41 return ExpressionToText(constant.value, kind=constant.kind) |
| 42 |
32 def DefaultValue(field): | 43 def DefaultValue(field): |
33 if field.default: | 44 if field.default: |
34 if isinstance(field.kind, mojom.Struct): | 45 if isinstance(field.kind, mojom.Struct): |
35 assert field.default == "default" | 46 assert field.default == "default" |
36 return "%s::New()" % GetNameForKind(field.kind) | 47 return "%s::New()" % GetNameForKind(field.kind) |
37 return ExpressionToText(field.default) | 48 return ExpressionToText(field.default, kind=field.kind) |
38 return "" | 49 return "" |
39 | 50 |
40 def NamespaceToArray(namespace): | 51 def NamespaceToArray(namespace): |
41 return namespace.split('.') if namespace else [] | 52 return namespace.split('.') if namespace else [] |
42 | 53 |
43 def GetNameForKind(kind, internal = False): | 54 def GetNameForKind(kind, internal = False): |
44 parts = [] | 55 parts = [] |
45 if kind.imported_from: | 56 if kind.imported_from: |
46 parts.extend(NamespaceToArray(kind.imported_from["namespace"])) | 57 parts.extend(NamespaceToArray(kind.imported_from["namespace"])) |
47 if internal: | 58 if internal: |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 if kind.spec == 's': | 197 if kind.spec == 's': |
187 return "mojo::internal::StringPointer" | 198 return "mojo::internal::StringPointer" |
188 return _kind_to_cpp_type[kind] | 199 return _kind_to_cpp_type[kind] |
189 | 200 |
190 def IsStructWithHandles(struct): | 201 def IsStructWithHandles(struct): |
191 for pf in struct.packed.packed_fields: | 202 for pf in struct.packed.packed_fields: |
192 if generator.IsHandleKind(pf.field.kind): | 203 if generator.IsHandleKind(pf.field.kind): |
193 return True | 204 return True |
194 return False | 205 return False |
195 | 206 |
196 def TranslateConstants(token): | 207 def TranslateConstants(token, kind): |
197 if isinstance(token, (mojom.NamedValue, mojom.EnumValue)): | 208 if isinstance(token, (mojom.NamedValue, mojom.EnumValue)): |
198 # Both variable and enum constants are constructed like: | 209 # Both variable and enum constants are constructed like: |
199 # Namespace::Struct::CONSTANT_NAME | 210 # Namespace::Struct::CONSTANT_NAME |
200 name = [] | 211 name = [] |
201 if token.imported_from: | 212 if token.imported_from: |
202 name.extend(NamespaceToArray(token.namespace)) | 213 name.extend(NamespaceToArray(token.namespace)) |
203 if token.parent_kind: | 214 if token.parent_kind: |
204 name.append(token.parent_kind.name) | 215 name.append(token.parent_kind.name) |
205 name.append(token.name) | 216 name.append(token.name) |
206 return "::".join(name) | 217 return "::".join(name) |
207 return token | 218 return '%s%s' % (token, _kind_to_cpp_literal_suffix.get(kind, '')) |
208 | 219 |
209 def ExpressionToText(value): | 220 def ExpressionToText(value, kind=None): |
210 return TranslateConstants(value) | 221 return TranslateConstants(value, kind) |
211 | 222 |
212 def HasCallbacks(interface): | 223 def HasCallbacks(interface): |
213 for method in interface.methods: | 224 for method in interface.methods: |
214 if method.response_parameters != None: | 225 if method.response_parameters != None: |
215 return True | 226 return True |
216 return False | 227 return False |
217 | 228 |
218 def ShouldInlineStruct(struct): | 229 def ShouldInlineStruct(struct): |
219 # TODO(darin): Base this on the size of the wrapper class. | 230 # TODO(darin): Base this on the size of the wrapper class. |
220 if len(struct.fields) > 4: | 231 if len(struct.fields) > 4: |
221 return False | 232 return False |
222 for field in struct.fields: | 233 for field in struct.fields: |
223 if generator.IsHandleKind(field.kind) or generator.IsObjectKind(field.kind): | 234 if generator.IsHandleKind(field.kind) or generator.IsObjectKind(field.kind): |
224 return False | 235 return False |
225 return True | 236 return True |
226 | 237 |
227 _HEADER_SIZE = 8 | 238 _HEADER_SIZE = 8 |
228 | 239 |
229 class Generator(generator.Generator): | 240 class Generator(generator.Generator): |
230 | 241 |
231 cpp_filters = { | 242 cpp_filters = { |
| 243 "constant_value": ConstantValue, |
232 "cpp_const_wrapper_type": GetCppConstWrapperType, | 244 "cpp_const_wrapper_type": GetCppConstWrapperType, |
233 "cpp_field_type": GetCppFieldType, | 245 "cpp_field_type": GetCppFieldType, |
234 "cpp_pod_type": GetCppPodType, | 246 "cpp_pod_type": GetCppPodType, |
235 "cpp_result_type": GetCppResultWrapperType, | 247 "cpp_result_type": GetCppResultWrapperType, |
236 "cpp_type": GetCppType, | 248 "cpp_type": GetCppType, |
237 "cpp_wrapper_type": GetCppWrapperType, | 249 "cpp_wrapper_type": GetCppWrapperType, |
238 "default_value": DefaultValue, | 250 "default_value": DefaultValue, |
239 "expected_array_size": generator.ExpectedArraySize, | 251 "expected_array_size": generator.ExpectedArraySize, |
240 "expression_to_text": ExpressionToText, | 252 "expression_to_text": ExpressionToText, |
241 "get_name_for_kind": GetNameForKind, | 253 "get_name_for_kind": GetNameForKind, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 291 |
280 @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters) | 292 @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters) |
281 def GenerateModuleSource(self): | 293 def GenerateModuleSource(self): |
282 return self.GetJinjaExports() | 294 return self.GetJinjaExports() |
283 | 295 |
284 def GenerateFiles(self, args): | 296 def GenerateFiles(self, args): |
285 self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name) | 297 self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name) |
286 self.Write(self.GenerateModuleInternalHeader(), | 298 self.Write(self.GenerateModuleInternalHeader(), |
287 "%s-internal.h" % self.module.name) | 299 "%s-internal.h" % self.module.name) |
288 self.Write(self.GenerateModuleSource(), "%s.cc" % self.module.name) | 300 self.Write(self.GenerateModuleSource(), "%s.cc" % self.module.name) |
OLD | NEW |