Chromium Code Reviews| 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: "U", | |
|
viettrungluu
2014/07/15 16:08:26
Maybe this should be "ULL"?
Sam McNally
2014/07/16 01:20:18
Done.
| |
| 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 |