From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, berto@igalia.com, mdroth@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH RFC v3 30/32] qapi: New QMP command query-schema for QMP schema introspection
Date: Sat, 22 Aug 2015 22:17:21 -0600 [thread overview]
Message-ID: <55D94951.3020109@redhat.com> (raw)
In-Reply-To: <1438703896-12553-31-git-send-email-armbru@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 6146 bytes --]
On 08/04/2015 09:58 AM, Markus Armbruster wrote:
> Caution, rough edges.
>
>
> The empty object type is used when a command takes no arguments or
> produces no results.
> +++ b/scripts/qapi.py
> @@ -1050,6 +1054,9 @@ class QAPISchema(object):
> ('bool', 'boolean', 'bool', 'false'),
> ('any', 'value', 'QObject' + pointer_suffix , 'NULL')]:
> self._def_builtin_type(*t)
> + self.the_empty_object_type = QAPISchemaObjectType(':empty', None, None,
> + [], None)
> + self._def_entity(self.the_empty_object_type)
We mentioned moving this into its own patch. In particular, I looked at
what it would take to allow anonymous structs for flat union types:
{ 'union': 'Flat', 'base': 'Base',
'discriminator': 'type',
'data': { 'branch1': {},
'branch2': { 'integer': 'int' } } }
but having _make_implicit_object_type() return None caused subsequent
failures. Normalizing to always use the special ':empty' might be worth
doing if you hoist this work earlier; here's the diff I was playing with.
And while at it, should types like 'Abort' and 'ChardevDummy' (which are
both intentionally empty) normalize to the same ':empty' type during
introspection, or is it okay if two separate types with the same (lack
of) member contents can result in separate type numbers in the
introspection?
diff --git i/scripts/qapi-commands.py w/scripts/qapi-commands.py
index 7ff7c31..06e6a1e 100644
--- i/scripts/qapi-commands.py
+++ w/scripts/qapi-commands.py
@@ -76,7 +76,7 @@ def gen_marshal_vars(arg_type, ret_type):
''',
c_type=ret_type.c_type())
- if arg_type:
+ if arg_type and arg_type.members:
ret += mcgen('''
QmpInputVisitor *mi = qmp_input_visitor_new_strict(QOBJECT(args));
QapiDeallocVisitor *md;
@@ -108,7 +108,7 @@ bool has_%(c_name)s = false;
def gen_marshal_input_visit(arg_type, dealloc=False):
ret = ''
- if not arg_type:
+ if not arg_type or not arg_type.members:
return ret
push_indent()
diff --git i/scripts/qapi.py w/scripts/qapi.py
index 34c2884..133b859 100644
--- i/scripts/qapi.py
+++ w/scripts/qapi.py
@@ -1071,7 +1071,7 @@ class QAPISchema(object):
def _make_implicit_object_type(self, name, role, members):
if not members:
- return None
+ return ':empty'
name = ':obj-%s-%s' % (name, role)
if not self.lookup_entity(name, QAPISchemaObjectType):
self._def_entity(QAPISchemaObjectType(name, None, None,
@@ -1155,17 +1155,17 @@ class QAPISchema(object):
def _def_command(self, expr, info):
name = expr['command']
- data = expr.get('data')
+ data = expr.get('data', {})
rets = expr.get('returns')
gen = expr.get('gen', True)
success_response = expr.get('success-response', True)
- if isinstance(data, OrderedDict):
+ if isinstance(data, dict):
data = self._make_implicit_object_type(name, 'arg',
self._make_members(data))
if isinstance(rets, list):
assert len(rets) == 1
rets = self._make_array_type(rets[0])
- elif isinstance(rets, OrderedDict):
+ elif isinstance(rets, dict):
rets = self._make_implicit_object_type(name, 'ret',
self._make_members(rets))
self._def_entity(QAPISchemaCommand(name, info, data, rets, gen,
@@ -1173,8 +1173,8 @@ class QAPISchema(object):
def _def_event(self, expr, info):
name = expr['event']
- data = expr.get('data')
- if isinstance(data, OrderedDict):
+ data = expr.get('data', {})
+ if isinstance(data, dict):
data = self._make_implicit_object_type(name, 'arg',
self._make_members(data))
self._def_entity(QAPISchemaEvent(name, info, data))
diff --git i/tests/qapi-schema/event-case.out
w/tests/qapi-schema/event-case.out
index cdfd264..6a84fdd 100644
--- i/tests/qapi-schema/event-case.out
+++ w/tests/qapi-schema/event-case.out
@@ -1,2 +1,2 @@
object :empty
-event oops None
+event oops :empty
diff --git i/tests/qapi-schema/indented-expr.out
w/tests/qapi-schema/indented-expr.out
index 226d300..8999a6d 100644
--- i/tests/qapi-schema/indented-expr.out
+++ w/tests/qapi-schema/indented-expr.out
@@ -1,5 +1,5 @@
object :empty
-command eins None -> None
+command eins :empty -> None
gen=True success_response=True
-command zwei None -> None
+command zwei :empty -> None
gen=True success_response=True
diff --git i/tests/qapi-schema/qapi-schema-test.out
w/tests/qapi-schema/qapi-schema-test.out
index 386b057..57cae76 100644
--- i/tests/qapi-schema/qapi-schema-test.out
+++ w/tests/qapi-schema/qapi-schema-test.out
@@ -51,8 +51,8 @@ object :obj-user_def_cmd2-arg
object :obj-user_def_cmd3-arg
member a: int optional=False
member b: int optional=True
-event EVENT_A None
-event EVENT_B None
+event EVENT_A :empty
+event EVENT_B :empty
event EVENT_C :obj-EVENT_C-arg
event EVENT_D :obj-EVENT_D-arg
enum EnumOne ['value1', 'value2', 'value3']
@@ -154,7 +154,7 @@ command __org.qemu_x-command
:obj-__org.qemu_x-command-arg -> __org.qemu_x-Union
gen=True success_response=True
command guest-sync :obj-guest-sync-arg -> any
gen=True success_response=True
-command user_def_cmd None -> None
+command user_def_cmd :empty -> None
gen=True success_response=True
command user_def_cmd1 :obj-user_def_cmd1-arg -> None
gen=True success_response=True
diff --git i/tests/qapi-schema/returns-int.out
w/tests/qapi-schema/returns-int.out
index a2da259..29825e8 100644
--- i/tests/qapi-schema/returns-int.out
+++ w/tests/qapi-schema/returns-int.out
@@ -1,3 +1,3 @@
object :empty
-command guest-get-time None -> int
+command guest-get-time :empty -> int
gen=True success_response=True
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2015-08-23 4:17 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-04 15:57 [Qemu-devel] [PATCH RFC v3 00/32] qapi: QMP introspection Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 01/32] qapi: Rename class QAPISchema to QAPISchemaParser Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 02/32] qapi: New QAPISchema intermediate reperesentation Markus Armbruster
2015-08-04 21:53 ` Eric Blake
2015-08-05 6:23 ` Markus Armbruster
2015-08-05 14:27 ` Eric Blake
2015-08-06 5:46 ` Markus Armbruster
2015-08-31 18:09 ` Markus Armbruster
2015-09-03 14:52 ` Eric Blake
2015-09-03 16:13 ` Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 03/32] qapi: QAPISchema code generation helper methods Markus Armbruster
2015-08-04 22:18 ` Eric Blake
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 04/32] qapi: New QAPISchemaVisitor Markus Armbruster
2015-08-04 22:26 ` Eric Blake
2015-08-05 6:24 ` Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 05/32] tests/qapi-schema: Convert test harness to QAPISchemaVisitor Markus Armbruster
2015-08-04 22:35 ` Eric Blake
2015-08-05 6:26 ` Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 06/32] qapi: Split up some typedefs to ease review Markus Armbruster
2015-08-04 22:37 ` Eric Blake
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 07/32] qapi: Generate comments to simplify splitting for review Markus Armbruster
2015-08-04 22:54 ` Eric Blake
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 08/32] Revert "qapi: Generate comments to simplify splitting for review" Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 09/32] Revert "qapi: Split up some typedefs to ease review" Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 10/32] qapi-types: Convert to QAPISchemaVisitor, fixing flat unions Markus Armbruster
2015-08-05 15:15 ` Eric Blake
2015-08-06 5:50 ` Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 11/32] qapi-visit: Convert to QAPISchemaVisitor, fixing bugs Markus Armbruster
2015-08-05 16:03 ` Eric Blake
2015-08-06 22:53 ` Eric Blake
2015-08-08 6:07 ` Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 12/32] qapi-commands: Convert to QAPISchemaVisitor Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 13/32] qapi: De-duplicate enum code generation Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 14/32] qapi-event: Eliminate global variable event_enum_value Markus Armbruster
2015-08-04 15:57 ` [Qemu-devel] [PATCH RFC v3 15/32] qapi-event: Convert to QAPISchemaVisitor, fixing data with base Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 16/32] qapi: Generate comments to simplify splitting for review Markus Armbruster
2015-08-04 23:02 ` Eric Blake
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 17/32] Revert "qapi: Generate comments to simplify splitting for review" Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 18/32] qapi: Replace dirty is_c_ptr() by method c_null() Markus Armbruster
2015-08-05 16:13 ` Eric Blake
2015-08-06 5:52 ` Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 19/32] qapi: Clean up after recent conversions to QAPISchemaVisitor Markus Armbruster
2015-08-05 16:29 ` Eric Blake
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 20/32] qapi-visit: Rearrange code a bit Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 21/32] qapi-commands: Rearrange code Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 22/32] qapi: Rename qmp_marshal_input_FOO() to qmp_marshal_FOO() Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 23/32] qapi: De-duplicate parameter list generation Markus Armbruster
2015-08-05 17:00 ` Eric Blake
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 24/32] qapi-commands: De-duplicate output marshaling functions Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 25/32] qapi: Improve built-in type documentation Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 26/32] qapi: Introduce a first class 'any' type Markus Armbruster
2015-08-07 19:30 ` Eric Blake
2015-08-08 6:24 ` Markus Armbruster
2015-08-31 9:07 ` Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 27/32] qom: Don't use 'gen': false for qom-get, qom-set, object-add Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 28/32] qapi-schema: Fix up misleading specification of netdev_add Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 29/32] qapi: Pseudo-type '**' is now unused, drop it Markus Armbruster
2015-08-05 17:13 ` Eric Blake
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 30/32] qapi: New QMP command query-schema for QMP schema introspection Markus Armbruster
2015-08-05 20:20 ` Eric Blake
2015-08-06 6:23 ` Markus Armbruster
2015-09-01 13:09 ` Markus Armbruster
2015-09-01 15:48 ` Eric Blake
2015-08-05 20:54 ` Eric Blake
2015-08-06 6:47 ` Markus Armbruster
2015-08-23 4:17 ` Eric Blake [this message]
2015-08-24 11:30 ` Markus Armbruster
2015-08-24 13:07 ` Eric Blake
2015-08-24 16:51 ` Eric Blake
2015-08-24 16:55 ` Markus Armbruster
2015-08-24 17:14 ` Eric Blake
2015-08-25 8:33 ` Markus Armbruster
2015-09-01 18:40 ` Michael Roth
2015-09-01 19:12 ` Eric Blake
2015-09-01 20:23 ` Michael Roth
2015-09-02 8:56 ` Markus Armbruster
2015-09-02 16:21 ` Michael Roth
2015-09-03 9:26 ` Markus Armbruster
2015-09-03 14:31 ` Eric Blake
2015-09-03 15:59 ` Michael Roth
2015-09-03 17:01 ` Markus Armbruster
2015-09-03 19:59 ` Michael Roth
2015-09-04 6:39 ` Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 31/32] qapi-introspect: Map all integer types to 'int' Markus Armbruster
2015-08-04 15:58 ` [Qemu-devel] [PATCH RFC v3 32/32] qapi-introspect: Hide type names Markus Armbruster
2015-08-05 21:06 ` Eric Blake
2015-08-05 21:50 ` Eric Blake
2015-08-06 6:49 ` 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=55D94951.3020109@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=kwolf@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.