qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3/9] qapi: Fix visiter generator for nested structs/


From: Michael Roth
Subject: [Qemu-devel] [PATCH 3/9] qapi: Fix visiter generator for nested structs/qobjects
Date: Fri, 29 Apr 2011 10:21:56 -0500

Recursively handle structured types as identified by the schema parser.
Generated code Uses visiter stack's push/pop logic to traverse the
structure's tree.

Signed-off-by: Michael Roth <address@hidden>
---
 scripts/qapi-visit.py |   55 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 6bcd84d..bf005c6 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -2,35 +2,56 @@ from ordereddict import OrderedDict
 from qapi import *
 import sys
 
-def generate_visit_struct(name, members):
-    ret = mcgen('''
-
-void visit_type_%(name)s(Visiter *m, %(name)s ** obj, const char *name, Error 
**errp)
-{
-    visit_start_struct(m, (void **)obj, "%(name)s", name, errp);
-''',
-                name=name)
-
-    for argname, argtype, optional in parse_args(members):
+def generate_visit_struct_body(field_prefix, members):
+    ret = ""
+    if len(field_prefix):
+        field_prefix = field_prefix + "."
+    for argname, argentry, optional, structured in parse_args(members):
         if optional:
             ret += mcgen('''
-    visit_start_optional(m, &(*obj)->has_%(c_name)s, "%(name)s", errp);
-    if ((*obj)->has_%(c_name)s) {
+visit_start_optional(m, &(*obj)->%(c_prefix)shas_%(c_name)s, "%(name)s", errp);
+if ((*obj)->%(prefix)shas_%(c_name)s) {
 ''',
+                         c_prefix=c_var(field_prefix), prefix=field_prefix,
                          c_name=c_var(argname), name=argname)
             push_indent()
 
-        ret += mcgen('''
-    visit_type_%(type)s(m, &(*obj)->%(c_name)s, "%(name)s", errp);
+        if structured:
+            ret += mcgen('''
+visit_start_struct(m, NULL, "", "%(name)s", errp);
 ''',
-                     type=type_name(argtype), c_name=c_var(argname), 
name=argname)
+                         name=argname)
+            ret += generate_visit_struct_body(field_prefix + argname, argentry)
+            ret += mcgen('''
+visit_end_struct(m, errp);
+''')
+        else:
+            ret += mcgen('''
+visit_type_%(type)s(m, &(*obj)->%(c_prefix)s%(c_name)s, "%(name)s", errp);
+''',
+                         c_prefix=c_var(field_prefix), prefix=field_prefix,
+                         type=type_name(argentry), c_name=c_var(argname),
+                         name=argname)
 
         if optional:
             pop_indent()
             ret += mcgen('''
-    }
-    visit_end_optional(m, errp);
+}
+visit_end_optional(m, errp);
 ''')
+    return ret
+
+def generate_visit_struct(name, members):
+    ret = mcgen('''
+
+void visit_type_%(name)s(Visiter *m, %(name)s ** obj, const char *name, Error 
**errp)
+{
+    visit_start_struct(m, (void **)obj, "%(name)s", name, errp);
+''',
+                name=name)
+    push_indent()
+    ret += generate_visit_struct_body("", members)
+    pop_indent()
 
     ret += mcgen('''
     visit_end_struct(m, errp);
-- 
1.7.0.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]