From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, berto@igalia.com, mdroth@linux.vnet.ibm.com
Subject: [Qemu-devel] [PATCH RFC v2 26/47] qapi-types: Convert to QAPISchemaVisitor, fixing flat unions
Date: Wed, 1 Jul 2015 22:22:14 +0200 [thread overview]
Message-ID: <1435782155-31412-27-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1435782155-31412-1-git-send-email-armbru@redhat.com>
Fixes flat unions to get the base's base members. Test case is from
commit 2fc0043, in qapi-schema-test.json:
{ 'union': 'UserDefFlatUnion',
'base': 'UserDefUnionBase',
'discriminator': 'enum1',
'data': { 'value1' : 'UserDefA',
'value2' : 'UserDefB',
'value3' : 'UserDefB' } }
{ 'struct': 'UserDefUnionBase',
'base': 'UserDefZero',
'data': { 'string': 'str', 'enum1': 'EnumOne' } }
{ 'struct': 'UserDefZero',
'data': { 'integer': 'int' } }
Patch's effect on UserDefFlatUnion:
struct UserDefFlatUnion {
+ int64_t integer;
char *string;
EnumOne enum1;
/* union tag is EnumOne enum1 */
union {
void *data;
UserDefA *value1;
UserDefB *value2;
UserDefB *value3;
};
};
Flat union visitors remain broken. They'll be fixed next.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
scripts/qapi-types.py | 268 +++++++++++++-------------------
tests/qapi-schema/qapi-schema-test.json | 4 +-
2 files changed, 114 insertions(+), 158 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index a48ad9c..d6185c6 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -2,88 +2,67 @@
# QAPI types generator
#
# Copyright IBM, Corp. 2011
+# Copyright (c) 2013-2015 Red Hat Inc.
#
# Authors:
# Anthony Liguori <aliguori@us.ibm.com>
+# Markus Armbruster <armbru@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2.
# See the COPYING file in the top-level directory.
-from ordereddict import OrderedDict
from qapi import *
-def generate_fwd_builtin(name):
- return mcgen('''
-
-typedef struct %(name)sList {
- union {
- %(type)s value;
- uint64_t padding;
- };
- struct %(name)sList *next;
-} %(name)sList;
-''',
- type=c_type(name),
- name=name)
-
-def generate_fwd_struct(name):
+def gen_fwd_object_or_array(name):
return mcgen('''
typedef struct %(name)s %(name)s;
-
-typedef struct %(name)sList {
- union {
- %(name)s *value;
- uint64_t padding;
- };
- struct %(name)sList *next;
-} %(name)sList;
''',
name=c_name(name))
-def generate_fwd_enum_struct(name):
+def gen_array(name, element_type):
return mcgen('''
-typedef struct %(name)sList {
+struct %(name)s {
union {
- %(name)s value;
+ %(c_type)s value;
uint64_t padding;
};
- struct %(name)sList *next;
-} %(name)sList;
+ struct %(name)s *next;
+};
''',
- name=c_name(name))
+ name=c_name(name), c_type=element_type.c_type())
-def generate_struct_fields(members):
+def gen_struct_field(name, typ, optional):
ret = ''
- for argname, argentry, optional in parse_args(members):
- if optional:
- ret += mcgen('''
+ if optional:
+ ret += mcgen('''
bool has_%(c_name)s;
''',
- c_name=c_name(argname))
- ret += mcgen('''
+ c_name=c_name(name))
+ ret += mcgen('''
%(c_type)s %(c_name)s;
''',
- c_type=c_type(argentry), c_name=c_name(argname))
-
+ c_type=typ.c_type(), c_name=c_name(name))
return ret
-def generate_struct(expr):
+def generate_struct_fields(members):
+ ret = ''
- structname = expr.get('struct', "")
- members = expr['data']
- base = expr.get('base')
+ for memb in members:
+ ret += gen_struct_field(memb.name, memb.type, memb.optional)
+ return ret
+def gen_struct(name, base, members):
ret = mcgen('''
struct %(name)s {
''',
- name=c_name(structname))
+ name=c_name(name))
if base:
- ret += generate_struct_fields({'base': base})
+ ret += gen_struct_field('base', base, False)
ret += generate_struct_fields(members)
@@ -156,46 +135,38 @@ typedef enum %(name)s {
return enum_decl + lookup_decl
-def generate_alternate_qtypes(expr):
+def gen_alternate_qtypes_decl(name):
+ return mcgen('''
- name = expr['alternate']
- members = expr['data']
+extern const int %(c_name)s_qtypes[];
+''',
+ c_name=c_name(name))
+def gen_alternate_qtypes(name, variants):
ret = mcgen('''
const int %(name)s_qtypes[QTYPE_MAX] = {
''',
name=c_name(name))
- for key in members:
- qtype = find_alternate_member_qtype(members[key])
- assert qtype, "Invalid alternate member"
+ for var in variants.variants:
+ qtype = var.type.alternate_qtype()
+ assert qtype
ret += mcgen('''
[%(qtype)s] = %(enum_const)s,
''',
qtype = qtype,
- enum_const = c_enum_const(name + 'Kind', key))
+ enum_const=c_enum_const(variants.tag_member.type.name,
+ var.name))
ret += mcgen('''
};
''')
return ret
-
-def generate_union(expr, meta):
-
- name = c_name(expr[meta])
- typeinfo = expr['data']
-
- base = expr.get('base')
- discriminator = expr.get('discriminator')
-
- enum_define = discriminator_find_enum_define(expr)
- if enum_define:
- discriminator_type_name = enum_define['enum_name']
- else:
- discriminator_type_name = '%sKind' % (name)
+def gen_union(name, base, variants):
+ name = c_name(name)
ret = mcgen('''
@@ -203,56 +174,49 @@ struct %(name)s {
''',
name=name)
if base:
- base_fields = find_struct(base)['data']
- ret += generate_struct_fields(base_fields)
+ ret += generate_struct_fields(base.members)
ret += mcgen('''
/* union tag is %(discriminator_type_name)s %(c_name)s */
''',
- discriminator_type_name=c_name(discriminator_type_name),
- c_name=c_name(discriminator))
+ discriminator_type_name=c_name(variants.tag_member.type.name),
+ c_name=c_name(variants.tag_member.name))
else:
- assert not discriminator
ret += mcgen('''
%(discriminator_type_name)s kind;
''',
- discriminator_type_name=c_name(discriminator_type_name))
+ discriminator_type_name=c_name(variants.tag_member.type.name))
ret += mcgen('''
union {
void *data;
''')
- for key in typeinfo:
+ for var in variants.variants:
ret += mcgen('''
%(c_type)s %(c_name)s;
''',
- c_type=c_type(typeinfo[key]),
- c_name=c_name(key))
+ c_type=var.type.c_type(),
+ c_name=c_name(var.name))
ret += mcgen('''
};
};
''')
- if meta == 'alternate':
- ret += mcgen('''
-extern const int %(name)s_qtypes[];
-''',
- name=name)
-
return ret
def generate_type_cleanup_decl(name):
ret = mcgen('''
-void qapi_free_%(name)s(%(c_type)s obj);
+
+void qapi_free_%(name)s(%(name)s *obj);
''',
- c_type=c_type(name), name=c_name(name))
+ name=c_name(name))
return ret
def generate_type_cleanup(name):
ret = mcgen('''
-void qapi_free_%(name)s(%(c_type)s obj)
+void qapi_free_%(name)s(%(name)s *obj)
{
QapiDeallocVisitor *md;
Visitor *v;
@@ -267,9 +231,68 @@ void qapi_free_%(name)s(%(c_type)s obj)
qapi_dealloc_visitor_cleanup(md);
}
''',
- c_type=c_type(name), name=c_name(name))
+ name=c_name(name))
return ret
+class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
+ def __init__(self):
+ self.decl = None
+ self.defn = None
+ self.fwdecl = None
+ self.fwdefn = None
+ self.btin = None
+ def visit_begin(self):
+ self.decl = ''
+ self.defn = ''
+ self.fwdecl = ''
+ self.fwdefn = ''
+ self.btin = guardstart('QAPI_TYPES_BUILTIN')
+ def visit_end(self):
+ self.decl = self.fwdecl + self.decl
+ self.fwdecl = None
+ self.defn = self.fwdefn + self.defn
+ self.fwdefn = None
+ # To avoid header dependency hell, we always generate
+ # declarations for built-in types in our header files and
+ # simply guard them.
+ self.btin += guardend('QAPI_TYPES_BUILTIN')
+ self.decl = self.btin + self.decl
+ self.btin = None
+ # Doesn't work for cases where we link in multiple objects
+ # that have the functions defined, so generate them only with
+ # option -b (do_builtins).
+ def _gen_type_cleanup(self, name):
+ self.decl += generate_type_cleanup_decl(name)
+ self.defn += generate_type_cleanup(name)
+ def visit_enum_type(self, name, info, values):
+ self.fwdecl += generate_enum(name, values)
+ self.fwdefn += generate_enum_lookup(name, values)
+ def visit_array_type(self, name, info, element_type):
+ if isinstance(element_type, QAPISchemaBuiltinType):
+ self.btin += gen_fwd_object_or_array(name)
+ self.btin += gen_array(name, element_type)
+ self.btin += generate_type_cleanup_decl(name)
+ if do_builtins:
+ self.defn += generate_type_cleanup(name)
+ else:
+ self.fwdecl += gen_fwd_object_or_array(name)
+ self.decl += gen_array(name, element_type)
+ self._gen_type_cleanup(name)
+ def visit_object_type(self, name, info, base, members, variants):
+ if info:
+ self.fwdecl += gen_fwd_object_or_array(name)
+ if variants:
+ self.decl += gen_union(name, base, variants)
+ else:
+ self.decl += gen_struct(name, base, members)
+ self._gen_type_cleanup(name)
+ def visit_alternate_type(self, name, info, variants):
+ self.fwdecl += gen_fwd_object_or_array(name)
+ self.fwdefn += gen_alternate_qtypes(name, variants)
+ self.decl += gen_union(name, None, variants)
+ self.decl += gen_alternate_qtypes_decl(name)
+ self._gen_type_cleanup(name)
+
do_builtins = False
(input_file, output_dir, do_c, do_h, prefix, opts) = \
@@ -325,77 +348,10 @@ fdecl.write(mcgen('''
#include <stdint.h>
'''))
-exprs = QAPISchema(input_file).get_exprs()
-
-fdecl.write(guardstart("QAPI_TYPES_BUILTIN_STRUCT_DECL"))
-for typename in builtin_types.keys():
- fdecl.write(generate_fwd_builtin(typename))
-fdecl.write(guardend("QAPI_TYPES_BUILTIN_STRUCT_DECL"))
-
-for expr in exprs:
- ret = ""
- if expr.has_key('struct'):
- ret += generate_fwd_struct(expr['struct'])
- elif expr.has_key('enum'):
- ret += generate_enum(expr['enum'], expr['data'])
- ret += generate_fwd_enum_struct(expr['enum'])
- fdef.write(generate_enum_lookup(expr['enum'], expr['data']))
- elif expr.has_key('union'):
- ret += generate_fwd_struct(expr['union'])
- enum_define = discriminator_find_enum_define(expr)
- if not enum_define:
- ret += generate_enum('%sKind' % expr['union'], expr['data'].keys())
- fdef.write(generate_enum_lookup('%sKind' % expr['union'],
- expr['data'].keys()))
- elif expr.has_key('alternate'):
- ret += generate_fwd_struct(expr['alternate'])
- ret += generate_enum('%sKind' % expr['alternate'], expr['data'].keys())
- fdef.write(generate_enum_lookup('%sKind' % expr['alternate'],
- expr['data'].keys()))
- fdef.write(generate_alternate_qtypes(expr))
- else:
- continue
- fdecl.write(ret)
-
-# to avoid header dependency hell, we always generate declarations
-# for built-in types in our header files and simply guard them
-fdecl.write(guardstart("QAPI_TYPES_BUILTIN_CLEANUP_DECL"))
-for typename in builtin_types.keys():
- fdecl.write(generate_type_cleanup_decl(typename + "List"))
-fdecl.write(guardend("QAPI_TYPES_BUILTIN_CLEANUP_DECL"))
-
-# ...this doesn't work for cases where we link in multiple objects that
-# have the functions defined, so we use -b option to provide control
-# over these cases
-if do_builtins:
- for typename in builtin_types.keys():
- fdef.write(generate_type_cleanup(typename + "List"))
-
-for expr in exprs:
- ret = ""
- if expr.has_key('struct'):
- ret += generate_struct(expr) + "\n"
- ret += generate_type_cleanup_decl(expr['struct'] + "List")
- fdef.write(generate_type_cleanup(expr['struct'] + "List"))
- ret += generate_type_cleanup_decl(expr['struct'])
- fdef.write(generate_type_cleanup(expr['struct']))
- elif expr.has_key('union'):
- ret += generate_union(expr, 'union') + "\n"
- ret += generate_type_cleanup_decl(expr['union'] + "List")
- fdef.write(generate_type_cleanup(expr['union'] + "List"))
- ret += generate_type_cleanup_decl(expr['union'])
- fdef.write(generate_type_cleanup(expr['union']))
- elif expr.has_key('alternate'):
- ret += generate_union(expr, 'alternate') + "\n"
- ret += generate_type_cleanup_decl(expr['alternate'] + "List")
- fdef.write(generate_type_cleanup(expr['alternate'] + "List"))
- ret += generate_type_cleanup_decl(expr['alternate'])
- fdef.write(generate_type_cleanup(expr['alternate']))
- elif expr.has_key('enum'):
- ret += "\n" + generate_type_cleanup_decl(expr['enum'] + "List")
- fdef.write(generate_type_cleanup(expr['enum'] + "List"))
- else:
- continue
- fdecl.write(ret)
+schema = QAPISchema(input_file)
+gen = QAPISchemaGenTypeVisitor()
+schema.visit(gen)
+fdef.write(gen.defn)
+fdecl.write(gen.decl)
close_output(fdef, fdecl)
diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index a9e5aab..257b4d4 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -39,8 +39,8 @@
'data': { 'value1' : 'UserDefA',
'value2' : 'UserDefB',
'value3' : 'UserDefB' } }
-# FIXME generated struct UserDefFlatUnion has members for direct base
-# UserDefUnionBase, but lacks members for indirect base UserDefZero
+# FIXME generated visit_type_UserDefFlatUnion_fields() fails to visit
+# members of indirect base UserDefZero
{ 'struct': 'UserDefUnionBase',
'base': 'UserDefZero',
--
1.9.3
next prev parent reply other threads:[~2015-07-01 20:22 UTC|newest]
Thread overview: 199+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-01 20:21 [Qemu-devel] [PATCH RFC v2 00/47] qapi: QMP introspection Markus Armbruster
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 01/47] qapi: Clarify docs on including the same file multiple times Markus Armbruster
2015-07-20 15:17 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 02/47] qapi: Clean up cgen() and mcgen() Markus Armbruster
2015-07-20 16:45 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 03/47] qapi: Simplify guardname() Markus Armbruster
2015-07-20 17:32 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 04/47] qapi-event: Clean up how name of enum QAPIEvent is made Markus Armbruster
2015-07-20 17:46 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 05/47] qapi: Reject -p arguments that break qapi-event.py Markus Armbruster
2015-07-20 17:57 ` Eric Blake
2015-07-20 18:04 ` Eric Blake
2015-07-24 11:41 ` Markus Armbruster
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 06/47] qapi: Drop unused and useless parameters and variables Markus Armbruster
2015-07-20 21:14 ` Eric Blake
2015-07-24 11:44 ` Markus Armbruster
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 07/47] qapi: Generate a nicer struct for flat unions Markus Armbruster
2015-07-20 23:07 ` Eric Blake
2015-07-24 12:01 ` Markus Armbruster
2015-07-27 21:34 ` Eric Blake
2015-07-28 6:15 ` Markus Armbruster
2015-07-28 20:09 ` Eric Blake
2015-07-29 7:33 ` Markus Armbruster
2015-07-29 20:15 ` Eric Blake
2015-07-30 7:11 ` Markus Armbruster
2015-07-30 14:14 ` Eric Blake
2015-07-30 15:44 ` Markus Armbruster
2015-07-30 23:08 ` Eric Blake
2015-07-31 11:00 ` Markus Armbruster
2015-07-31 9:46 ` Markus Armbruster
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 08/47] qapi-visit: Fix generated code when schema has forward refs Markus Armbruster
2015-07-20 23:19 ` Eric Blake
2015-07-27 7:31 ` Markus Armbruster
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 09/47] qapi-visit: Replace list implicit_structs by set Markus Armbruster
2015-07-20 23:21 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 10/47] qapi-visit: Fix two name arguments passed to visitors Markus Armbruster
2015-07-21 2:26 ` Eric Blake
2015-07-01 20:21 ` [Qemu-devel] [PATCH RFC v2 11/47] tests/qapi-schema: Document alternate's enum lacks visit function Markus Armbruster
2015-07-21 3:06 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 12/47] tests/qapi-schema: Document events with with base don't work Markus Armbruster
2015-07-21 3:08 ` Eric Blake
2015-07-30 22:33 ` [Qemu-devel] [RFC PATCH 12.5/47] qapi: Document that input visitor semantics are prone to leaks Eric Blake
2015-07-31 9:50 ` Markus Armbruster
2015-07-30 23:07 ` [Qemu-devel] [RFC PATCH 12.6/47] qapi: Document shortcoming with union 'data' branch Eric Blake
2015-07-31 9:50 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 13/47] tests/qapi-schema: Restore test case for flat union base bug Markus Armbruster
2015-07-21 3:19 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 14/47] qapi-tests: New tests for union, alternate command arguments Markus Armbruster
2015-07-21 12:43 ` Eric Blake
2015-07-23 14:59 ` Eric Blake
2015-07-27 7:50 ` Markus Armbruster
2015-07-27 13:06 ` Eric Blake
2015-07-31 13:15 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 15/47] qapi: Fix to reject union " Markus Armbruster
2015-07-21 14:17 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 16/47] qapi-commands: Fix gen_err_check(e) for e and e != 'local_err' Markus Armbruster
2015-07-21 16:23 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 17/47] qapi-commands: Inline gen_marshal_output_call() Markus Armbruster
2015-07-21 16:41 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 18/47] qapi-commands: Don't feed output of mcgen() to mcgen() again Markus Armbruster
2015-07-21 17:20 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 19/47] qapi: Generated code cleanup Markus Armbruster
2015-07-21 17:43 ` Eric Blake
2015-07-27 8:07 ` Markus Armbruster
2015-08-04 9:08 ` Markus Armbruster
2015-08-04 12:31 ` Eric Blake
2015-08-04 14:35 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 20/47] qapi: Rename class QAPISchema to QAPISchemaParser Markus Armbruster
2015-07-21 17:52 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 21/47] qapi: New QAPISchema intermediate reperesentation Markus Armbruster
2015-07-21 20:32 ` Eric Blake
2015-07-27 9:23 ` Markus Armbruster
2015-07-27 14:01 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 22/47] qapi: QAPISchema code generation helper methods Markus Armbruster
2015-07-21 21:02 ` Eric Blake
2015-07-27 9:36 ` Markus Armbruster
2015-07-23 12:36 ` Eric Blake
2015-07-27 9:54 ` Markus Armbruster
2015-07-27 14:05 ` Eric Blake
2015-07-31 14:00 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 23/47] qapi: New QAPISchemaVisitor Markus Armbruster
2015-07-21 21:59 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 24/47] tests/qapi-schema: Convert test harness to QAPISchemaVisitor Markus Armbruster
2015-07-21 22:23 ` Eric Blake
2015-07-27 14:03 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 25/47] qapi: Make generators work on sorted schema expressions Markus Armbruster
2015-07-21 22:50 ` Eric Blake
2015-07-27 14:19 ` Markus Armbruster
2015-07-01 20:22 ` Markus Armbruster [this message]
2015-07-22 17:34 ` [Qemu-devel] [PATCH RFC v2 26/47] qapi-types: Convert to QAPISchemaVisitor, fixing flat unions Eric Blake
2015-07-22 20:07 ` Eric Blake
2015-07-27 15:59 ` Markus Armbruster
2015-07-22 21:21 ` Eric Blake
2015-07-22 22:56 ` Eric Blake
2015-07-27 16:09 ` Markus Armbruster
2015-07-27 16:25 ` Eric Blake
2015-07-28 6:16 ` Markus Armbruster
2015-07-29 23:11 ` Eric Blake
2015-07-30 6:42 ` Markus Armbruster
2015-07-30 12:46 ` Eric Blake
2015-07-30 15:53 ` Markus Armbruster
2015-07-30 16:36 ` Eric Blake
2015-07-30 21:51 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 27/47] qapi-visit: Convert to QAPISchemaVisitor, fixing bugs Markus Armbruster
2015-07-22 22:28 ` Eric Blake
2015-07-27 17:53 ` Markus Armbruster
2015-07-27 19:01 ` Eric Blake
2015-07-28 6:41 ` Markus Armbruster
2015-07-28 14:46 ` Eric Blake
2015-07-29 7:59 ` Markus Armbruster
2015-07-27 21:35 ` Eric Blake
2015-07-28 6:44 ` Markus Armbruster
2015-07-28 20:41 ` Eric Blake
2015-07-29 8:00 ` Markus Armbruster
2015-07-29 16:56 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 28/47] qapi-commands: Convert to QAPISchemaVisitor Markus Armbruster
2015-07-22 23:05 ` Eric Blake
2015-07-27 18:08 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 29/47] qapi: Replace dirty is_c_ptr() by method c_null() Markus Armbruster
2015-07-22 23:22 ` Eric Blake
2015-07-28 7:34 ` Markus Armbruster
2015-07-28 14:53 ` Eric Blake
2015-07-29 8:32 ` Markus Armbruster
2015-07-29 15:41 ` Eric Blake
2015-07-29 17:22 ` Markus Armbruster
2015-07-30 14:19 ` Eric Blake
2015-07-30 15:57 ` Markus Armbruster
2015-07-30 22:48 ` Eric Blake
2015-07-31 7:43 ` Markus Armbruster
2015-07-23 12:32 ` Eric Blake
2015-07-28 7:57 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 30/47] qapi: De-duplicate enum code generation Markus Armbruster
2015-07-23 12:46 ` Eric Blake
2015-07-28 8:13 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 31/47] qapi-event: Eliminate global variable event_enum_value Markus Armbruster
2015-07-23 14:31 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 32/47] qapi-event: Convert to QAPISchemaVisitor, fixing data with base Markus Armbruster
2015-07-23 15:14 ` Eric Blake
2015-07-28 8:32 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 33/47] qapi: Clean up after recent conversions to QAPISchemaVisitor Markus Armbruster
2015-07-23 16:48 ` Eric Blake
2015-07-28 9:18 ` Markus Armbruster
2015-07-28 21:13 ` Eric Blake
2015-07-28 21:37 ` Eric Blake
2015-07-29 8:33 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 34/47] qapi-visit: Rearrange code a bit Markus Armbruster
2015-07-23 17:00 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 35/47] qapi-commands: Rearrange code Markus Armbruster
2015-07-23 17:41 ` Eric Blake
2015-07-28 9:18 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 36/47] qapi: Rename qmp_marshal_input_FOO() to qmp_marshal_FOO() Markus Armbruster
2015-07-23 19:07 ` Eric Blake
2015-07-28 9:19 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 37/47] qapi: De-duplicate parameter list generation Markus Armbruster
2015-07-23 19:27 ` Eric Blake
2015-07-28 11:15 ` Markus Armbruster
2015-07-28 17:48 ` Eric Blake
2015-07-29 8:36 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 38/47] qapi-commands: De-duplicate output marshaling functions Markus Armbruster
2015-07-23 19:47 ` Eric Blake
2015-07-28 11:20 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 39/47] qapi: Improve built-in type documentation Markus Armbruster
2015-07-23 21:29 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 40/47] qapi: Introduce a first class 'any' type Markus Armbruster
2015-07-23 22:04 ` Eric Blake
2015-07-28 11:31 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 41/47] qom: Don't use 'gen': false for qom-get, qom-set, object-add Markus Armbruster
2015-07-23 22:21 ` Eric Blake
2015-07-28 11:59 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 42/47] qapi-schema: Fix up misleading specification of netdev_add Markus Armbruster
2015-07-23 22:59 ` Eric Blake
2015-07-28 12:04 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 43/47] qmp: Improve netdev_add usage example in the manual Markus Armbruster
2015-07-23 23:01 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 44/47] qapi: Pseudo-type '**' is now unused, drop it Markus Armbruster
2015-07-23 23:20 ` Eric Blake
2015-07-28 12:24 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 45/47] qapi: New QMP command query-schema for QMP schema introspection Markus Armbruster
2015-07-24 3:29 ` Eric Blake
2015-07-28 14:33 ` Markus Armbruster
2015-07-28 19:11 ` Eric Blake
2015-07-29 9:19 ` Markus Armbruster
2015-07-29 15:56 ` Eric Blake
2015-07-29 17:26 ` Markus Armbruster
2015-08-03 15:15 ` Markus Armbruster
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 46/47] qapi-introspect: Map all integer types to 'int' Markus Armbruster
2015-07-24 3:33 ` Eric Blake
2015-07-01 20:22 ` [Qemu-devel] [PATCH RFC v2 47/47] qapi-introspect: Hide type names Markus Armbruster
2015-07-24 3:44 ` Eric Blake
2015-07-27 16:15 ` Eric Blake
2015-07-28 18:39 ` Markus Armbruster
2015-07-28 21:26 ` Eric Blake
2015-07-29 9:24 ` Markus Armbruster
2015-07-28 18:24 ` Markus Armbruster
2015-07-28 21:32 ` Eric Blake
2015-07-29 9:34 ` Markus Armbruster
2015-07-29 16:03 ` Eric Blake
2015-07-28 23:19 ` Eric Blake
2015-07-29 9:35 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1435782155-31412-27-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=kwolf@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).