summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorKevin Wolf2013-09-19 11:56:36 +0200
committerKevin Wolf2013-10-11 16:50:01 +0200
commit622f557f5aaea1326c94ca4cddfa4eafeade3723 (patch)
treeca74eac5379e1003c4634119001400b737adb472 /scripts
parentqapi-types/visit.py: Pass whole expr dict for structs (diff)
downloadqemu-622f557f5aaea1326c94ca4cddfa4eafeade3723.tar.gz
qemu-622f557f5aaea1326c94ca4cddfa4eafeade3723.tar.xz
qemu-622f557f5aaea1326c94ca4cddfa4eafeade3723.zip
qapi-types/visit.py: Inheritance for structs
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> Reviewed-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/qapi-types.py4
-rw-r--r--scripts/qapi-visit.py18
2 files changed, 20 insertions, 2 deletions
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 566fe5e4d9..4a1652b56f 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 1e44004a1e..c39e6284b8 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('''