[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/9] qapi: Fix type generator for structured type me
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PATCH 1/9] qapi: Fix type generator for structured type members |
Date: |
Fri, 29 Apr 2011 10:21:54 -0500 |
This generalizes the generate_struct() function to support generating
structs for top-level named structs as well anonymous nested structs.
generate_struct() now calls itself recursively to support arbitrary
nesting by checking if a fields "type" is actually an OrderedDict.
Signed-off-by: Michael Roth <address@hidden>
---
scripts/qapi-types.py | 39 +++++++++++++++++++++++----------------
scripts/qapi.py | 7 +++++--
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 42ad6a5..d645bad 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -4,7 +4,6 @@ import sys
def generate_fwd_struct(name, members):
return mcgen('''
-
typedef struct %(name)s %(name)s;
typedef struct %(name)sList
@@ -15,34 +14,40 @@ typedef struct %(name)sList
''',
name=name)
-def generate_struct(name, members):
+def generate_struct(structname, fieldname, members):
ret = mcgen('''
-
struct %(name)s
{
''',
- name=name)
+ name=structname)
- for argname, argtype, optional in parse_args(members):
+ for argname, argentry, optional, structured in parse_args(members):
if optional:
ret += mcgen('''
bool has_%(c_name)s;
''',
c_name=c_var(argname))
- ret += mcgen('''
+ if structured:
+ push_indent()
+ ret += generate_struct("", argname, argentry)
+ pop_indent()
+ else:
+ ret += mcgen('''
%(c_type)s %(c_name)s;
''',
- c_type=c_type(argtype), c_name=c_var(argname))
+ c_type=c_type(argentry), c_name=c_var(argname))
+ if len(fieldname):
+ fieldname = " " + fieldname
ret += mcgen('''
-};
-''')
+}%(field)s;
+''',
+ field=fieldname)
return ret
def generate_handle(name, typeinfo):
return mcgen('''
-
typedef struct %(name)s
{
%(c_type)s handle;
@@ -58,7 +63,6 @@ typedef struct %(name)sList
def generate_enum(name, values):
ret = mcgen('''
-
typedef enum %(name)s
{
''',
@@ -83,7 +87,6 @@ typedef enum %(name)s
def generate_union(name, typeinfo):
ret = mcgen('''
-
struct %(name)s
{
%(name)sKind kind;
@@ -117,7 +120,7 @@ fdecl.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */
''')
for expr in exprs:
- ret = ''
+ ret = "\n"
if expr.has_key('type'):
ret += generate_fwd_struct(expr['type'], expr['data'])
elif expr.has_key('enum'):
@@ -125,18 +128,22 @@ for expr in exprs:
ret += generate_enum(expr['enum'], expr['data'])
elif expr.has_key('union'):
add_enum('%sKind' % expr['union'])
- ret += generate_fwd_struct(expr['union'], expr['data'])
+ ret += generate_fwd_struct(expr['union'], expr['data']) + "\n"
ret += generate_enum('%sKind' % expr['union'], expr['data'].keys())
+ else:
+ continue
fdecl.write(ret)
for expr in exprs:
- ret = ''
+ ret = "\n"
if expr.has_key('type'):
- ret += generate_struct(expr['type'], expr['data'])
+ ret += generate_struct(expr['type'], "", expr['data'])
elif expr.has_key('handle'):
ret += generate_handle(expr['handle'], expr['data'])
elif expr.has_key('union'):
ret += generate_union(expr['union'], expr['data'])
+ else:
+ continue
fdecl.write(ret)
fdecl.write('''
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 74533d0..1bc4604 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -74,12 +74,15 @@ def parse_schema(fp):
def parse_args(typeinfo):
for member in typeinfo:
argname = member
- argtype = typeinfo[member]
+ argentry = typeinfo[member]
optional = False
+ structured = False
if member.startswith('*'):
argname = member[1:]
optional = True
- yield (argname, argtype, optional)
+ if isinstance(argentry, OrderedDict):
+ structured = True
+ yield (argname, argentry, optional, structured)
def de_camel_case(name):
new_name = ''
--
1.7.0.4
- [Qemu-devel] [PULL] QAPI code generator fix-ups, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 2/9] qapi: input visiter, don't always allocate memory for structs, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 3/9] qapi: Fix visiter generator for nested structs/qobjects, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 1/9] qapi: Fix type generator for structured type members,
Michael Roth <=
- [Qemu-devel] [PATCH 4/9] qapi: some basename/guardname py utility functions, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 5/9] qapi: add --prefix option to type generator, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 6/9] qapi: add --prefix option for visiter generator, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 7/9] qapi: test schema for test-visiter unit tests, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 8/9] qapi: Makefile, build test-visiter with generated test code, Michael Roth, 2011/04/29
- [Qemu-devel] [PATCH 9/9] qapi: test-visiter, pull in gen code, tests for nested structures, Michael Roth, 2011/04/29