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

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: changes according to darin's suggestions 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..9bfdf829572957ef119c11db7a222d1f878df6db 100644
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
@@ -13,29 +13,49 @@
# 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
+
+
# 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')
+NLBL_STRING = ReferenceKind('?s', True)
+NLBL_HANDLE = ReferenceKind('?h', True)
+NLBL_DCPIPE = ReferenceKind('?h:d:c', True)
+NLBL_DPPIPE = ReferenceKind('?h:d:p', True)
+NLBL_MSGPIPE = ReferenceKind('?h:m', True)
+NLBL_SHAREDBUFFER = ReferenceKind('?h:s', True)
# Collection of all Primitive types
@@ -56,7 +76,13 @@ PRIMITIVES = (
DCPIPE,
DPPIPE,
MSGPIPE,
- SHAREDBUFFER
+ SHAREDBUFFER,
+ NLBL_STRING,
+ NLBL_HANDLE,
+ NLBL_DCPIPE,
+ NLBL_DPPIPE,
+ NLBL_MSGPIPE,
+ NLBL_SHAREDBUFFER
)
@@ -100,7 +126,7 @@ class Field(object):
self.default = default
-class Struct(Kind):
+class Struct(ReferenceKind):
def __init__(self, name=None, module=None):
self.name = name
self.module = module
@@ -109,7 +135,7 @@ class Struct(Kind):
spec = 'x:' + name
else:
spec = None
- Kind.__init__(self, spec)
+ ReferenceKind.__init__(self, spec)
self.fields = []
def AddField(self, name, kind, ordinal=None, default=None):
@@ -118,30 +144,32 @@ class Struct(Kind):
return field
-class Array(Kind):
+class Array(ReferenceKind):
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)
+ ReferenceKind.__init__(self)
+
-class FixedArray(Kind):
- def __init__(self, length, kind=None):
+class FixedArray(ReferenceKind):
+ def __init__(self, length=-1, kind=None):
self.kind = kind
self.length = length
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)
+
-class InterfaceRequest(Kind):
+class InterfaceRequest(ReferenceKind):
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)
class Parameter(object):
@@ -173,7 +201,7 @@ class Method(object):
return parameter
-class Interface(Kind):
+class Interface(ReferenceKind):
def __init__(self, name=None, client=None, module=None):
self.module = module
self.name = name
@@ -182,7 +210,7 @@ class Interface(Kind):
spec = 'x:' + name
else:
spec = None
- Kind.__init__(self, spec)
+ ReferenceKind.__init__(self, spec)
self.client = client
self.methods = []
@@ -228,3 +256,30 @@ class Module(object):
struct=Struct(name, module=self)
self.structs.append(struct)
return struct
+
+
+def MakeNullableKind(ref_kind):
+ assert isinstance(ref_kind, ReferenceKind)
+ assert not ref_kind.is_nullable
+
+ if ref_kind == STRING:
+ return NLBL_STRING
+ if ref_kind == HANDLE:
+ return NLBL_HANDLE
+ if ref_kind == DCPIPE:
+ return NLBL_DCPIPE
+ if ref_kind == DPPIPE:
+ return NLBL_DPPIPE
+ if ref_kind == MSGPIPE:
+ return NLBL_MSGPIPE
+ if ref_kind == SHAREDBUFFER:
+ return NLBL_SHAREDBUFFER
+
+ nullable_kind = type(ref_kind)()
+ # Make a shallow copy of the instance's attributes.
+ nullable_kind.__dict__ = ref_kind.__dict__.copy()
yzshen1 2014/08/05 05:11:43 Hmm... Thinking more about this solution and it se
yzshen1 2014/08/06 21:39:27 I think I have addressed this issue in the latest
+ if ref_kind.spec is not None:
+ nullable_kind.spec = '?' + ref_kind.spec
+ nullable_kind.is_nullable = True
+
+ return nullable_kind
« 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