From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like
Date: Thu, 03 Mar 2016 14:29:32 +0100 [thread overview]
Message-ID: <87twkn3d1f.fsf@blackfin.pond.sub.org> (raw)
In-Reply-To: <1456443528-13901-20-git-send-email-eblake@redhat.com> (Eric Blake's message of "Thu, 25 Feb 2016 16:38:48 -0700")
Eric Blake <eblake@redhat.com> writes:
> 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 <armbru@redhat.com>
> Signed-off-by: Eric Blake <eblake@redhat.com>
>
> ---
> 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()
These two make sense for any type. The fact that we override
c_param_type() only for object types is detail.
> +
> + # Use of a type in a struct declaration
> + def c_unboxed_type(self):
> + return self.c_type()
This one I find bit problematic. We only ever box object types, but
those we box almost everywhere. This method gets used in the select
places where we don't box them (currently just one). I'm afraid "used
in a struct declaration" isn't a good definition.
I initially suggested to define c_unboxed_type() only for
QAPISchemaObjectType because there boxed vs. unboxed makes sense.
However, your code would like to call it for arbitrary types.
Perhaps we can cure my belly-ache with nothing more than carefully
drafted function contracts. Let me try.
# Return the C type for common use.
# For the types we commonly box, this is a pointer type.
def c_type(self):
# Return the C type to be used in a parameter list.
def c_param_type(self):
# Return the C type to be used where we suppress boxing.
def c_unboxed_type(self):
>
> 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('''
Looks good otherwise.
next prev parent reply other threads:[~2016-03-03 13:29 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-25 23:38 [Qemu-devel] [PATCH v2 00/19] easier unboxed visits/qapi implicit types Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 01/19] qapi: Rename 'fields' to 'members' in internal interface Eric Blake
2016-03-02 17:15 ` Markus Armbruster
2016-03-02 20:05 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 02/19] qapi-visit: Expose visit_type_FOO_members() Eric Blake
2016-03-02 17:24 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 03/19] qapi: Update docs to match recent generator changes Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 04/19] chardev: Shorten references into ChardevBackend Eric Blake
2016-03-02 17:55 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 05/19] util: Shorten references into SocketAddress Eric Blake
2016-03-02 18:03 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 06/19] ui: Shorten references into InputEvent Eric Blake
2016-03-01 15:32 ` [Qemu-devel] [PATCH v2.5 " Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 07/19] qapi: Avoid use of 'data' member of qapi unions Eric Blake
2016-03-02 18:18 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 08/19] chardev: Drop useless ChardevDummy type Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 09/19] qapi: Drop useless 'data' member of unions Eric Blake
2016-03-02 18:30 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 10/19] qapi-visit: Factor out gen_visit_members_call() Eric Blake
2016-03-02 18:53 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 11/19] qapi: Add type.is_empty() helper Eric Blake
2016-03-02 19:04 ` Markus Armbruster
2016-03-02 20:16 ` Eric Blake
2016-03-03 7:08 ` Markus Armbruster
2016-03-02 23:04 ` Eric Blake
2016-03-03 7:18 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 12/19] qapi: Fix command with named empty argument type Eric Blake
2016-03-03 8:54 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 13/19] qapi-visit: Simplify visit of empty branch in union Eric Blake
2016-03-03 9:14 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 14/19] qapi: Don't special-case simple union wrappers Eric Blake
2016-03-03 10:59 ` Markus Armbruster
2016-03-03 16:12 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 15/19] qapi-visit: Move error check into gen_visit_members_call() Eric Blake
2016-03-03 11:56 ` Markus Armbruster
2016-03-04 14:27 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 16/19] qapi: Allow anonymous base for flat union Eric Blake
2016-03-03 13:04 ` Markus Armbruster
2016-03-04 14:32 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 17/19] qapi: Use anonymous base in SchemaInfo Eric Blake
2016-03-03 13:06 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 18/19] qapi: Use anonymous base in CpuInfo Eric Blake
2016-03-03 13:08 ` Markus Armbruster
2016-03-04 14:35 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like Eric Blake
2016-03-03 13:29 ` Markus Armbruster [this message]
2016-03-04 14:37 ` Eric Blake
2016-03-01 15:02 ` [Qemu-devel] [PATCH v2 00/19] easier unboxed visits/qapi implicit types Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87twkn3d1f.fsf@blackfin.pond.sub.org \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.