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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/pylib/mojom/generate/module.py
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
index c55b85e2e3313667dfaafb2bde993cbc12570ea2..03a684a2505ab01b577cbe2840d46f9e05ee3c47 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
@@ -11,31 +11,95 @@
# interface = module.AddInterface('Bar')
# method = interface.AddMethod('Tat', 0)
# method.AddParameter('baz', 0, mojom.INT32)
-#
+
class Kind(object):
def __init__(self, spec=None):
self.spec = spec
self.parent_kind = None
+
+class ReferenceKind(Kind):
+ """ReferenceKind represents pointer types and handle types.
+ A type is nullable means that NULL (for pointer types) or invalid handle
+ (for handle types) is a legal value for the type.
+ """
+
+ def __init__(self, spec=None, is_nullable=False):
+ assert spec is None or is_nullable == spec.startswith('?')
+ Kind.__init__(self, spec)
+ self.is_nullable = is_nullable
+ self.shared_definition = {}
+
+ def MakeNullableKind(self):
+ assert not self.is_nullable
+
+ if self == STRING:
+ return NULLABLE_STRING
+ if self == HANDLE:
+ return NULLABLE_HANDLE
+ if self == DCPIPE:
+ return NULLABLE_DCPIPE
+ if self == DPPIPE:
+ return NULLABLE_DPPIPE
+ if self == MSGPIPE:
+ return NULLABLE_MSGPIPE
+ if self == SHAREDBUFFER:
+ return NULLABLE_SHAREDBUFFER
+
+ nullable_kind = type(self)()
+ nullable_kind.shared_definition = self.shared_definition
+ if self.spec is not None:
+ nullable_kind.spec = '?' + self.spec
+ nullable_kind.is_nullable = True
+
+ return nullable_kind
+
+ @classmethod
+ def AddSharedProperty(cls, name):
+ """Adds a property |name| to |cls|, which accesses the corresponding item in
+ |shared_definition|.
+
+ The reason of adding such indirection is to enable sharing definition
+ between a reference kind and its nullable variation. For example:
+ a = Struct('test_struct_1')
+ b = a.MakeNullableKind()
+ a.name = 'test_struct_2'
+ print b.name # Outputs 'test_struct_2'.
+ """
+ def Get(self):
+ return self.shared_definition[name]
+
+ def Set(self, value):
+ self.shared_definition[name] = value
+
+ setattr(cls, name, property(Get, Set))
+
+
# Initialize the set of primitive types. These can be accessed by clients.
-BOOL = Kind('b')
-INT8 = Kind('i8')
-INT16 = Kind('i16')
-INT32 = Kind('i32')
-INT64 = Kind('i64')
-UINT8 = Kind('u8')
-UINT16 = Kind('u16')
-UINT32 = Kind('u32')
-UINT64 = Kind('u64')
-FLOAT = Kind('f')
-DOUBLE = Kind('d')
-STRING = Kind('s')
-HANDLE = Kind('h')
-DCPIPE = Kind('h:d:c')
-DPPIPE = Kind('h:d:p')
-MSGPIPE = Kind('h:m')
-SHAREDBUFFER = Kind('h:s')
+BOOL = Kind('b')
+INT8 = Kind('i8')
+INT16 = Kind('i16')
+INT32 = Kind('i32')
+INT64 = Kind('i64')
+UINT8 = Kind('u8')
+UINT16 = Kind('u16')
+UINT32 = Kind('u32')
+UINT64 = Kind('u64')
+FLOAT = Kind('f')
+DOUBLE = Kind('d')
+STRING = ReferenceKind('s')
+HANDLE = ReferenceKind('h')
+DCPIPE = ReferenceKind('h:d:c')
+DPPIPE = ReferenceKind('h:d:p')
+MSGPIPE = ReferenceKind('h:m')
+SHAREDBUFFER = ReferenceKind('h:s')
+NULLABLE_STRING = ReferenceKind('?s', True)
+NULLABLE_HANDLE = ReferenceKind('?h', True)
+NULLABLE_DCPIPE = ReferenceKind('?h:d:c', True)
+NULLABLE_DPPIPE = ReferenceKind('?h:d:p', True)
+NULLABLE_MSGPIPE = ReferenceKind('?h:m', True)
+NULLABLE_SHAREDBUFFER = ReferenceKind('?h:s', True)
# Collection of all Primitive types
@@ -56,7 +120,13 @@ PRIMITIVES = (
DCPIPE,
DPPIPE,
MSGPIPE,
- SHAREDBUFFER
+ SHAREDBUFFER,
+ NULLABLE_STRING,
+ NULLABLE_HANDLE,
+ NULLABLE_DCPIPE,
+ NULLABLE_DPPIPE,
+ NULLABLE_MSGPIPE,
+ NULLABLE_SHAREDBUFFER
)
@@ -100,16 +170,21 @@ class Field(object):
self.default = default
-class Struct(Kind):
+class Struct(ReferenceKind):
+ ReferenceKind.AddSharedProperty('name')
+ ReferenceKind.AddSharedProperty('module')
+ ReferenceKind.AddSharedProperty('imported_from')
+ ReferenceKind.AddSharedProperty('fields')
+
def __init__(self, name=None, module=None):
- self.name = name
- self.module = module
- self.imported_from = None
if name is not None:
spec = 'x:' + name
else:
spec = None
- Kind.__init__(self, spec)
+ ReferenceKind.__init__(self, spec)
+ self.name = name
+ self.module = module
+ self.imported_from = None
self.fields = []
def AddField(self, name, kind, ordinal=None, default=None):
@@ -118,30 +193,39 @@ class Struct(Kind):
return field
-class Array(Kind):
+class Array(ReferenceKind):
+ ReferenceKind.AddSharedProperty('kind')
+
def __init__(self, kind=None):
- self.kind = kind
if kind is not None:
- Kind.__init__(self, 'a:' + kind.spec)
+ ReferenceKind.__init__(self, 'a:' + kind.spec)
else:
- Kind.__init__(self)
-
-class FixedArray(Kind):
- def __init__(self, length, kind=None):
+ ReferenceKind.__init__(self)
self.kind = kind
- self.length = length
+
+
+class FixedArray(ReferenceKind):
+ ReferenceKind.AddSharedProperty('kind')
+ ReferenceKind.AddSharedProperty('length')
+
+ def __init__(self, length=-1, kind=None):
if kind is not None:
- Kind.__init__(self, 'a' + length + ':' + kind.spec)
+ ReferenceKind.__init__(self, 'a%d:%s' % (length, kind.spec))
else:
- Kind.__init__(self)
+ ReferenceKind.__init__(self)
+ self.kind = kind
+ self.length = length
+
+
+class InterfaceRequest(ReferenceKind):
+ ReferenceKind.AddSharedProperty('kind')
-class InterfaceRequest(Kind):
def __init__(self, kind=None):
- self.kind = kind
if kind is not None:
- Kind.__init__(self, 'r:' + kind.spec)
+ ReferenceKind.__init__(self, 'r:' + kind.spec)
else:
- Kind.__init__(self)
+ ReferenceKind.__init__(self)
+ self.kind = kind
class Parameter(object):
@@ -173,16 +257,22 @@ class Method(object):
return parameter
-class Interface(Kind):
+class Interface(ReferenceKind):
+ ReferenceKind.AddSharedProperty('module')
+ ReferenceKind.AddSharedProperty('name')
+ ReferenceKind.AddSharedProperty('imported_from')
+ ReferenceKind.AddSharedProperty('client')
+ ReferenceKind.AddSharedProperty('methods')
+
def __init__(self, name=None, client=None, module=None):
- self.module = module
- self.name = name
- self.imported_from = None
if name is not None:
spec = 'x:' + name
else:
spec = None
- Kind.__init__(self, spec)
+ ReferenceKind.__init__(self, spec)
+ self.module = module
+ self.name = name
+ self.imported_from = None
self.client = client
self.methods = []
« 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