qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH v2 3/4] qapi: Correctly handle downstream extensions


From: Eric Blake
Subject: [Qemu-devel] [PATCH v2 3/4] qapi: Correctly handle downstream extensions in more locations
Date: Sat, 11 Apr 2015 12:09:42 -0600

Now that c_var() handles '.' in downstream extension names, fix
the generator to support such names as additional types, enums,
members within an enum, branches of a union or alternate, and
in arrays.

Signed-off-by: Eric Blake <address@hidden>
---
 scripts/qapi-commands.py |  4 ++--
 scripts/qapi-types.py    | 27 ++++++++++++++-------------
 scripts/qapi-visit.py    | 44 ++++++++++++++++++++++++--------------------
 scripts/qapi.py          | 10 ++++++----
 4 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index af1e1a1..84b66bc 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -22,9 +22,9 @@ import errno

 def type_visitor(name):
     if type(name) == list:
-        return 'visit_type_%sList' % name[0]
+        return 'visit_type_%sList' % type_name(name[0])
     else:
-        return 'visit_type_%s' % name
+        return 'visit_type_%s' % type_name(name)

 def generate_command_decl(name, args, ret_type):
     arglist=""
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 8cf6349..b33b8fd 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -45,7 +45,7 @@ typedef struct %(name)sList
     struct %(name)sList *next;
 } %(name)sList;
 ''',
-                 name=name)
+                 name=c_var(name))

 def generate_fwd_enum_struct(name, members):
     return mcgen('''
@@ -58,7 +58,7 @@ typedef struct %(name)sList
     struct %(name)sList *next;
 } %(name)sList;
 ''',
-                 name=name)
+                 name=c_var(name))

 def generate_struct_fields(members):
     ret = ''
@@ -87,7 +87,7 @@ def generate_struct(expr):
 struct %(name)s
 {
 ''',
-          name=structname)
+          name=c_var(structname))

     if base:
         ret += generate_struct_fields({'base': base})
@@ -115,7 +115,7 @@ def generate_enum_lookup(name, values):
     ret = mcgen('''
 const char *%(name)s_lookup[] = {
 ''',
-                         name=name)
+                name=c_var(name))
     i = 0
     for value in values:
         index = generate_enum_full_value(name, value)
@@ -134,6 +134,7 @@ const char *%(name)s_lookup[] = {
     return ret

 def generate_enum(name, values):
+    name = c_var(name)
     lookup_decl = mcgen('''
 extern const char *%(name)s_lookup[];
 ''',
@@ -173,18 +174,18 @@ def generate_alternate_qtypes(expr):
     ret = mcgen('''
 const int %(name)s_qtypes[QTYPE_MAX] = {
 ''',
-    name=name)
+                name=c_var(name))

     for key in members:
         qtype = find_alternate_member_qtype(members[key])
         assert qtype, "Invalid alternate member"

         ret += mcgen('''
-    [ %(qtype)s ] = %(abbrev)s_KIND_%(enum)s,
+    [%(qtype)s] = %(value)s,
 ''',
-        qtype = qtype,
-        abbrev = de_camel_case(name).upper(),
-        enum = c_var(de_camel_case(key),False).upper())
+                     qtype = qtype,
+                     value = generate_enum_full_value("%sKind" %c_var(name),
+                                                      key))

     ret += mcgen('''
 };
@@ -194,7 +195,7 @@ const int %(name)s_qtypes[QTYPE_MAX] = {

 def generate_union(expr, meta):

-    name = expr[meta]
+    name = c_var(expr[meta])
     typeinfo = expr['data']

     base = expr.get('base')
@@ -214,7 +215,7 @@ struct %(name)s
         void *data;
 ''',
                 name=name,
-                discriminator_type_name=discriminator_type_name)
+                discriminator_type_name=c_var(discriminator_type_name))

     for key in typeinfo:
         ret += mcgen('''
@@ -251,7 +252,7 @@ def generate_type_cleanup_decl(name):
     ret = mcgen('''
 void qapi_free_%(type)s(%(c_type)s obj);
 ''',
-                c_type=c_type(name),type=name)
+                c_type=c_type(name),type=c_var(name))
     return ret

 def generate_type_cleanup(name):
@@ -272,7 +273,7 @@ void qapi_free_%(type)s(%(c_type)s obj)
     qapi_dealloc_visitor_cleanup(md);
 }
 ''',
-                c_type=c_type(name),type=name)
+                c_type=c_type(name),type=c_var(name))
     return ret


diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index f24dcfa..d1d3fe6 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -44,12 +44,13 @@ static void visit_type_implicit_%(c_type)s(Visitor *m, 
%(c_type)s **obj, Error *
                  c_type=type_name(type))

 def generate_visit_struct_fields(name, field_prefix, fn_prefix, members, base 
= None):
+    assert field_prefix == ""
     substructs = []
     ret = ''
     if not fn_prefix:
-        full_name = name
+        full_name = c_var(name)
     else:
-        full_name = "%s_%s" % (name, fn_prefix)
+        full_name = "%s_%s" % (c_var(name), fn_prefix)

     if base:
         ret += generate_visit_implicit_struct(base)
@@ -60,7 +61,7 @@ static void visit_type_%(full_name)s_fields(Visitor *m, 
%(name)s **obj, Error **
 {
     Error *err = NULL;
 ''',
-        name=name, full_name=full_name)
+        name=c_var(name), full_name=full_name)
     push_indent()

     if base:
@@ -121,9 +122,9 @@ def generate_visit_struct_body(field_prefix, name, members):
 ''')

     if not field_prefix:
-        full_name = name
+        full_name = c_var(name)
     else:
-        full_name = "%s_%s" % (field_prefix, name)
+        full_name = "%s_%s" % (field_prefix, c_var(name))

     if len(field_prefix):
         ret += mcgen('''
@@ -132,9 +133,9 @@ def generate_visit_struct_body(field_prefix, name, members):
                 name=name)
     else:
         ret += mcgen('''
-    visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), 
&err);
+    visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(c_name)s), 
&err);
 ''',
-                name=name)
+                     name=name, c_name=c_var(name))

     ret += mcgen('''
     if (!err) {
@@ -162,7 +163,7 @@ def generate_visit_struct(expr):
 void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error 
**errp)
 {
 ''',
-                name=name)
+                 name=c_var(name))

     ret += generate_visit_struct_body("", name, members)

@@ -171,7 +172,9 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const 
char *name, Error **e
 ''')
     return ret

-def generate_visit_list(name, members):
+def generate_visit_list(name, members, builtin=False):
+    if not builtin:
+        name = c_var(name)
     return mcgen('''

 void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, 
Error **errp)
@@ -208,7 +211,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s *obj, const 
char *name, Error **er
     visit_type_enum(m, (int *)obj, %(name)s_lookup, "%(name)s", name, errp);
 }
 ''',
-                 name=name)
+                 name=c_var(name))

 def generate_visit_alternate(name, members):
     ret = mcgen('''
@@ -227,11 +230,11 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, 
const char *name, Error **e
     }
     switch ((*obj)->kind) {
 ''',
-    name=name)
+                name=c_var(name))

     # For alternate, always use the default enum type automatically generated
     # as "'%sKind' % (name)"
-    disc_type = '%sKind' % (name)
+    disc_type = '%sKind' % c_var(name)

     for key in members:
         assert (members[key] in builtin_types.keys()
@@ -277,12 +280,12 @@ def generate_visit_union(expr):
     if enum_define:
         # Use the enum type as discriminator
         ret = ""
-        disc_type = enum_define['enum_name']
+        disc_type = c_var(enum_define['enum_name'])
     else:
         # There will always be a discriminator in the C switch code, by default
         # it is an enum type generated silently as "'%sKind' % (name)"
         ret = generate_visit_enum('%sKind' % name, members.keys())
-        disc_type = '%sKind' % (name)
+        disc_type = '%sKind' % c_var(name)

     if base:
         assert discriminator
@@ -306,7 +309,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const 
char *name, Error **e
     }
     if (*obj) {
 ''',
-                 name=name)
+                 name=c_var(name))

     if base:
         ret += mcgen('''
@@ -315,7 +318,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const 
char *name, Error **e
             goto out_obj;
         }
 ''',
-            name=name)
+                     name=c_var(name))

     if not discriminator:
         disc_key = "type"
@@ -372,6 +375,7 @@ out:
 def generate_declaration(name, members, builtin_type=False):
     ret = ""
     if not builtin_type:
+        name = c_var(name)
         ret += mcgen('''

 void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error 
**errp);
@@ -381,7 +385,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const 
char *name, Error **e
     ret += mcgen('''
 void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, 
Error **errp);
 ''',
-                 name=name)
+                     name=name)

     return ret

@@ -389,7 +393,7 @@ def generate_enum_declaration(name, members):
     ret = mcgen('''
 void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, 
Error **errp);
 ''',
-                name=name)
+                name=c_var(name))

     return ret

@@ -398,7 +402,7 @@ def generate_decl_enum(name, members):

 void visit_type_%(name)s(Visitor *m, %(name)s *obj, const char *name, Error 
**errp);
 ''',
-                name=name)
+                 name=c_var(name))

 try:
     opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:i:o:",
@@ -515,7 +519,7 @@ fdecl.write(guardend("QAPI_VISIT_BUILTIN_VISITOR_DECL"))
 # over these cases
 if do_builtins:
     for typename in builtin_types.keys():
-        fdef.write(generate_visit_list(typename, None))
+        fdef.write(generate_visit_list(typename, None, builtin=True))

 for expr in exprs:
     if expr.has_key('struct'):
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 1d64c62..e706712 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -782,12 +782,14 @@ def c_var(name, protect=True):
     return name.translate(c_var_trans)

 def c_list_type(name):
-    return '%sList' % name
+    return '%sList' % type_name(name)

 def type_name(name):
     if type(name) == list:
         return c_list_type(name[0])
-    return name
+    if name in builtin_types.keys():
+        return name
+    return c_var(name)

 def add_name(name, info, meta, implicit = False):
     global all_names
@@ -869,13 +871,13 @@ def c_type(name, is_param=False):
     elif type(name) == list:
         return '%s *%s' % (c_list_type(name[0]), eatspace)
     elif is_enum(name):
-        return name
+        return c_var(name)
     elif name == None or len(name) == 0:
         return 'void'
     elif name in events:
         return '%sEvent *%s' % (camel_case(name), eatspace)
     else:
-        return '%s *%s' % (name, eatspace)
+        return '%s *%s' % (c_var(name), eatspace)

 def is_c_ptr(name):
     suffix = "*" + eatspace
-- 
2.1.0




reply via email to

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