From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59673) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwUcS-00023P-8q for qemu-devel@nongnu.org; Tue, 09 Jul 2013 05:54:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UwUcQ-0007Ug-FT for qemu-devel@nongnu.org; Tue, 09 Jul 2013 05:54:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37354) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwUcQ-0007UZ-5h for qemu-devel@nongnu.org; Tue, 09 Jul 2013 05:53:58 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r699rvhF031249 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 9 Jul 2013 05:53:57 -0400 From: Kevin Wolf Date: Tue, 9 Jul 2013 11:53:30 +0200 Message-Id: <1373363617-4723-5-git-send-email-kwolf@redhat.com> In-Reply-To: <1373363617-4723-1-git-send-email-kwolf@redhat.com> References: <1373363617-4723-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [RFC PATCH 04/11] qapi-visit.py: Implement 'base' for unions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, armbru@redhat.com, stefanha@redhat.com, lcapitulino@redhat.com Signed-off-by: Kevin Wolf --- scripts/qapi-visit.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index a337d80..3b2e693 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -151,7 +151,16 @@ void visit_type_%(name)s(Visitor *m, %(name)s * obj, const char *name, Error **e ''', name=name) -def generate_visit_union(name, members): +def generate_visit_union(expr): + + name = expr['union'] + members = expr['data'] + + if expr.has_key('base'): + base = expr['base'] + else: + base = None + ret = generate_visit_enum('%sKind' % name, members.keys()) ret += mcgen(''' @@ -164,14 +173,28 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err); if (!err) { if (obj && *obj) { - visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err); - if (!err) { - switch ((*obj)->kind) { ''', name=name) + + push_indent() push_indent() push_indent() + + if base: + struct = find_struct(base) + push_indent() + ret += generate_visit_struct_fields("", struct['data']) + pop_indent() + + pop_indent() + ret += mcgen(''' + visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err); + if (!err) { + switch ((*obj)->kind) { +''', + name=name) + for key in members: ret += mcgen(''' case %(abbrev)s_KIND_%(enum)s: @@ -368,7 +391,7 @@ for expr in exprs: ret = generate_declaration(expr['type'], expr['data']) fdecl.write(ret) elif expr.has_key('union'): - ret = generate_visit_union(expr['union'], expr['data']) + ret = generate_visit_union(expr) ret += generate_visit_list(expr['union'], expr['data']) fdef.write(ret) -- 1.8.1.4