[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like |
Date: |
Thu, 25 Feb 2016 16:38:48 -0700 |
QAPISchemaType.c_type() was a bit awkward. Rather than having two
optional orthogonal boolean flags that should never both be true,
and where all callers pass a compile-time constant, provide three
different method names that can be overridden as needed, and where
the caller just uses the right variant. It requires slightly more
Python, but is arguably easier to read.
Suggested-by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
---
v2: no change
---
scripts/qapi.py | 38 +++++++++++++++++++++++++++++---------
scripts/qapi-types.py | 2 +-
2 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index d5f4e28..32f37d8 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -826,8 +826,17 @@ class QAPISchemaVisitor(object):
class QAPISchemaType(QAPISchemaEntity):
- def c_type(self, is_param=False, is_unboxed=False):
- return c_name(self.name) + pointer_suffix
+ # Normal usage of the type, such as declaring a local variable
+ def c_type(self):
+ pass
+
+ # Use of a type in a parameter list
+ def c_param_type(self):
+ return self.c_type()
+
+ # Use of a type in a struct declaration
+ def c_unboxed_type(self):
+ return self.c_type()
def c_null(self):
return 'NULL'
@@ -859,8 +868,11 @@ class QAPISchemaBuiltinType(QAPISchemaType):
def c_name(self):
return self.name
- def c_type(self, is_param=False, is_unboxed=False):
- if is_param and self.name == 'str':
+ def c_type(self):
+ return self._c_type_name
+
+ def c_param_type(self):
+ if self.name == 'str':
return 'const ' + self._c_type_name
return self._c_type_name
@@ -893,7 +905,7 @@ class QAPISchemaEnumType(QAPISchemaType):
# See QAPISchema._make_implicit_enum_type()
return self.name.endswith('Kind')
- def c_type(self, is_param=False, is_unboxed=False):
+ def c_type(self):
return c_name(self.name)
def member_names(self):
@@ -925,6 +937,9 @@ class QAPISchemaArrayType(QAPISchemaType):
def is_implicit(self):
return True
+ def c_type(self):
+ return c_name(self.name) + pointer_suffix
+
def json_type(self):
return 'array'
@@ -994,12 +1009,14 @@ class QAPISchemaObjectType(QAPISchemaType):
assert not self.is_implicit()
return QAPISchemaType.c_name(self)
- def c_type(self, is_param=False, is_unboxed=False):
+ def c_type(self):
assert not self.is_implicit()
- if is_unboxed:
- return c_name(self.name)
return c_name(self.name) + pointer_suffix
+ def c_unboxed_type(self):
+ assert not self.is_implicit()
+ return c_name(self.name)
+
def json_type(self):
return 'object'
@@ -1140,6 +1157,9 @@ class QAPISchemaAlternateType(QAPISchemaType):
for v in self.variants.variants:
v.check_clash(self.info, seen)
+ def c_type(self):
+ return c_name(self.name) + pointer_suffix
+
def json_type(self):
return 'value'
@@ -1634,7 +1654,7 @@ def gen_params(arg_type, extra):
sep = ', '
if memb.optional:
ret += 'bool has_%s, ' % c_name(memb.name)
- ret += '%s %s' % (memb.type.c_type(is_param=True), c_name(memb.name))
+ ret += '%s %s' % (memb.type.c_param_type(), c_name(memb.name))
if extra:
ret += sep + extra
return ret
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 161443e..ce6d6f9 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -140,7 +140,7 @@ def gen_variants(variants):
ret += mcgen('''
%(c_type)s %(c_name)s;
''',
- c_type=var.type.c_type(is_unboxed=True),
+ c_type=var.type.c_unboxed_type(),
c_name=c_name(var.name))
ret += mcgen('''
--
2.5.0
- [Qemu-devel] [PATCH v2 10/19] qapi-visit: Factor out gen_visit_members_call(), (continued)
- [Qemu-devel] [PATCH v2 10/19] qapi-visit: Factor out gen_visit_members_call(), Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 07/19] qapi: Avoid use of 'data' member of qapi unions, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 08/19] chardev: Drop useless ChardevDummy type, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 09/19] qapi: Drop useless 'data' member of unions, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 05/19] util: Shorten references into SocketAddress, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 12/19] qapi: Fix command with named empty argument type, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 13/19] qapi-visit: Simplify visit of empty branch in union, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 11/19] qapi: Add type.is_empty() helper, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 15/19] qapi-visit: Move error check into gen_visit_members_call(), Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 16/19] qapi: Allow anonymous base for flat union, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like,
Eric Blake <=
- [Qemu-devel] [PATCH v2 17/19] qapi: Use anonymous base in SchemaInfo, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 18/19] qapi: Use anonymous base in CpuInfo, Eric Blake, 2016/02/25
- [Qemu-devel] [PATCH v2 14/19] qapi: Don't special-case simple union wrappers, Eric Blake, 2016/02/25