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

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_cpp_generator.py

Issue 397453004: Mojo: Correctly handle large unsigned integer literals. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ULL Created 6 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 | 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 """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
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
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
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698