From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH V5 18/32] libxl/gentypes.py: special-case KeyedUnion map handle generation Date: Tue, 13 May 2014 22:54:00 +0100 Message-ID: <1400018054-26038-19-git-send-email-wei.liu2@citrix.com> References: <1400018054-26038-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1400018054-26038-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , ian.jackson@eu.citrix.com, ian.campbell@citrix.com List-Id: xen-devel@lists.xenproject.org Generate JSON map handle according to KeyedUnion discriminator. Signed-off-by: Wei Liu --- tools/libxl/gentypes.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py index 61a2b3d..01416e7 100644 --- a/tools/libxl/gentypes.py +++ b/tools/libxl/gentypes.py @@ -186,6 +186,26 @@ def libxl_C_type_member_init(ty, field): s += "\n" return s +def libxl_C_type_gen_map_key(f, parent, indent = ""): + s = "" + if isinstance(f.type, idl.KeyedUnion): + s += "switch (%s) {\n" % (parent + f.type.keyvar.name) + for x in f.type.fields: + v = f.type.keyvar.name + "." + x.name + s += "case %s:\n" % x.enumname + s += " s = yajl_gen_string(hand, (const unsigned char *)\"%s\", sizeof(\"%s\")-1);\n" % (v, v) + s += " if (s != yajl_gen_status_ok)\n" + s += " goto out;\n" + s += " break;\n" + s += "}\n" + else: + s += "s = yajl_gen_string(hand, (const unsigned char *)\"%s\", sizeof(\"%s\")-1);\n" % (f.name, f.name) + s += "if (s != yajl_gen_status_ok)\n" + s += " goto out;\n" + if s != "": + s = indent + s + return s.replace("\n", "\n%s" % indent).rstrip(indent) + def libxl_C_type_gen_json(ty, v, indent = " ", parent = None): s = "" if parent is None: @@ -235,9 +255,7 @@ def libxl_C_type_gen_json(ty, v, indent = " ", parent = None): s += " goto out;\n" for f in [f for f in ty.fields if not f.const and not f.type.private]: (nparent,fexpr) = ty.member(v, f, parent is None) - s += "s = yajl_gen_string(hand, (const unsigned char *)\"%s\", sizeof(\"%s\")-1);\n" % (f.name, f.name) - s += "if (s != yajl_gen_status_ok)\n" - s += " goto out;\n" + s += libxl_C_type_gen_map_key(f, nparent) s += libxl_C_type_gen_json(f.type, fexpr, "", nparent) s += "s = yajl_gen_map_close(hand);\n" s += "if (s != yajl_gen_status_ok)\n" -- 1.7.10.4