From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, benoit.canet@irqsave.net, armbru@redhat.com,
mreitz@redhat.com, stefanha@redhat.com,
xiawenc@linux.vnet.ibm.com
Subject: [Qemu-devel] [PATCH v2 02/17] qapi-types/visit.py: Inheritance for structs
Date: Tue, 1 Oct 2013 15:20:04 +0200 [thread overview]
Message-ID: <1380633619-12213-3-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1380633619-12213-1-git-send-email-kwolf@redhat.com>
This introduces a new 'base' key for struct definitions that refers to
another struct type. On the JSON level, the fields of the base type are
included directly into the same namespace as the fields of the defined
type, like with unions. On the C level, a pointer to a struct of the
base type is included.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
docs/qapi-code-gen.txt | 17 +++++++++++++++++
scripts/qapi-types.py | 4 ++++
scripts/qapi-visit.py | 18 ++++++++++++++++--
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index 0ce045c..91f44d0 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -53,6 +53,23 @@ The use of '*' as a prefix to the name means the member is optional. Optional
members should always be added to the end of the dictionary to preserve
backwards compatibility.
+
+A complex type definition can specify another complex type as its base.
+In this case, the fields of the base type are included as top-level fields
+of the new complex type's dictionary in the QMP wire format. An example
+definition is:
+
+ { 'type': 'BlockdevOptionsGenericFormat', 'data': { 'file': 'str' } }
+ { 'type': 'BlockdevOptionsGenericCOWFormat',
+ 'base': 'BlockdevOptionsGenericFormat',
+ 'data': { '*backing': 'str' } }
+
+An example BlockdevOptionsGenericCOWFormat object on the wire could use
+both fields like this:
+
+ { "file": "/some/place/my-image",
+ "backing": "/some/place/my-backing-file" }
+
=== Enumeration types ===
An enumeration type is a dictionary containing a single key whose value is a
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 566fe5e..4a1652b 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -86,6 +86,7 @@ def generate_struct(expr):
structname = expr.get('type', "")
fieldname = expr.get('field', "")
members = expr['data']
+ base = expr.get('base')
ret = mcgen('''
struct %(name)s
@@ -93,6 +94,9 @@ struct %(name)s
''',
name=structname)
+ if base:
+ ret += generate_struct_fields({'base': base})
+
ret += generate_struct_fields(members)
if len(fieldname):
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 1e44004..c39e628 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -17,7 +17,7 @@ import os
import getopt
import errno
-def generate_visit_struct_fields(name, field_prefix, fn_prefix, members):
+def generate_visit_struct_fields(name, field_prefix, fn_prefix, members, base = None):
substructs = []
ret = ''
full_name = name if not fn_prefix else "%s_%s" % (name, fn_prefix)
@@ -42,6 +42,19 @@ static void visit_type_%(full_name)s_fields(Visitor *m, %(name)s ** obj, Error *
name=name, full_name=full_name)
push_indent()
+ if base:
+ ret += mcgen('''
+visit_start_implicit_struct(m, obj ? (void**) &(*obj)->%(c_name)s : NULL, sizeof(%(type)s), &err);
+if (!err) {
+ visit_type_%(type)s_fields(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, &err);
+ error_propagate(errp, err);
+ err = NULL;
+ visit_end_implicit_struct(m, &err);
+}
+''',
+ c_prefix=c_var(field_prefix),
+ type=type_name(base), c_name=c_var('base'))
+
for argname, argentry, optional, structured in parse_args(members):
if optional:
ret += mcgen('''
@@ -124,8 +137,9 @@ def generate_visit_struct(expr):
name = expr['type']
members = expr['data']
+ base = expr.get('base')
- ret = generate_visit_struct_fields(name, "", "", members)
+ ret = generate_visit_struct_fields(name, "", "", members, base)
ret += mcgen('''
--
1.8.1.4
next prev parent reply other threads:[~2013-10-01 13:20 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-01 13:20 [Qemu-devel] [PATCH v2 00/17] blockdev-add QMP command Kevin Wolf
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 01/17] qapi-types/visit.py: Pass whole expr dict for structs Kevin Wolf
2013-10-01 13:20 ` Kevin Wolf [this message]
2013-10-01 15:21 ` [Qemu-devel] [PATCH v2 02/17] qapi-types/visit.py: Inheritance " Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 03/17] blockdev: Introduce DriveInfo.enable_auto_del Kevin Wolf
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 04/17] blockdev: 'blockdev-add' QMP command Kevin Wolf
2013-10-01 14:00 ` Benoît Canet
2013-10-01 15:41 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 05/17] blockdev: Separate ID generation from DriveInfo creation Kevin Wolf
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 06/17] blockdev: Pass QDict to blockdev_init() Kevin Wolf
2013-10-01 15:53 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 07/17] blockdev: Move parsing of 'media' option to drive_init Kevin Wolf
2013-10-01 15:57 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 08/17] blockdev: Move parsing of 'if' " Kevin Wolf
2013-10-01 14:44 ` Benoît Canet
2013-10-01 16:01 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 09/17] blockdev: Moving parsing of geometry options " Kevin Wolf
2013-10-01 16:09 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 10/17] blockdev: Move parsing of 'boot' option " Kevin Wolf
2013-10-01 16:19 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 11/17] blockdev: Move bus/unit/index processing " Kevin Wolf
2013-10-01 16:25 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 12/17] blockdev: Move virtio-blk device creation " Kevin Wolf
2013-10-01 16:34 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 13/17] blockdev: Remove IF_* check for read-only blockdev_init Kevin Wolf
2013-10-01 16:51 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 14/17] qemu-iotests: Check autodel behaviour for device_del Kevin Wolf
2013-10-01 17:06 ` Eric Blake
2013-10-08 9:44 ` Kevin Wolf
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 15/17] blockdev: Remove 'media' parameter from blockdev_init() Kevin Wolf
2013-10-01 17:07 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 16/17] blockdev: Don't disable COR automatically with blockdev-add Kevin Wolf
2013-10-01 17:09 ` Eric Blake
2013-10-01 13:20 ` [Qemu-devel] [PATCH v2 17/17] blockdev: blockdev_init() error conversion Kevin Wolf
2013-10-01 17:11 ` Eric Blake
2013-10-01 15:41 ` [Qemu-devel] [PATCH v2 00/17] blockdev-add QMP command Eric Blake
2013-10-01 15:50 ` Kevin Wolf
2013-10-01 15:54 ` Eric Blake
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=1380633619-12213-3-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=benoit.canet@irqsave.net \
--cc=mreitz@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=xiawenc@linux.vnet.ibm.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).