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 # 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') |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 287 if self.attributes else None | 287 if self.attributes else None |
| 288 | 288 |
| 289 | 289 |
| 290 class StructField(Field): pass | 290 class StructField(Field): pass |
| 291 | 291 |
| 292 | 292 |
| 293 class UnionField(Field): pass | 293 class UnionField(Field): pass |
| 294 | 294 |
| 295 | 295 |
| 296 class Struct(ReferenceKind): | 296 class Struct(ReferenceKind): |
| 297 """A struct with typed fields. | |
| 298 | |
| 299 Attributes: | |
| 300 name: {str} The name of the struct type. | |
| 301 native_only: {bool} Does the struct have a body (i.e. any fields) or is it | |
| 302 purely a native struct that must be type-mapped. | |
| 303 module: {Module} The defining module. | |
| 304 imported_from: {dict} Information about where this union was | |
| 305 imported from. | |
| 306 fields: {List[StructField]} The members of the union. | |
| 307 attributes: {dict} Additional information about the struct, such as | |
| 308 which Java class name to use to represent it in the generated | |
| 309 bindings. | |
| 310 """ | |
| 311 | |
| 297 ReferenceKind.AddSharedProperty('name') | 312 ReferenceKind.AddSharedProperty('name') |
| 298 ReferenceKind.AddSharedProperty('native_only') | 313 ReferenceKind.AddSharedProperty('native_only') |
| 299 ReferenceKind.AddSharedProperty('module') | 314 ReferenceKind.AddSharedProperty('module') |
| 300 ReferenceKind.AddSharedProperty('imported_from') | 315 ReferenceKind.AddSharedProperty('imported_from') |
| 301 ReferenceKind.AddSharedProperty('fields') | 316 ReferenceKind.AddSharedProperty('fields') |
| 302 ReferenceKind.AddSharedProperty('attributes') | 317 ReferenceKind.AddSharedProperty('attributes') |
| 303 | 318 |
| 304 def __init__(self, name=None, module=None, attributes=None): | 319 def __init__(self, name=None, module=None, attributes=None): |
| 305 if name is not None: | 320 if name is not None: |
| 306 spec = 'x:' + name | 321 spec = 'x:' + name |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 ReferenceKind.AddSharedProperty('key_kind') | 433 ReferenceKind.AddSharedProperty('key_kind') |
| 419 ReferenceKind.AddSharedProperty('value_kind') | 434 ReferenceKind.AddSharedProperty('value_kind') |
| 420 | 435 |
| 421 def __init__(self, key_kind=None, value_kind=None): | 436 def __init__(self, key_kind=None, value_kind=None): |
| 422 if (key_kind is not None and value_kind is not None): | 437 if (key_kind is not None and value_kind is not None): |
| 423 ReferenceKind.__init__(self, | 438 ReferenceKind.__init__(self, |
| 424 'm[' + key_kind.spec + '][' + value_kind.spec + | 439 'm[' + key_kind.spec + '][' + value_kind.spec + |
| 425 ']') | 440 ']') |
| 426 if IsNullableKind(key_kind): | 441 if IsNullableKind(key_kind): |
| 427 raise Exception("Nullable kinds cannot be keys in maps.") | 442 raise Exception("Nullable kinds cannot be keys in maps.") |
| 428 if IsStructKind(key_kind): | |
| 429 # TODO(erg): It would sometimes be nice if we could key on struct | |
| 430 # values. However, what happens if the struct has a handle in it? Or | |
| 431 # non-copyable data like an array? | |
| 432 raise Exception("Structs cannot be keys in maps.") | |
| 433 if IsAnyHandleKind(key_kind): | 443 if IsAnyHandleKind(key_kind): |
| 434 raise Exception("Handles cannot be keys in maps.") | 444 raise Exception("Handles cannot be keys in maps.") |
| 435 if IsAnyInterfaceKind(key_kind): | 445 if IsAnyInterfaceKind(key_kind): |
| 436 raise Exception("Interfaces cannot be keys in maps.") | 446 raise Exception("Interfaces cannot be keys in maps.") |
| 437 if IsArrayKind(key_kind): | 447 if IsArrayKind(key_kind): |
| 438 raise Exception("Arrays cannot be keys in maps.") | 448 raise Exception("Arrays cannot be keys in maps.") |
| 439 else: | 449 else: |
| 440 ReferenceKind.__init__(self) | 450 ReferenceKind.__init__(self) |
| 441 | 451 |
| 442 self.key_kind = key_kind | 452 self.key_kind = key_kind |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 833 if _ContainsAssociatedKinds(param.kind, visited_kinds): | 843 if _ContainsAssociatedKinds(param.kind, visited_kinds): |
| 834 return True | 844 return True |
| 835 return False | 845 return False |
| 836 | 846 |
| 837 | 847 |
| 838 def HasSyncMethods(interface): | 848 def HasSyncMethods(interface): |
| 839 for method in interface.methods: | 849 for method in interface.methods: |
| 840 if method.sync: | 850 if method.sync: |
| 841 return True | 851 return True |
| 842 return False | 852 return False |
| 853 | |
| 854 | |
| 855 def ContainsHandles(kind): | |
| 856 """Check if the kind contains any handles. | |
| 857 | |
| 858 This check is recursive so it checks all struct fields, containers elements, | |
| 859 etc. | |
| 860 | |
| 861 Args: | |
| 862 struct: {Kind} The kind to check. | |
| 863 | |
| 864 Returns: | |
| 865 {bool}: True if the kind contains handles. | |
| 866 """ | |
| 867 # We remember the types we already checked to avoid infinite recursion when | |
| 868 # checking recursive (or mutually recursive) types: | |
| 869 checked = set() | |
| 870 def Check(kind): | |
| 871 if kind.spec in checked: | |
| 872 return False | |
| 873 checked.add(kind.spec) | |
| 874 if IsStructKind(kind): | |
| 875 if kind.native_only: | |
| 876 # TODO(tibell): We don't know if user-defined types contain handles. | |
|
yzshen1
2016/09/20 23:44:40
Native-only types are serialized using old IPC::Pa
tibell
2016/09/21 07:10:54
Done.
| |
| 877 return True | |
| 878 return any(Check(field.kind) for field in kind.fields) | |
| 879 elif IsUnionKind(kind): | |
| 880 return any(Check(field.kind) for field in kind.fields) | |
| 881 elif IsAnyHandleKind(kind): | |
| 882 return True | |
| 883 elif IsAnyInterfaceKind(kind): | |
| 884 # Interfaces are wrappers around handles. | |
| 885 return True | |
| 886 elif IsArrayKind(kind): | |
| 887 return Check(kind.kind) | |
| 888 elif IsMapKind(kind): | |
| 889 return Check(kind.key_kind) or Check(kind.value_kind) | |
| 890 else: | |
| 891 return False | |
| 892 return Check(kind) | |
| OLD | NEW |