All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v2 29/54] qapi: add 'if' to enum members
Date: Wed, 06 Sep 2017 15:01:37 +0200	[thread overview]
Message-ID: <8737807zgu.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20170822132255.23945-30-marcandre.lureau@redhat.com> ("Marc-André Lureau"'s message of "Tue, 22 Aug 2017 15:22:30 +0200")

Marc-André Lureau <marcandre.lureau@redhat.com> writes:

> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  scripts/qapi.py                         | 33 +++++++++++++++++++++++++++------
>  tests/qapi-schema/enum-dict-member.err  |  1 -
>  tests/qapi-schema/enum-dict-member.exit |  2 +-
>  tests/qapi-schema/enum-dict-member.json |  3 +--
>  tests/qapi-schema/enum-dict-member.out  |  4 ++++
>  tests/qapi-schema/qapi-schema-test.json |  5 +++--
>  tests/qapi-schema/qapi-schema-test.out  |  3 ++-
>  tests/qapi-schema/test-qapi.py          |  4 +++-
>  8 files changed, 41 insertions(+), 14 deletions(-)
>
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index 9d075440d3..9c7c01c11d 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -729,6 +729,10 @@ def check_event(expr, info):
>                 allow_metas=meta)
>  
>  
> +def enum_get_values(expr):
> +    return [e if isinstance(e, str) else e['name'] for e in expr['data']]
> +
> +

An iterator would be more efficient, but this will do.

>  def check_union(expr, info):
>      name = expr['union']
>      base = expr.get('base')
> @@ -788,7 +792,7 @@ def check_union(expr, info):
>          # If the discriminator names an enum type, then all members
>          # of 'data' must also be members of the enum type.
>          if enum_define:
> -            if key not in enum_define['data']:
> +            if key not in enum_get_values(enum_define):
>                  raise QAPISemError(info,
>                                     "Discriminator value '%s' is not found in "
>                                     "enum '%s'"
> @@ -796,7 +800,7 @@ def check_union(expr, info):
>  
>      # If discriminator is user-defined, ensure all values are covered
>      if enum_define:
> -        for value in enum_define['data']:
> +        for value in enum_get_values(enum_define):
>              if value not in members.keys():
>                  raise QAPISemError(info, "Union '%s' data missing '%s' branch"
>                                     % (name, value))
> @@ -827,7 +831,7 @@ def check_alternate(expr, info):
>          if qtype == 'QTYPE_QSTRING':
>              enum_expr = enum_types.get(value)
>              if enum_expr:
> -                for v in enum_expr['data']:
> +                for v in enum_get_values(enum_expr):
>                      if v in ['on', 'off']:
>                          conflicting.add('QTYPE_QBOOL')
>                      if re.match(r'[-+0-9.]', v): # lazy, could be tightened
> @@ -857,6 +861,12 @@ def check_enum(expr, info):
>          raise QAPISemError(info,
>                             "Enum '%s' requires a string for 'prefix'" % name)
>      for member in members:
> +        if isinstance(member, dict):
> +            if not 'name' in member:
> +                raise QAPISemError(info, "Dictionary member of enum '%s' must "
> +                                   "have a 'name' key" % name)
> +            check_if(member, info)
> +            member = member['name']
>          check_name(info, "Member of enum '%s'" % name, member,
>                     enum_member=True)
>  

Looks like you got all uses of enum's 'data' in the old semantic
checker.

Aside: work like this is why I dislike how the old semantic checker
works directly on the parse trees represented as OrderedDict.
Everything is a dictionary, and almost everything's key is 'data'.

> @@ -1145,12 +1155,15 @@ class QAPISchemaEnumType(QAPISchemaType):
>      def member_names(self):
>          return [v.name for v in self.values]
>  
> +    def members(self):
> +        return [(v.name, v.ifcond) for v in self.values]
> +
>      def json_type(self):
>          return 'string'
>  
>      def visit(self, visitor):
>          visitor.visit_enum_type(self.name, self.info,
> -                                self.member_names(), self.prefix, self.ifcond)
> +                                self.members(), self.prefix, self.ifcond)
>  
>  

This is the only use of .members().  Should it be ._members()?

You're changing the signature of QAPISchemaVisitor.visit_enum_type():
its @values parameter now takes a list of pairs of str instead of a list
of str.  Easy to miss in review; a heads-up in the commit message is
appreaciated in such cases.

The change affects the classes that implement visit_enum_type():

* QAPISchemaGenIntrospectVisitor

  Doesn't examine @values itself, passes it on to self._gen_qlit().
  PATCH 21 prepared it for this change of input.  Okay.

* QAPISchemaGenTypeVisitor

  Doesn't examine @values itself, passes it on to gen_enum() and
  gen_enum_lookup().  They get updated for this change below.  Okay.

* QAPISchemaGenVisitVisitor

  Doesn't use @values at all.  Okay.

* QAPISchemaGenDocVisitor

  Doesn't use @values at all.  Kind of surprising, until you realize
  that the code gets the members from the doc string instead.  Okay.

I can figure out stuff like that only because you got your patches split
up nicely in v2.  Appreciated!  On the other hand, I need to figure out
stuff like that the hard way because your commit messages don't mention
them.  Without a hint from you, a casual reviewer may miss that the
change of the visitor.visit_enum_type() call above is an interface
change, with non-local impact.  This reviewer will (on a good day) go
"WTF?!?", and reach for the extra-fine comb.

Explaining WTF-triggers proactively can speed up review significantly.
Eric's pretty good at it.

>  class QAPISchemaArrayType(QAPISchemaType):
> @@ -1274,9 +1287,11 @@ class QAPISchemaObjectType(QAPISchemaType):
>  class QAPISchemaMember(object):
>      role = 'member'
>  
> -    def __init__(self, name):
> +    def __init__(self, name, ifcond=None):
>          assert isinstance(name, str)
> +        assert ifcond is None or isinstance(ifcond, str)
>          self.name = name
> +        self.ifcond = ifcond
>          self.owner = None
>  
>      def set_owner(self, name):
> @@ -1554,7 +1569,9 @@ class QAPISchema(object):
>                                              qtype_values, 'QTYPE'))
>  
>      def _make_enum_members(self, values):
> -        return [QAPISchemaMember(v) for v in values]
> +        return [QAPISchemaMember(v['name'], v.get('if')) if isinstance(v, dict)
> +                else QAPISchemaMember(v)
> +                for v in values]

I'm afraid this list comprehension has become incomprehensible :)

Perhaps something like that would do:

    def _make_enum_member(self, value):
        if isinstance(value, 'str'):
            value = { 'name': value }
        return QAPISchemaMember(name, value['name'], value.get('if')

    def _make_enum_members(self, values):
        return [self._make_enum_members(v) for v in values]

Makes the desugaring blatantly obvious.

>  
>      def _make_implicit_enum_type(self, name, info, values, ifcond):
>          # See also QAPISchemaObjectTypeMember._pretty_owner()
> @@ -1950,6 +1967,8 @@ static const char *const %(c_name)s_array[] = {

This is gen_enum_lookup().

>  ''',
>                  c_name=c_name(name))
>      for value in values:
> +        if isinstance(value, tuple):
> +            value, ifcond = value

Any future use of ifcond outside isinstance(value, tuple) won't work.
Are you missing else: ifcond = None?

>          index = c_enum_const(name, value, prefix)
>          ret += mcgen('''
>      [%(index)s] = "%(value)s",
> @@ -1980,6 +1999,8 @@ typedef enum %(c_name)s {

This is gen_enum().

>                  c_name=c_name(name))
>  
>      for value in enum_values:
> +        if isinstance(value, tuple):
> +            value, ifcond = value

Same question.

>          ret += mcgen('''
>      %(c_enum)s,
>  ''',
> diff --git a/tests/qapi-schema/enum-dict-member.err b/tests/qapi-schema/enum-dict-member.err
> index 8ca146ea59..e69de29bb2 100644
> --- a/tests/qapi-schema/enum-dict-member.err
> +++ b/tests/qapi-schema/enum-dict-member.err
> @@ -1 +0,0 @@
> -tests/qapi-schema/enum-dict-member.json:2: Member of enum 'MyEnum' requires a string name
> diff --git a/tests/qapi-schema/enum-dict-member.exit b/tests/qapi-schema/enum-dict-member.exit
> index d00491fd7e..573541ac97 100644
> --- a/tests/qapi-schema/enum-dict-member.exit
> +++ b/tests/qapi-schema/enum-dict-member.exit
> @@ -1 +1 @@
> -1
> +0
> diff --git a/tests/qapi-schema/enum-dict-member.json b/tests/qapi-schema/enum-dict-member.json
> index 79672e0f09..b09a83061c 100644
> --- a/tests/qapi-schema/enum-dict-member.json
> +++ b/tests/qapi-schema/enum-dict-member.json
> @@ -1,2 +1 @@
> -# we reject any enum member that is not a string
> -{ 'enum': 'MyEnum', 'data': [ { 'value': 'str' } ] }
> +{ 'enum': 'TestEnum', 'data': [ { 'name': 'foo' }, { 'name': 'bar' } ]}

This negative test needs to be replaced.

Positive tests should generally go into qapi-schema-test.json, because
there their generated code gets fed to the compiler.  Peeking ahead a
bit, I can see you add a suitable positive test there.

Looks like you got replacements in PATCH 31.  I haven't looked at PATCH
31, so I can't yet say whether the replacements provide sufficient
coverage.

You can probably drop enum-dict-member.json, and squash PATCH 31 into
this one.

> diff --git a/tests/qapi-schema/enum-dict-member.out b/tests/qapi-schema/enum-dict-member.out
> index e69de29bb2..cf8e3cce2b 100644
> --- a/tests/qapi-schema/enum-dict-member.out
> +++ b/tests/qapi-schema/enum-dict-member.out
> @@ -0,0 +1,4 @@
> +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> +    prefix QTYPE
> +enum TestEnum ['foo', 'bar']
> +object q_empty
> diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
> index dc2c444fc1..ad2b405d83 100644
> --- a/tests/qapi-schema/qapi-schema-test.json
> +++ b/tests/qapi-schema/qapi-schema-test.json
> @@ -194,7 +194,8 @@
>  { 'struct': 'TestIfStruct', 'data': { 'foo': 'int' },
>    'if': 'defined(TEST_IF_STRUCT)' }
>  
> -{ 'enum': 'TestIfEnum', 'data': [ 'foo', 'bar' ],
> +{ 'enum': 'TestIfEnum', 'data':
> +  [ 'foo', { 'name' : 'bar', 'if': 'defined(TEST_IF_ENUM_BAR)' } ],
>    'if': 'defined(TEST_IF_ENUM)' }
>  
>  { 'union': 'TestIfUnion', 'data': { 'foo': 'TestStruct' },
> @@ -203,7 +204,7 @@
>  { 'alternate': 'TestIfAlternate', 'data': { 'foo': 'int', 'bar': 'TestStruct' },
>    'if': 'defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)' }
>  
> -{ 'command': 'TestIfCmd', 'data': { 'foo': 'TestIfStruct' },
> +{ 'command': 'TestIfCmd', 'data': { 'foo': 'TestIfStruct', 'bar': 'TestIfEnum' },
>    'if': 'defined(TEST_IF_CMD) && defined(TEST_IF_STRUCT)' }
>  
>  { 'event': 'TestIfEvent', 'data': { 'foo': 'TestIfStruct' },
> diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
> index fc5fd25f1b..211c367632 100644
> --- a/tests/qapi-schema/qapi-schema-test.out
> +++ b/tests/qapi-schema/qapi-schema-test.out
> @@ -60,7 +60,7 @@ alternate TestIfAlternate
>  command TestIfCmd q_obj_TestIfCmd-arg -> None
>     gen=True success_response=True boxed=False
>      if defined(TEST_IF_CMD) && defined(TEST_IF_STRUCT)
> -enum TestIfEnum ['foo', 'bar']
> +enum TestIfEnum ['foo', ('bar', 'defined(TEST_IF_ENUM_BAR)')]

I've had a nagging bad feeling about this tuple business, and I just
realized why: *everything* else in QAPISchema is a proper object.  The
whole *purpose* of QAPISchema is to have objects rather than parse trees
represented as dictionaries and lists.

In the original design of QAPISchema, enum members had just one
property: their name.  Thus, I chose to represent them by their name.
That was a mistake.  You're adding a second property: ifcond (you're
going to add it to other kinds of members, too).  It's time to correct
my design mistake and make enum members objects.

You change QAPISchemaEnumType.values from list of str to list of (str or
pair of str).  It needs to change to list of QAPISchemaMember instead.

If we ever need to add more properties to enum members, we'll have nice
objects we can extend, just like for members of other types.

>      if defined(TEST_IF_ENUM)
>  event TestIfEvent q_obj_TestIfEvent-arg
>     boxed=False
> @@ -197,6 +197,7 @@ object q_obj_EVENT_D-arg
>      member enum3: EnumOne optional=True
>  object q_obj_TestIfCmd-arg
>      member foo: TestIfStruct optional=False
> +    member bar: TestIfEnum optional=False
>      if defined(TEST_IF_CMD) && defined(TEST_IF_STRUCT)
>  object q_obj_TestIfEvent-arg
>      member foo: TestIfStruct optional=False
> diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
> index 17fd975812..70054848f0 100644
> --- a/tests/qapi-schema/test-qapi.py
> +++ b/tests/qapi-schema/test-qapi.py
> @@ -18,7 +18,9 @@ import sys
>  
>  class QAPISchemaTestVisitor(QAPISchemaVisitor):
>      def visit_enum_type(self, name, info, values, prefix, ifcond):
> -        print 'enum %s %s' % (name, values)
> +        values = ', '.join(["'%s'" % v[0] if not v[1] else str(v)
> +                            for v in values])
> +        print 'enum %s [%s]' % (name, values)

Since members of enums are QAPISchemaMember, let's print them just like
we print QAPISchemaMember elsewhere.  Should look roughly like this:

enum TestIfEnum
    member foo:
    member bar: if=defined(TEST_IF_ENUM_BAR)
    if defined(TEST_IF_ENUM)

>          if prefix:
>              print '    prefix %s' % prefix
>          self._print_if(ifcond)

In my testing, the generated code's indentation is off in places,
similar to what I observed for PATCH 22:

   diff -rup qapi-gen-28-da2a3fdd1d/test-qmp-introspect.c qapi-gen-29-e4c1659ff2/test-qmp-introspect.c
   --- qapi-gen-28-da2a3fdd1d/test-qmp-introspect.c	2017-09-06 12:55:17.502850257 +0200
   +++ qapi-gen-29-e4c1659ff2/test-qmp-introspect.c	2017-09-06 12:55:25.979731553 +0200
   [...]
    @@ -678,19 +683,41 @@ QLIT_QDICT(((QLitDictEntry[]) {
     #endif /* defined(TEST_IF_STRUCT) */


    -    QLIT_QDICT(((QLitDictEntry[]) {
    +    
    +#if defined(TEST_IF_ENUM)
    +
    +QLIT_QDICT(((QLitDictEntry[]) {
             { "meta-type", QLIT_QSTR("enum") },
             { "name", QLIT_QSTR("22") },
             { "values", QLIT_QLIST(((QLitObject[]) {
    +            QLIT_QSTR("foo"),
    +            
    +#if defined(TEST_IF_ENUM_BAR)
    +
--> +QLIT_QSTR("bar"),
    +#endif /* defined(TEST_IF_ENUM_BAR) */
    +
    +
    +            {}
    +        })) },
    +        {}
    +    })),
    +#endif /* defined(TEST_IF_ENUM) */
    +
    +
    +    QLIT_QDICT(((QLitDictEntry[]) {
    +        { "meta-type", QLIT_QSTR("enum") },
    +        { "name", QLIT_QSTR("23") },
    +        { "values", QLIT_QLIST(((QLitObject[]) {
                 QLIT_QSTR("__org.qemu_x-value"),
                 {}
             })) },
             {}

  reply	other threads:[~2017-09-06 13:02 UTC|newest]

Thread overview: 141+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-22 13:22 [Qemu-devel] [PATCH v2 00/54] qapi: add #if pre-processor conditions to generated code Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 01/54] qapi: fix type_seen key error Marc-André Lureau
2017-08-22 15:00   ` Markus Armbruster
2017-08-22 15:50     ` Marc-André Lureau
2017-08-22 16:40       ` Markus Armbruster
2017-08-25  6:02   ` Markus Armbruster
2017-08-25 12:57     ` Eduardo Habkost
2017-08-25 14:12       ` Marc-André Lureau
2017-08-28 10:52         ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 02/54] qdict: add qdict_put_null() helper Marc-André Lureau
2017-08-22 15:09   ` Markus Armbruster
2017-08-25 15:46     ` Eric Blake
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 03/54] qobject: add literal qobject type Marc-André Lureau
2017-08-22 15:31   ` Markus Armbruster
2017-08-22 15:42     ` Marc-André Lureau
2017-08-22 16:24       ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 04/54] qlit: add qobject_form_qlit() Marc-André Lureau
2017-08-22 15:40   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 05/54] qapi: generate a literal qobject for introspection Marc-André Lureau
2017-08-22 16:33   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 06/54] qapi: introduce qapi_enum_lookup() Marc-André Lureau
2017-08-22 18:10   ` John Snow
2017-08-23  8:02   ` Markus Armbruster
2017-08-23 10:10     ` Marc-André Lureau
2017-08-24 11:14       ` Dr. David Alan Gilbert
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 07/54] tpm: simplify driver registration & lookup Marc-André Lureau
2017-08-23  9:04   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 08/54] hmp: use qapi_enum_parse() in hmp_migrate_set_capability Marc-André Lureau
2017-08-23  9:34   ` Markus Armbruster
2017-08-24 11:29   ` Dr. David Alan Gilbert
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 09/54] hmp: use qapi_enum_parse() in hmp_migrate_set_parameter Marc-André Lureau
2017-08-23  9:43   ` Markus Armbruster
2017-08-24 13:16     ` Dr. David Alan Gilbert
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 10/54] block: use qemu_enum_parse() in blkdebug_debug_breakpoint Marc-André Lureau
2017-08-23 10:05   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 11/54] quorum: use qapi_enum_parse() in quorum_open Marc-André Lureau
2017-08-22 13:40   ` Alberto Garcia
2017-08-23 11:15     ` Markus Armbruster
2017-08-23 11:24   ` Markus Armbruster
2017-08-23 11:53     ` Alberto Garcia
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 12/54] qapi: change enum lookup structure Marc-André Lureau
2017-08-23 12:09   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 13/54] qapi: drop the sentinel in enum array Marc-André Lureau
2017-08-23 12:37   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 14/54] qapi2texi: minor python code simplification Marc-André Lureau
2017-08-22 13:56   ` Philippe Mathieu-Daudé
2017-09-01 15:49   ` Markus Armbruster
2017-09-04  8:18     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 15/54] qapi: add 'if' to top-level expressions Marc-André Lureau
2017-09-04 13:27   ` Markus Armbruster
2017-09-05 13:58     ` Marc-André Lureau
2017-09-06 11:36       ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 16/54] qapi: add a test for invalid 'if' Marc-André Lureau
2017-09-04 13:31   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 17/54] qapi: add 'if' condition on entity objects Marc-André Lureau
2017-09-04 16:13   ` Markus Armbruster
2017-09-05 15:38     ` Marc-André Lureau
2017-09-05 16:31       ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 18/54] qapi: add 'ifcond' to visitor methods Marc-André Lureau
2017-09-04 16:47   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 19/54] qapi: add #if/#endif helpers Marc-André Lureau
2017-09-05  9:32   ` Markus Armbruster
2017-09-06 15:19     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 20/54] qapi-introspect: modify to_qlit() to take an optional suffix Marc-André Lureau
2017-09-05  9:42   ` Markus Armbruster
2017-09-06 14:02     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 21/54] qapi-introspect: modify to_qlit() to generate #if code Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 22/54] qapi-introspect: add preprocessor conditions to generated QLit Marc-André Lureau
2017-09-05 14:24   ` Markus Armbruster
2017-09-05 16:24     ` Marc-André Lureau
2017-09-06 11:38   ` Markus Armbruster
2017-09-06 14:26     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 23/54] qapi-commands: add #if conditions to commands Marc-André Lureau
2017-09-05 14:53   ` Markus Armbruster
2017-09-05 15:05     ` Marc-André Lureau
2017-09-05 15:08       ` Marc-André Lureau
2017-09-05 16:34         ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 24/54] qapi-event: add #if conditions to events Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 25/54] qapi-visit: add #if conditions to visitors Marc-André Lureau
2017-09-06 10:54   ` Markus Armbruster
2017-09-06 14:22     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 26/54] qapi-types: refactor variants handling Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 27/54] qapi-types: add #if conditions to types Marc-André Lureau
2017-09-06 11:43   ` Markus Armbruster
2017-09-06 14:56     ` Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 28/54] qapi: do not define enumeration value explicitely Marc-André Lureau
2017-08-22 14:00   ` Philippe Mathieu-Daudé
2017-09-05 17:45   ` Markus Armbruster
2017-09-06 12:09     ` Marc-André Lureau
2017-09-06 13:39       ` Markus Armbruster
2017-09-06 13:55         ` Marc-André Lureau
2017-09-06 15:20           ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 29/54] qapi: add 'if' to enum members Marc-André Lureau
2017-09-06 13:01   ` Markus Armbruster [this message]
2017-09-07 14:11     ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 30/54] qapi: add #if conditions on generated enum values Marc-André Lureau
2017-09-06 15:38   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 31/54] tests: add some enum members tests Marc-André Lureau
2017-09-06 15:41   ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 32/54] qapi: add 'if' to struct members Marc-André Lureau
2017-09-07 14:26   ` Markus Armbruster
2017-09-07 15:30     ` Marc-André Lureau
2017-09-07 15:52       ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 33/54] qapi: add some struct member tests Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 34/54] qapi: add #if conditions to generated struct members Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 35/54] qapi: add 'if' on union variants Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 36/54] qapi: add #if conditions to generated variants Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 37/54] qapi: 'if' to alternate variant Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 38/54] qapi: add tests for invalid alternate Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 39/54] qapi: add #if conditions to generated alternate variants Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 40/54] docs: document schema configuration Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 41/54] qapi2texi: add 'If:' section to generated documentation Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 42/54] qapi2texi: add 'If:' condition to enum values Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 43/54] qapi2texi: add 'If:' condition to struct members Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 44/54] qapi2texi: add condition to variants Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 45/54] qapi: add conditions to VNC type/commands/events on the schema Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 46/54] qapi: add conditions to SPICE " Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 47/54] qapi: add conditions to REPLICATION type/commands " Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 48/54] tests/qmp-test: add query-qmp-schema test Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 49/54] build-sys: make qemu qapi objects per-target Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 50/54] qapi: make rtc-reset-reinjection depend on TARGET_I386 Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 51/54] qapi: make s390 commands depend on TARGET_S390X Marc-André Lureau
2017-08-22 14:24   ` Cornelia Huck
2017-08-22 14:25     ` David Hildenbrand
2017-08-22 14:41       ` Marc-André Lureau
2017-08-22 15:14         ` Cornelia Huck
2017-08-22 15:46           ` Marc-André Lureau
2017-08-22 15:58       ` Markus Armbruster
2017-08-22 16:01         ` David Hildenbrand
2017-08-22 16:25           ` Markus Armbruster
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 52/54] qapi: make query-gic-capabilities depend on TARGET_ARM Marc-André Lureau
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 53/54] qapi: make query-cpu-model-expansion depend on s390 or x86 Marc-André Lureau
2017-08-22 18:42   ` Eduardo Habkost
2017-08-23 10:21     ` Marc-André Lureau
2017-08-23 12:57       ` Eduardo Habkost
2017-08-23 13:58         ` Marc-André Lureau
2017-08-23 14:13           ` Eduardo Habkost
2017-08-22 13:22 ` [Qemu-devel] [PATCH v2 54/54] qapi: make query-cpu-definitions depend on specific targets Marc-André Lureau
2017-08-22 13:22   ` Marc-André Lureau
2017-08-22 14:47 ` [Qemu-devel] [PATCH v2 00/54] qapi: add #if pre-processor conditions to generated code no-reply
2017-08-23 12:46 ` 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=8737807zgu.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=marcandre.lureau@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.