qemu-commits
[Top][All Lists]
Advanced

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

[Qemu-commits] [qemu/qemu] da34a9: qapi: Track simple union tag in objec


From: GitHub
Subject: [Qemu-commits] [qemu/qemu] da34a9: qapi: Track simple union tag in object.local_membe...
Date: Thu, 17 Dec 2015 05:00:05 -0800

  Branch: refs/heads/master
  Home:   https://github.com/qemu/qemu
  Commit: da34a9bd999d1be13954c699bbae0295cdaa3200
      
https://github.com/qemu/qemu/commit/da34a9bd999d1be13954c699bbae0295cdaa3200
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi-types.py
    M scripts/qapi-visit.py
    M scripts/qapi.py
    M tests/qapi-schema/qapi-schema-test.out
    M tests/qapi-schema/union-clash-data.out
    M tests/qapi-schema/union-empty.out

  Log Message:
  -----------
  qapi: Track simple union tag in object.local_members

We were previously creating all unions with an empty list for
local_members.  However, it will make it easier to unify struct
and union generation if we include the generated tag member in
local_members.  That way, we can have a common code pattern:
visit the base (if any), visit the local members (if any), visit
the variants (if any).  The local_members of a flat union
remains empty (because the discriminator is already visited as
part of the base).  Then, by visiting tag_member.check() during
AlternateType.check(), we no longer need to call it during
Variants.check().

The various front end entities now exist as follows:
struct: optional base, optional local_members, no variants
simple union: no base, one-element local_members, variants with tag_member
  from local_members
flat union: base, no local_members, variants with tag_member from base
alternate: no base, no local_members, variants

With the new local members, we require a bit of finesse to
avoid assertions in the clients.

No change to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 570cd8d1194cf68f7c9948971e52e47f20855a77
      
https://github.com/qemu/qemu/commit/570cd8d1194cf68f7c9948971e52e47f20855a77
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi-types.py

  Log Message:
  -----------
  qapi-types: Consolidate gen_struct() and gen_union()

These two methods are now close enough that we can finally merge
them, relying on the fact that simple unions now provide a
reasonable local_members.  Change gen_struct() to gen_object()
that handles all forms of QAPISchemaObjectType, and rename and
shrink gen_union() to gen_variants() to handle the portion of
gen_object() needed when variants are present.

gen_struct_fields() now has a single caller, so it no longer
needs an optional parameter; however, I did not choose to inline
it into the caller.

No difference to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 7d9586f900a9043025866f84c096b1842b0bbbf6
      
https://github.com/qemu/qemu/commit/7d9586f900a9043025866f84c096b1842b0bbbf6
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi-types.py

  Log Message:
  -----------
  qapi-types: Simplify gen_struct_field[s]

Simplify gen_struct_fields() back to a single iteration over a
list of fields (like it was prior to commit f87ab7f9), by moving
the generated comments to gen_object().  Then, inline
gen_struct_field() into its only caller.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: fff5f231d5f96e8521761efcd35a12479594059a
      
https://github.com/qemu/qemu/commit/fff5f231d5f96e8521761efcd35a12479594059a
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Drop obsolete tag value collision assertions

Union tag values can't clash with member names in generated C anymore
since commit e4ba22b, but QAPISchemaObjectTypeVariants.check() still
asserts they don't.  Drop it.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: e564e2dd5963a75f32bbb90ac8181ba9dca2f1aa
      
https://github.com/qemu/qemu/commit/e564e2dd5963a75f32bbb90ac8181ba9dca2f1aa
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Simplify QAPISchemaObjectTypeMember.check()

QAPISchemaObjectTypeMember.check() currently does four things:

1. Compute self.type

2. Accumulate members in all_members

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   compute self.members.  The other callers pass a throw-away
   accumulator.

3. Accumulate a map from names to members in seen

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   compute its local variable seen, for self.variants.check(), which
   uses it to compute self.variants.tag_member from
   self.variants.tag_name.  The other callers pass a throw-away
   accumulator.

4. Check for collisions

   This piggybacks on 3: before adding a new entry, we assert it's new.

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   assert non-variant members don't clash.

Simplify QAPISchemaObjectType.check(): move 2.-4. to
QAPISchemaObjectType.check(), and drop parameters all_members and
seen.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
[rebase to earlier changes that moved tag_member.check() of
alternate types, commit message typo fix]
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: cdc5fa37eda2896d2b08f9215c963256eb859d3b
      
https://github.com/qemu/qemu/commit/cdc5fa37eda2896d2b08f9215c963256eb859d3b
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Clean up after previous commit

QAPISchemaObjectTypeVariants.check() parameter members and
QAPISchemaObjectTypeVariant.check() parameter seen are no longer used,
drop them.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
[rebase to earlier changes that moved tag_member.check() of
alternate types]
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: 08683353fc46b5d462199c9e8cff6f6c67f20f65
      
https://github.com/qemu/qemu/commit/08683353fc46b5d462199c9e8cff6f6c67f20f65
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Fix up commit 7618b91's clash sanity checking change

This hunk

    @@ -964,6 +965,7 @@ class QAPISchemaObjectType(QAPISchemaType):
           members = []
       seen = {}
       for m in members:
    +            assert c_name(m.name) not in seen
           seen[m.name] = m
       for m in self.local_members:
           m.check(schema, members, seen)

is plainly broken.

Asserting the members inherited from base don't clash is somewhat
redundant, because self.base.check() just checked that.  But it
doesn't hurt.

The idea to use c_name(m.name) instead of m.name for collision
checking is sound, because we need to catch clashes between the m.name
and between the c_name(m.name), and when two m.name clash, then their
c_name() also clash.

However, using c_name(m.name) instead of m.name in one of several
places doesn't work.  See the very next line.

Keep the assertion, but drop the c_name() for now.  A future commit
will bring it back.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
[change TABs in commit message to space]
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: 23a4b2c6f19297cd067455c852b4874879594c13
      
https://github.com/qemu/qemu/commit/23a4b2c6f19297cd067455c852b4874879594c13
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Eliminate QAPISchemaObjectType.check() variable members

We can use seen.values() instead if we make it an OrderedDict.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: 577de12d22aba55f31fd68c5724411eb8592a4ca
      
https://github.com/qemu/qemu/commit/577de12d22aba55f31fd68c5724411eb8592a4ca
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Factor out QAPISchemaObjectTypeMember.check_clash()

While there, stick in a TODO change key of seen from QAPI name to C
name.  Can't do it right away, because it would fail the assertion for
tests/qapi-schema/args-has-clash.json.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: 14ff84619c6bb9b729dbf8b127c1e4c56ed8c500
      
https://github.com/qemu/qemu/commit/14ff84619c6bb9b729dbf8b127c1e4c56ed8c500
  Author: Markus Armbruster <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Simplify QAPISchemaObjectTypeVariants.check()

Reduce the ugly flat union / simple union conditional by doing just
the essential work here, namely setting self.tag_member.
Move the rest to callers.

Signed-off-by: Markus Armbruster <address@hidden>
Message-Id: <address@hidden>
[rebase to earlier changes that moved tag_member.check() of
alternate types, and tweak commit title and wording]
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>


  Commit: b807a1e1e3796adaf3ece2f7b69ea5ee28468ff4
      
https://github.com/qemu/qemu/commit/b807a1e1e3796adaf3ece2f7b69ea5ee28468ff4
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Check for QAPI collisions involving variant members

Right now, our ad hoc parser ensures that we cannot have a
flat union that introduces any members that would clash with
non-variant members inherited from the union's base type (see
flat-union-clash-member.json).  We want QAPISchemaObjectType.check()
to make the same check, so we can later reduce some of the ad
hoc checks.

We already have a map 'seen' of all non-variant members. We
still need to check for collisions between each variant type's
members and the non-variant ones.

To know the variant type's members, we need to call
variant.type.check().  This also detects when a type contains
itself in a variant, exactly like the existing base.check()
detects when a type contains itself as a base.  (Except that
we currently forbid anything but a struct as the type of a
variant, so we can't actually trigger this type of loop yet.)

Slight complication: an alternate's variant can have arbitrary
type, but only an object type's check() may be called outside
QAPISchema.check(). We could either skip the call for variants
of alternates, or skip it for non-object types.  For now, do
the latter, because it's easier.

Then we call each variant member's check_clash() with the
appropriate 'seen' map.  Since members of different variants
can't clash, we have to clone a fresh seen for each variant.
Wrap this in a new helper method
QAPISchemaObjectTypeVariants.check_clash().

Note that cloning 'seen' inside .check_clash() resembles
the one we just removed from .check() in 'qapi: Drop
obsolete tag value collision assertions'; the difference here is
that we are now checking for clashes among the qapi members of
the variant type, rather than for a single clash with the variant
tag name itself.

Note that, by construction, collisions can't actually happen for
simple unions: each variant's type is a wrapper with a single
member 'data', which will never collide with the only non-variant
member 'type'.

For alternates, there's nothing for a variant object type's
members to clash with, and therefore no need to call the new
variants.check_clash().

No change to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: c2183d2e62b6d9d66f80bc0bcf4fc7ec3c5d76d4
      
https://github.com/qemu/qemu/commit/c2183d2e62b6d9d66f80bc0bcf4fc7ec3c5d76d4
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Factor out QAPISchemaObjectType.check_clash()

Consolidate two common sequences of clash detection into a
new QAPISchemaObjectType.check_clash() helper method.

No change to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 10565ca92a8d3f8a34559329acfbdb25a791b594
      
https://github.com/qemu/qemu/commit/10565ca92a8d3f8a34559329acfbdb25a791b594
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Hoist tag collision check to Variants.check()

Checking that a given QAPISchemaObjectTypeVariant.name is a
member of the corresponding QAPISchemaEnumType of the owning
QAPISchemaObjectTypeVariants.tag_member ensures that there are
no collisions in the generated C union for those tag values
(since the enum itself should have no collisions).

However, ever since its introduction in f51d8c3d, this was the
only additional action of of Variant.check(), beyond calling
the superclass Member.check().  This forces a difference in
.check() signatures, just to pass the enum type down.

Simplify things by instead doing the tag name check as part of
Variants.check(), at which point we can rely on inheritance
instead of overriding Variant.check().

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 61a946611b77b05936c60775eaaef87b65ec9f09
      
https://github.com/qemu/qemu/commit/61a946611b77b05936c60775eaaef87b65ec9f09
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/Makefile
    R tests/qapi-schema/flat-union-clash-branch.err
    R tests/qapi-schema/flat-union-clash-branch.exit
    R tests/qapi-schema/flat-union-clash-branch.json
    R tests/qapi-schema/flat-union-clash-branch.out
    R tests/qapi-schema/flat-union-clash-type.err
    R tests/qapi-schema/flat-union-clash-type.exit
    R tests/qapi-schema/flat-union-clash-type.json
    R tests/qapi-schema/flat-union-clash-type.out
    R tests/qapi-schema/union-clash-type.err
    R tests/qapi-schema/union-clash-type.exit
    R tests/qapi-schema/union-clash-type.json
    R tests/qapi-schema/union-clash-type.out

  Log Message:
  -----------
  qapi: Remove outdated tests related to QMP/branch collisions

Now that branches are in a separate C namespace, we can remove
the restrictions in the parser that claim a branch name would
collide with QMP, and delete the negative tests that are no
longer problematic.  A separate patch can then add positive
tests to qapi-schema-test to test that any corner cases will
compile correctly.

This reverts the scripts/qapi.py portion of commit 7b2a5c2,
now that the assertions that it plugged are no longer possible.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 88d4ef8b5cbf9d3336564b1d3ac7a91cbe4aee0e
      
https://github.com/qemu/qemu/commit/88d4ef8b5cbf9d3336564b1d3ac7a91cbe4aee0e
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Track owner of each object member

Future commits will migrate semantic checking away from parsing
and over to the various QAPISchema*.check() methods.  But to
report an error message about an incorrect semantic use of a
member of an object type, it helps to know which type, command,
or event owns the member.  In particular, when a member is
inherited from a base type, it is desirable to associate the
member name with the base type (and not the type calling
member.check()).

Rather than packing additional information into the seen array
passed to each member.check() (as in seen[m.name] = {'member':m,
'owner':type}), it is easier to have each member track the name
of the owner type in the first place (keeping things simpler
with the existing seen[m.name] = m).  The new member.owner field
is set via a new set_owner() method, called when registering
the members and variants arrays with an object or variant type.
Track only a name, and not the actual type object, to avoid
creating a circular python reference chain.

Note that Variants.set_owner() method does not set the owner
for the tag_member field; this field is set earlier either as
part of an object's non-variant members, or explicitly by
alternates.

The source information is intended for human consumption in
error messages, and a new describe() method is added to access
the resulting information.  For example, given the qapi:
  { 'command': 'foo', 'data': { 'string': 'str' } }
an implementation of visit_command() that calls
  arg_type.members[0].describe()
will see "'string' (parameter of foo)".

To make the human-readable name of implicit types work without
duplicating efforts, the describe() method has to reverse the
name of implicit types, via the helper _pretty_owner().

No change to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Incorrect & unused -wrapper case in _pretty_owner() dropped]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 27b60ab93bd1d5d8c85f009aac7a97ffd2c53c86
      
https://github.com/qemu/qemu/commit/27b60ab93bd1d5d8c85f009aac7a97ffd2c53c86
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/qapi-schema/args-name-clash.err
    M tests/qapi-schema/args-name-clash.exit
    M tests/qapi-schema/args-name-clash.json
    M tests/qapi-schema/args-name-clash.out

  Log Message:
  -----------
  qapi: Detect collisions in C member names

Detect attempts to declare two object members that would result
in the same C member name, by keying the 'seen' dictionary off
of the C name rather than the qapi name.  It also requires passing
info through the check_clash() methods.

This addresses a TODO and fixes the previously-broken
args-name-clash test.  The resulting error message demonstrates
the utility of the .describe() method added previously.  No change
to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: c43567c12042cf401b039bfc94a5f85e1cc1e796
      
https://github.com/qemu/qemu/commit/c43567c12042cf401b039bfc94a5f85e1cc1e796
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/qapi-schema/qapi-schema-test.json
    M tests/qapi-schema/qapi-schema-test.out
    M tests/test-qmp-commands.c

  Log Message:
  -----------
  qapi: Fix c_name() munging

The method c_name() is supposed to do two different actions: munge
'-' into '_', and add a 'q_' prefix to ticklish names.  But it did
these steps out of order, making it possible to submit input that
is not ticklish until after munging, where the output then lacked
the desired prefix.

The failure is exposed easily if you have a compiler that recognizes
C11 keywords, and try to name a member '_Thread-local', as it would
result in trying to compile the declaration 'uint64_t _Thread_local;'
which is not valid.  However, this name violates our conventions
(ultimately, want to enforce that no qapi names start with single
underscore), so the test is slightly weaker by instead testing
'wchar-t'; the declaration 'uint64_t wchar_t;' is valid in C (where
wchar_t is only a typedef) but would fail with a C++ compiler (where
it is a keyword).

Fix things by reversing the order of actions within c_name().

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 7549457200ec3871ee827765f4d3bbc8d903b2ec
      
https://github.com/qemu/qemu/commit/7549457200ec3871ee827765f4d3bbc8d903b2ec
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/visitor.h

  Log Message:
  -----------
  qapi: Remove dead visitor code

Commit cbc95538 removed unused start_handle() and end_handle(),
but forgot to remove their declarations.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: a31939e6c854e26e391efaec49c9d7f796369bbb
      
https://github.com/qemu/qemu/commit/a31939e6c854e26e391efaec49c9d7f796369bbb
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M block.c
    M block/blkdebug.c
    M docs/blkdebug.txt
    M include/block/block.h
    M include/block/block_int.h
    M qapi/block-core.json

  Log Message:
  -----------
  blkdebug: Merge hand-rolled and qapi BlkdebugEvent enum

No need to keep two separate enums, where editing one is likely
to forget the other.  Now that we can specify a qapi enum prefix,
we don't even have to change the bulk of the uses.

get_event_by_name() could perhaps be replaced by qapi_enum_parse(),
but I left that for another day.

CC: Kevin Wolf <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 5be5b7764f83cf9a535a22ecbd33710daf1fe210
      
https://github.com/qemu/qemu/commit/5be5b7764f83cf9a535a22ecbd33710daf1fe210
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M qapi/block-core.json
    M tests/qemu-iotests/026
    M tests/qemu-iotests/026.out
    M tests/qemu-iotests/026.out.nocache
    M tests/qemu-iotests/077

  Log Message:
  -----------
  blkdebug: Avoid '.' in enum values

Our qapi conventions document that '.' should only be used in
the prefix of downstream names.  BlkdebugEvent was a lone
exception to this.  Changing this is not backwards compatible
to the 'blockdev-add' QMP command; however, that command is
not yet fully stable.  It can also be argued that the testsuite
is the biggest user of blkdebug, and that any other user can
be taught to deal with the change by paying attention to
introspection results.

Done with:

$ for str in \
     l1_grow.{alloc,write,activate}_table \
     l2_alloc.{cow_read,write} \
     refblock_alloc.{hookup,write,write_blocks,write_table,switch_table} \
     pwritev_rmw.{head,after_head,tail,after_tail}; do
   str1=$(echo "$str" | sed 's/\./\\./')
   str2=$(echo "$str" | sed 's/\./_/')
   git grep -l "$str1" | xargs -r sed -i "s/$str1/$str2/g"
 done

followed by a manual touchup to test 77 to keep the test working.

Reported-by: Markus Armbruster <address@hidden>
CC: Kevin Wolf <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 59a92feedc6927e0e1ff87fdaccfb4dd42ad4c84
      
https://github.com/qemu/qemu/commit/59a92feedc6927e0e1ff87fdaccfb4dd42ad4c84
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M docs/qapi-code-gen.txt
    M scripts/qapi.py
    M tests/Makefile
    A tests/qapi-schema/reserved-enum-q.err
    A tests/qapi-schema/reserved-enum-q.exit
    A tests/qapi-schema/reserved-enum-q.json
    A tests/qapi-schema/reserved-enum-q.out
    A tests/qapi-schema/reserved-member-underscore.err
    A tests/qapi-schema/reserved-member-underscore.exit
    A tests/qapi-schema/reserved-member-underscore.json
    A tests/qapi-schema/reserved-member-underscore.out

  Log Message:
  -----------
  qapi: Tighten the regex on valid names

We already documented that qapi names should match specific
patterns (such as starting with a letter unless it was an enum
value or a downstream extension).  Tighten that from a suggestion
into a hard requirement, which frees up names beginning with a
single underscore for qapi internal usage.

The tighter regex doesn't forbid everything insane that a user
could provide (for example, a user could name a type 'Foo-lookup'
to collide with the generated 'Foo_lookup[]' for an enum 'Foo'),
but does a good job at protecting the most obvious uses, and
also happens to reserve single leading underscore for later use.

The handling of enum values starting with a digit is tricky:
commit 9fb081e introduced a subtle bug by using c_name() on
a munged value, which would allow an enum to include the
member 'q-int' in spite of our reservation.  Furthermore,
munging with a leading '_' would fail our tighter regex.  So
fix it by only munging for leading digits (which are never
ticklish in c_name()) and by using a different prefix (I
picked 'D', although any letter should do).

Add new tests, reserved-member-underscore and reserved-enum-q,
to demonstrate the tighter checking.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Message-Id: <address@hidden>
[Eric's fixup squashed in]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 7fb1cf1606c78c9d5b538f29176fd5a101726a9d
      
https://github.com/qemu/qemu/commit/7fb1cf1606c78c9d5b538f29176fd5a101726a9d
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M block/blkdebug.c
    M block/parallels.c
    M block/qcow2.c
    M block/quorum.c
    M block/raw-posix.c
    M blockdev.c
    M docs/qapi-code-gen.txt
    M hmp.c
    M hw/char/escc.c
    M hw/i386/pc_piix.c
    M hw/i386/pc_q35.c
    M hw/input/hid.c
    M hw/input/ps2.c
    M hw/input/virtio-input-hid.c
    M include/migration/migration.h
    M migration/migration.c
    M monitor.c
    M net/net.c
    M qemu-nbd.c
    M replay/replay-input.c
    M scripts/qapi.py
    M tests/test-qmp-output-visitor.c
    M tests/test-string-output-visitor.c
    M tpm.c
    M ui/cocoa.m
    M ui/console.c
    M ui/input-keymap.c
    M ui/input-legacy.c
    M ui/input.c
    M ui/sdl.c
    M ui/sdl2.c
    M ui/spice-input.c
    M ui/vnc.c
    M vl.c

  Log Message:
  -----------
  qapi: Don't let implicit enum MAX member collide

Now that we guarantee the user doesn't have any enum values
beginning with a single underscore, we can use that for our
own purposes.  Renaming ENUM_MAX to ENUM__MAX makes it obvious
that the sentinel is generated.

This patch was mostly generated by applying a temporary patch:

|diff --git a/scripts/qapi.py b/scripts/qapi.py
|index e6d014b..b862ec9 100644
|--- a/scripts/qapi.py
|+++ b/scripts/qapi.py
|@@ -1570,6 +1570,7 @@ const char *const %(c_name)s_lookup[] = {
|     max_index = c_enum_const(name, 'MAX', prefix)
|     ret += mcgen('''
|     [%(max_index)s] = NULL,
|+// %(max_index)s
| };
| ''',
|                max_index=max_index)

then running:

$ cat qapi-{types,event}.c tests/test-qapi-types.c |
    sed -n 's,^// \(.*\)MAX,s|\1MAX|\1_MAX|g,p' > list
$ git grep -l _MAX | xargs sed -i -f list

The only things not generated are the changes in scripts/qapi.py.

Rejecting enum members named 'MAX' is now useless, and will be dropped
in the next patch.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
[Rebased to current master, commit message tweaked]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 04e0639d4e77b6d55491d396c8aa13929ee8ed9a
      
https://github.com/qemu/qemu/commit/04e0639d4e77b6d55491d396c8aa13929ee8ed9a
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/Makefile
    R tests/qapi-schema/enum-max-member.err
    R tests/qapi-schema/enum-max-member.exit
    R tests/qapi-schema/enum-max-member.json
    R tests/qapi-schema/enum-max-member.out
    R tests/qapi-schema/event-max.err
    R tests/qapi-schema/event-max.exit
    R tests/qapi-schema/event-max.json
    R tests/qapi-schema/event-max.out
    R tests/qapi-schema/union-max.err
    R tests/qapi-schema/union-max.exit
    R tests/qapi-schema/union-max.json
    R tests/qapi-schema/union-max.out

  Log Message:
  -----------
  qapi: Remove obsolete tests for MAX collision

Now that we no longer collide with an implicit _MAX enum member,
we no longer need to reject it in the ad hoc parser, and can
remove several tests that are no longer needed.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 86f4b6871c598e86f0542ed50d2ee5280fc66590
      
https://github.com/qemu/qemu/commit/86f4b6871c598e86f0542ed50d2ee5280fc66590
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M cpus.c
    M hmp.c
    M qapi-schema.json
    M qmp-commands.hx

  Log Message:
  -----------
  cpu: Convert CpuInfo into flat union

The CpuInfo struct is used only by the 'query-cpus' output
command, so we are free to modify it by adding fields (clients
are already supposed to ignore unknown output fields), or by
changing optional members to mandatory, while still keeping
QMP wire compatibility with older versions of qemu.

When qapi type CpuInfo was originally created for 0.14, we had
no notion of a flat union, and instead just listed a bunch of
optional fields with documentation about the mutually-exclusive
choice of which instruction pointer field(s) would be provided
for a given architecture.  But now that we have flat unions and
introspection, it is better to segregate off which fields will
be provided according to the actual architecture.  With this in
place, we no longer need the fields to be optional, because the
choice of the new 'arch' discriminator serves that role.

This has an additional benefit: the old all-in-one struct was
the only place in the code base that had a case-sensitive
naming of members 'pc' vs. 'PC'.  Separating these spellings
into different branches of the flat union will allow us to add
restrictions against future case-insensitive collisions, since
that is generally a poor interface practice.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Spelling of CPUInfo{SPARC,PPC,MIPS} fixed]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: f22a28b898322c01b0463a8b7ec551d72bc61a5b
      
https://github.com/qemu/qemu/commit/f22a28b898322c01b0463a8b7ec551d72bc61a5b
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/error.h
    M monitor.c
    M qapi/common.json
    M qapi/qmp-dispatch.c

  Log Message:
  -----------
  qapi: Add alias for ErrorClass

The qapi enum ErrorClass is unusual that it uses 'CamelCase' names,
contrary to our documented convention of preferring 'lower-case'.
However, this enum is entrenched in the API; we cannot change
what strings QMP outputs.  Meanwhile, we want to simplify how
c_enum_const() is used to generate enum constants, by moving away
from the heuristics of camel_to_upper() to a more straightforward
c_name(N).upper() - but doing so will rename all of the ErrorClass
constants and cause churn to all client files, where the new names
are aesthetically less pleasing (ERROR_CLASS_DEVICENOTFOUND looks
like we can't make up our minds on whether to break between words).

So as always in computer science, solve the problem by some more
indirection: rename the qapi type to QapiErrorClass, and add a
new enum ErrorClass in error.h whose members are aliases of the
qapi type, but with the spelling expected elsewhere in the tree.
Then, when c_enum_const() changes the munging, we only have to
adjust the one alias spot.

Suggested by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: d20a580bc0eac9d489884f6d2ed28105880532b6
      
https://github.com/qemu/qemu/commit/d20a580bc0eac9d489884f6d2ed28105880532b6
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M hw/input/hid.c
    M hw/input/ps2.c
    M hw/input/virtio-input-hid.c
    M include/qapi/error.h
    M monitor.c
    M scripts/qapi.py
    M ui/cocoa.m
    M ui/gtk.c
    M ui/input-legacy.c
    M ui/sdl.c
    M ui/sdl2.c
    M ui/spice-input.c
    M ui/vnc.c

  Log Message:
  -----------
  qapi: Change munging of CamelCase enum values

When munging enum values, the fact that we were passing the entire
prefix + value through camel_to_upper() meant that enum values
spelled with CamelCase could be turned into CAMEL_CASE.  However,
this provides a potential collision (both OneTwo and One-Two would
munge into ONE_TWO) for enum types, when the same two names are
valid side-by-side as QAPI member names.  By changing the generation
of enum constants to always be prefix + '_' + c_name(value,
False).upper(), and ensuring that there are no case collisions (in
the next patches), we no longer have to worry about names that
would be distinct as QAPI members but collide as variant tag names,
without having to think about what munging the heuristics in
camel_to_upper() will actually perform on an enum value.

Making the change will affect enums that did not follow coding
conventions, using 'CamelCase' rather than desired 'lower-case'.

Thankfully, there are only two culprits: InputButton and ErrorClass.
We already tweaked ErrorClass to make it an alias of QapiErrorClass,
where only the alias needs changing rather than the whole tree.  So
the bulk of this change is modifying INPUT_BUTTON_WHEEL_UP to the
new INPUT_BUTTON_WHEELUP (and likewise for WHEELDOWN).  That part
of this commit may later need reverting if we rename the enum
constants from 'WheelUp' to 'wheel-up' as part of moving
x-input-send-event to a stable interface; but at least we have
documentation bread crumbs in place to remind us (commit 513e7cd),
and it matches the fact that SDL constants are also spelled
SDL_BUTTON_WHEELUP.

Suggested by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 55e1819c509b3d9c10a54678b9c585bbda13889e
      
https://github.com/qemu/qemu/commit/55e1819c509b3d9c10a54678b9c585bbda13889e
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/qmp/qbool.h
    M include/qapi/qmp/qdict.h
    M include/qapi/qmp/qfloat.h
    M include/qapi/qmp/qint.h
    M include/qapi/qmp/qlist.h
    M include/qapi/qmp/qobject.h
    M include/qapi/qmp/qstring.h
    M qobject/Makefile.objs
    M qobject/qbool.c
    M qobject/qdict.c
    M qobject/qfloat.c
    M qobject/qint.c
    M qobject/qlist.c
    M qobject/qnull.c
    A qobject/qobject.c
    M qobject/qstring.c

  Log Message:
  -----------
  qobject: Simplify QObject

The QObject hierarchy is small enough, and unlikely to grow further
(since we only use it to map to JSON and already cover all JSON
types), that we can simplify things by not tracking a separate
vtable, but just inline the code element of the vtable QType
directly into QObject (renamed to type), and track a separate array
of destroy functions.  We can drop qnull_destroy_obj() in the
process.

The remaining QObject subclasses must export their destructor.

This also has the nice benefit of moving the typename 'QType'
out of the way, so that the next patch can repurpose it for a
nicer name for 'qtype_code'.

The various objects are still the same size (so no change in cache
line pressure), but now have less indirection (although I didn't
bother benchmarking to see if there is a noticeable speedup, as
we don't have hard evidence that this was in a performance hotspot
in the first place).

A future patch could drop the refcnt size to 32 bits for a smaller
struct on 64-bit architectures, if desired (we have limits on the
largest JSON that we are willing to parse, and will probably never
need to take full advantage of a 64-bit refcnt).

Suggested-by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 1310a3d3bd9301ff5a825287638cfab24c2c6689
      
https://github.com/qemu/qemu/commit/1310a3d3bd9301ff5a825287638cfab24c2c6689
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M block/qapi.c
    M include/hw/qdev-core.h
    M include/qapi/qmp/qobject.h
    M qobject/qdict.c
    M scripts/qapi.py

  Log Message:
  -----------
  qobject: Rename qtype_code to QType

The name QType matches our CODING_STYLE conventions for type names
in CamelCase.  It also matches the fact that we are already naming
all the enum members with a prefix of QTYPE, not QTYPE_CODE.  And
doing the rename will also make it easier for the next patch to use
QAPI for providing the enum, which also wants CamelCase type names.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 7264f5c50cc1be0f1406e3ebb45aedcca02f603a
      
https://github.com/qemu/qemu/commit/7264f5c50cc1be0f1406e3ebb45aedcca02f603a
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M docs/qapi-code-gen.txt
    M include/qapi/qmp/qobject.h
    M include/qemu/typedefs.h
    M qobject/qobject.c
    M scripts/qapi-types.py
    M scripts/qapi-visit.py
    M scripts/qapi.py
    M tests/qapi-schema/alternate-empty.out
    M tests/qapi-schema/comments.out
    M tests/qapi-schema/empty.out
    M tests/qapi-schema/event-case.out
    M tests/qapi-schema/flat-union-empty.out
    M tests/qapi-schema/ident-with-escape.out
    M tests/qapi-schema/include-relpath.out
    M tests/qapi-schema/include-repetition.out
    M tests/qapi-schema/include-simple.out
    M tests/qapi-schema/indented-expr.out
    M tests/qapi-schema/qapi-schema-test.out
    M tests/qapi-schema/union-clash-data.out
    M tests/qapi-schema/union-empty.out

  Log Message:
  -----------
  qapi: Convert QType into QAPI built-in enum type

What's more meta than using qapi to define qapi? :)

Convert QType into a full-fledged[*] builtin qapi enum type, so
that a subsequent patch can then use it as the discriminator
type of qapi alternate types.  Fortunately, the judicious use of
'prefix' in the qapi definition avoids churn to the spelling of
the enum constants.

To avoid circular definitions, we have to flip the order of
inclusion between "qobject.h" vs. "qapi-types.h".  Back in commit
28770e0, we had the latter include the former, so that we could
use 'QObject *' for our implementation of 'any'.  But that usage
also works with only a forward declaration, whereas the
definition of QObject requires QType to be a complete type.

[*] The type has to be builtin, rather than declared in
qapi/common.json, because we want to use it for alternates even
when common.json is not included. But since it is the first
builtin enum type, we have to add special cases to qapi-types
and qapi-visit to only emit definitions once, even when two
qapi files are being compiled into the same binary (the way we
already handled builtin list types like 'intList').  We may
need to revisit how multiple qapi files share common types,
but that's a project for another day.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 0426d53c6530606bf7641b83f2b755fe61c280ee
      
https://github.com/qemu/qemu/commit/0426d53c6530606bf7641b83f2b755fe61c280ee
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M docs/qapi-code-gen.txt
    M include/qapi/visitor-impl.h
    M include/qapi/visitor.h
    M qapi/qapi-visit-core.c
    M qapi/qmp-input-visitor.c
    M scripts/qapi-types.py
    M scripts/qapi-visit.py
    M scripts/qapi.py
    M tests/qapi-schema/alternate-empty.out
    M tests/qapi-schema/qapi-schema-test.out
    M tests/test-qmp-input-visitor.c
    M tests/test-qmp-output-visitor.c

  Log Message:
  -----------
  qapi: Simplify visiting of alternate types

Previously, working with alternates required two lookup arrays
and some indirection: for type Foo, we created Foo_qtypes[]
which maps each qtype to a value of the generated FooKind enum,
then look up that value in FooKind_lookup[] like we do for other
union types.

This has a couple of subtle bugs.  First, the generator was
creating a call with a parameter '(int *) &(*obj)->type' where
type is an enum type; this is unsafe if the compiler chooses
to store the enum type in a different size than int, where
assigning through the wrong size pointer can corrupt data or
cause a SIGBUS.

Related bug, not not fixed in this patch: qapi-visit.py's
gen_visit_enum() generates a cast of its enum * argument to
int *. Marked FIXME.

Second, since the values of the FooKind enum start at zero, all
entries of the Foo_qtypes[] array that were not explicitly
initialized will map to the same branch of the union as the
first member of the alternate, rather than triggering a desired
failure in visit_get_next_type().  Fortunately, the bug seldom
bites; the very next thing the input visitor does is try to
parse the incoming JSON with the wrong parser, which normally
fails; the output visitor is not used with a C struct in that
state, and the dealloc visitor has nothing to clean up (so
there is no leak).

However, the second bug IS observable in one case: parsing an
integer causes unusual behavior in an alternate that contains
at least a 'number' member but no 'int' member, because the
'number' parser accepts QTYPE_QINT in addition to the expected
QTYPE_QFLOAT (that is, since 'int' is not a member, the type
QTYPE_QINT accidentally maps to FooKind 0; if this enum value
is the 'number' branch the integer parses successfully, but if
the 'number' branch is not first, some other branch tries to
parse the integer and rejects it).  A later patch will worry
about fixing alternates to always parse all inputs that a
non-alternate 'number' would accept, for now this is still
marked FIXME in the updated test-qmp-input-visitor.c, to
merely point out that new undesired behavior of 'ans' matches
the existing undesired behavior of 'asn'.

This patch fixes the default-initialization bug by deleting the
indirection, and modifying get_next_type() to directly assign a
QTypeCode parameter.  This in turn fixes the type-casting bug,
as we are no longer casting a pointer to enum to a questionable
size. There is no longer a need to generate an implicit FooKind
enum associated with the alternate type (since the QMP wire
format never uses the stringized counterparts of the C union
member names).  Since the updated visit_get_next_type() does not
know which qtypes are expected, the generated visitor is
modified to generate an error statement if an unexpected type is
encountered.

Callers now have to know the QTYPE_* mapping when looking at the
discriminator; but so far, only the testsuite was even using the
C struct of an alternate types.  I considered the possibility of
keeping the internal enum FooKind, but initialized differently
than most generated arrays, as in:
  typedef enum FooKind {
      FOO_KIND_A = QTYPE_QDICT,
      FOO_KIND_B = QTYPE_QINT,
  } FooKind;
to create nicer aliases for knowing when to use foo->a or foo->b
when inspecting foo->type; but it turned out to add too much
complexity, especially without a client.

There is a user-visible side effect to this change, but I
consider it to be an improvement. Previously,
the invalid QMP command:
  {"execute":"blockdev-add", "arguments":{"options":
    {"driver":"raw", "id":"a", "file":true}}}
failed with:
  {"error": {"class": "GenericError",
    "desc": "Invalid parameter type for 'file', expected: QDict"}}
(visit_get_next_type() succeeded, and the error comes from the
visit_type_BlockdevOptions() expecting {}; there is no mention of
the fact that a string would also work).  Now it fails with:
  {"error": {"class": "GenericError",
    "desc": "Invalid parameter type for 'file', expected: BlockdevRef"}}
(the error when the next type doesn't match any expected types for
the overall alternate).

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 0b2e84ba774651656771ed697dee8825759dffa9
      
https://github.com/qemu/qemu/commit/0b2e84ba774651656771ed697dee8825759dffa9
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi-types.py

  Log Message:
  -----------
  qapi-types: Drop unnedeed ._fwdefn

Previously, the generated code in qapi-types.c initialized all
enum lookup tables first, prior to any other definitions.  But
there are no topological sorting requirements that mandate this
layout, so we can drop the QAPISchemaGenTypeVisitor._fwdefn
field and just generate all definitions in visitation order.

The generated code shows some churn due to reordering, but it
is still fairly straightforward to follow (all the deletions
occur in one hunk, and all the deleted lines are re-inserted
in the same order later in the same files, just spread across
multiple insertion points).

Suggested-by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 9d3f3494c5b941774e2c3e7639332d53bbe6f8be
      
https://github.com/qemu/qemu/commit/9d3f3494c5b941774e2c3e7639332d53bbe6f8be
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Inline _make_implicit_tag()

Now that alternates no longer use an implicit tag, we can
inline _make_implicit_tag() into its one caller,
_def_union_type().

No change to generated code.

Suggested-by: Markus Armbruster <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: d00341af384665d259af475b14c96bb8414df415
      
https://github.com/qemu/qemu/commit/d00341af384665d259af475b14c96bb8414df415
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/visitor-impl.h
    M include/qapi/visitor.h
    M qapi/qapi-visit-core.c
    M qapi/qmp-input-visitor.c
    M scripts/qapi-visit.py
    M tests/test-qmp-input-visitor.c

  Log Message:
  -----------
  qapi: Fix alternates that accept 'number' but not 'int'

The QMP input visitor allows integral values to be assigned by
promotion to a QTYPE_QFLOAT.  However, when parsing an alternate,
we did not take this into account, such that an alternate that
accepts 'number' and some other type, but not 'int', would reject
integral values.

With this patch, we now have the following desirable table:

    alternate has      case selected for
    'int'  'number'    QTYPE_QINT  QTYPE_QFLOAT
      no        no     error       error
      no       yes     'number'    'number'
     yes        no     'int'       error
     yes       yes     'int'       'number'

While it is unlikely that we will ever use 'number' in an
alternate other than in the testsuite, it never hurts to be
more precise in what we allow.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 5cdc8831a795fb8452d7e34f644202fd724e122a
      
https://github.com/qemu/qemu/commit/5cdc8831a795fb8452d7e34f644202fd724e122a
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/visitor-impl.h
    M include/qapi/visitor.h
    M qapi/opts-visitor.c
    M qapi/qapi-visit-core.c
    M qapi/qmp-input-visitor.c
    M qapi/string-input-visitor.c
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Simplify visits of optional fields

None of the visitor callbacks would set an error when testing
if an optional field was present; make this part of the interface
contract by eliminating the errp argument.

The resulting generated code has a nice diff:

|-    visit_optional(v, &has_fdset_id, "fdset-id", &err);
|-    if (err) {
|-        goto out;
|-    }
|+    visit_optional(v, &has_fdset_id, "fdset-id");
|     if (has_fdset_id) {
|         visit_type_int(v, &fdset_id, "fdset-id", &err);
|         if (err) {
|             goto out;
|         }
|     }

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 29637a6ee913df8fcdf371426ee48956b945b618
      
https://github.com/qemu/qemu/commit/29637a6ee913df8fcdf371426ee48956b945b618
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M include/qapi/visitor.h
    M qapi/qapi-visit-core.c
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Shorter visits of optional fields

For less code, reflect the determined boolean value of an optional
visit back to the caller instead of making the caller read the
boolean after the fact.

The resulting generated code has the following diff:

|-    visit_optional(v, &has_fdset_id, "fdset-id");
|-    if (has_fdset_id) {
|+    if (visit_optional(v, &has_fdset_id, "fdset-id")) {
|         visit_type_int(v, &fdset_id, "fdset-id", &err);
|         if (err) {
|             goto out;
|         }
|     }

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: d44f9ac80c43e34b1522cde8829f0ab371f086ca
      
https://github.com/qemu/qemu/commit/d44f9ac80c43e34b1522cde8829f0ab371f086ca
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Prepare new QAPISchemaMember base class

We want to share some clash detection code between enum values
and object type members.  To assist with that, split off part
of QAPISchemaObjectTypeMember into a new base class
QAPISchemaMember that tracks name, owner, and common clash
detection code; while the former keeps the additional fields
for type and optional flag.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 93bda4dd461358b4fc05dfd8e2d6419cdd574789
      
https://github.com/qemu/qemu/commit/93bda4dd461358b4fc05dfd8e2d6419cdd574789
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py

  Log Message:
  -----------
  qapi: Track enum values by QAPISchemaMember, not string

Rather than using just an array of strings, make enum.values be
an array of the new QAPISchemaMember type, and add a helper
member_names() method to get back at the original list of names.
Likewise, creating an enum requires wrapping strings, via a new
QAPISchema._make_enum_members() method.  The benefit of wrapping
enum members in a QAPISchemaMember Python object is that we now
share the existing code for C name clash detection (although the
code is not yet active until a later commit removes the earlier
ad hoc parser checks).

In a related change, the QAPISchemaMember._pretty_owner() method
needs to learn about one more implicit type name: the generated
enum associated with a simple union.

In the interest of keeping the changes of this patch local to one
file, the visitor interface still passes just a list of names
rather than the full list of QAPISchemaMember instances.  We may
want to revisit this in the future, if the consistency with
visit_object_type() is worth it.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Eric's simplifying followup squashed in]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 893e1f2c5170d54316f1dcf3fefae679175622fc
      
https://github.com/qemu/qemu/commit/893e1f2c5170d54316f1dcf3fefae679175622fc
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/Makefile
    A tests/qapi-schema/args-member-case.err
    A tests/qapi-schema/args-member-case.exit
    A tests/qapi-schema/args-member-case.json
    A tests/qapi-schema/args-member-case.out
    A tests/qapi-schema/enum-member-case.err
    A tests/qapi-schema/enum-member-case.exit
    A tests/qapi-schema/enum-member-case.json
    A tests/qapi-schema/enum-member-case.out
    A tests/qapi-schema/union-branch-case.err
    A tests/qapi-schema/union-branch-case.exit
    A tests/qapi-schema/union-branch-case.json
    A tests/qapi-schema/union-branch-case.out

  Log Message:
  -----------
  qapi: Enforce (or whitelist) case conventions on qapi members

We document that members of enums and objects should be
'lower-case', although we were not enforcing it.  We have to
whitelist a few pre-existing entities that violate the norms.
Add three new tests to expose the new error message, each of
which first uses the whitelisted name 'UuidInfo' to prove the
whitelist works, then triggers the failure (this is the same
pattern used in the existing returns-whitelist.json test).

Note that by adding this check, we have effectively forbidden
an entity with a case-insensitive clash of member names, for
any entity that is not on the whitelist (although there is
still the possibility to clash via '-' vs. '_').

Not done here: a future patch should also add naming convention
support and whitelist exceptions for command, event, and type
names.

The additions to QAPISchemaMember.check_clash() check whether
info['name'] is in the whitelist (the top-most entity name at
the point 'info' tracks), rather than self.owner (the type,
possibly implicit, that directly owns the member), because it
is easier to maintain the whitelist by the names actually in
the user's .json file, rather than worrying about the names
of implicit types.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Simplified a bit as per discussion with Eric]
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: 01cfbaa4c36ecd9f1c7bcbad50c92758e1d147c4
      
https://github.com/qemu/qemu/commit/01cfbaa4c36ecd9f1c7bcbad50c92758e1d147c4
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/Makefile
    M tests/qapi-schema/alternate-clash.err
    M tests/qapi-schema/enum-clash-member.err
    M tests/qapi-schema/enum-clash-member.json
    M tests/qapi-schema/flat-union-clash-member.err
    M tests/qapi-schema/struct-base-clash-deep.err
    M tests/qapi-schema/struct-base-clash.err
    R tests/qapi-schema/union-bad-branch.err
    R tests/qapi-schema/union-bad-branch.exit
    R tests/qapi-schema/union-bad-branch.json
    R tests/qapi-schema/union-bad-branch.out
    M tests/qapi-schema/union-clash-branches.err
    M tests/qapi-schema/union-clash-branches.json

  Log Message:
  -----------
  qapi: Move duplicate collision checks to schema check()

With the recent commit 'qapi: Detect collisions in C member
names', we have two different locations for detecting clashes -
one at parse time, and another at QAPISchema*.check() time.
Remove all of the ad hoc parser checks, and delete associated
code (for example, the global check_member_clash() method is
no longer needed).

Testing this showed that the test union-bad-branch wasn't adding
much: union-clash-branches also exposes the error message when
branches collide, and we've recently fixed things to avoid an
implicit collision with max.  Likewise, the error for
enum-clash-member changes to report our new detection of
upper case in a value name, unless we modify the test to use
all lower case.

The wording of several error messages has changed, but the
change is generally an improvement rather than a regression.

No change to generated code.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: bac5429ccb4f41d421ec641b11f1852c8420fdb7
      
https://github.com/qemu/qemu/commit/bac5429ccb4f41d421ec641b11f1852c8420fdb7
  Author: Eric Blake <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M scripts/qapi.py
    M tests/Makefile
    A tests/qapi-schema/base-cycle-direct.err
    A tests/qapi-schema/base-cycle-direct.exit
    A tests/qapi-schema/base-cycle-direct.json
    A tests/qapi-schema/base-cycle-direct.out
    A tests/qapi-schema/base-cycle-indirect.err
    A tests/qapi-schema/base-cycle-indirect.exit
    A tests/qapi-schema/base-cycle-indirect.json
    A tests/qapi-schema/base-cycle-indirect.out

  Log Message:
  -----------
  qapi: Detect base class loops

It should be fairly obvious that qapi base classes need to
form an acyclic graph, since QMP cannot specify the same
key more than once, while base classes are included as flat
members alongside other members added by the child.  But the
old check_member_clash() parser function was not prepared to
check for this, and entered an infinite recursion (at least
until Python gives up, complaining about nesting too deep).

Now that check_member_clash() has been recently removed,
attempts at self-inheritance trigger an assertion failure
introduced by commit ac88219a.  The obvious fix is to turn
the assertion into a conditional.

This patch includes both the tests (base-cycle-direct and
base-cycle-indirect) and the fix, since the .err file output
for the unfixed case is not useful (particularly when it was
warning about unbounded recursion, as that limit may be
platform-specific).

We don't need to worry about cycles in flat unions (neither
the base type nor the type of a variant can be a union) nor
in alternates (alternate branches cannot themselves be an
alternate).  But if we later allow a union type as a variant,
we will still be okay, as QAPISchemaObjectTypeVariants.check()
triggers the same QAPISchemaObjectType.check() that will
detect any loops.

Likewise, we need not worry about the case of diamond
inheritance where the same class is used for a flat union base
class and one of its variants; either both uses will introduce
a collision in trying to insert the same member name twice, or
the shared type is empty and changes nothing.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>


  Commit: c1a5f950cdeeaea6a835b2b33f040a0e62c18662
      
https://github.com/qemu/qemu/commit/c1a5f950cdeeaea6a835b2b33f040a0e62c18662
  Author: Peter Maydell <address@hidden>
  Date:   2015-12-17 (Thu, 17 Dec 2015)

  Changed paths:
    M block.c
    M block/blkdebug.c
    M block/parallels.c
    M block/qapi.c
    M block/qcow2.c
    M block/quorum.c
    M block/raw-posix.c
    M blockdev.c
    M cpus.c
    M docs/blkdebug.txt
    M docs/qapi-code-gen.txt
    M hmp.c
    M hw/char/escc.c
    M hw/i386/pc_piix.c
    M hw/i386/pc_q35.c
    M hw/input/hid.c
    M hw/input/ps2.c
    M hw/input/virtio-input-hid.c
    M include/block/block.h
    M include/block/block_int.h
    M include/hw/qdev-core.h
    M include/migration/migration.h
    M include/qapi/error.h
    M include/qapi/qmp/qbool.h
    M include/qapi/qmp/qdict.h
    M include/qapi/qmp/qfloat.h
    M include/qapi/qmp/qint.h
    M include/qapi/qmp/qlist.h
    M include/qapi/qmp/qobject.h
    M include/qapi/qmp/qstring.h
    M include/qapi/visitor-impl.h
    M include/qapi/visitor.h
    M include/qemu/typedefs.h
    M migration/migration.c
    M monitor.c
    M net/net.c
    M qapi-schema.json
    M qapi/block-core.json
    M qapi/common.json
    M qapi/opts-visitor.c
    M qapi/qapi-visit-core.c
    M qapi/qmp-dispatch.c
    M qapi/qmp-input-visitor.c
    M qapi/string-input-visitor.c
    M qemu-nbd.c
    M qmp-commands.hx
    M qobject/Makefile.objs
    M qobject/qbool.c
    M qobject/qdict.c
    M qobject/qfloat.c
    M qobject/qint.c
    M qobject/qlist.c
    M qobject/qnull.c
    A qobject/qobject.c
    M qobject/qstring.c
    M replay/replay-input.c
    M scripts/qapi-types.py
    M scripts/qapi-visit.py
    M scripts/qapi.py
    M tests/Makefile
    M tests/qapi-schema/alternate-clash.err
    M tests/qapi-schema/alternate-empty.out
    A tests/qapi-schema/args-member-case.err
    A tests/qapi-schema/args-member-case.exit
    A tests/qapi-schema/args-member-case.json
    A tests/qapi-schema/args-member-case.out
    M tests/qapi-schema/args-name-clash.err
    M tests/qapi-schema/args-name-clash.exit
    M tests/qapi-schema/args-name-clash.json
    M tests/qapi-schema/args-name-clash.out
    A tests/qapi-schema/base-cycle-direct.err
    A tests/qapi-schema/base-cycle-direct.exit
    A tests/qapi-schema/base-cycle-direct.json
    A tests/qapi-schema/base-cycle-direct.out
    A tests/qapi-schema/base-cycle-indirect.err
    A tests/qapi-schema/base-cycle-indirect.exit
    A tests/qapi-schema/base-cycle-indirect.json
    A tests/qapi-schema/base-cycle-indirect.out
    M tests/qapi-schema/comments.out
    M tests/qapi-schema/empty.out
    M tests/qapi-schema/enum-clash-member.err
    M tests/qapi-schema/enum-clash-member.json
    R tests/qapi-schema/enum-max-member.err
    R tests/qapi-schema/enum-max-member.exit
    R tests/qapi-schema/enum-max-member.json
    R tests/qapi-schema/enum-max-member.out
    A tests/qapi-schema/enum-member-case.err
    A tests/qapi-schema/enum-member-case.exit
    A tests/qapi-schema/enum-member-case.json
    A tests/qapi-schema/enum-member-case.out
    M tests/qapi-schema/event-case.out
    R tests/qapi-schema/event-max.err
    R tests/qapi-schema/event-max.exit
    R tests/qapi-schema/event-max.json
    R tests/qapi-schema/event-max.out
    R tests/qapi-schema/flat-union-clash-branch.err
    R tests/qapi-schema/flat-union-clash-branch.exit
    R tests/qapi-schema/flat-union-clash-branch.json
    R tests/qapi-schema/flat-union-clash-branch.out
    M tests/qapi-schema/flat-union-clash-member.err
    R tests/qapi-schema/flat-union-clash-type.err
    R tests/qapi-schema/flat-union-clash-type.exit
    R tests/qapi-schema/flat-union-clash-type.json
    R tests/qapi-schema/flat-union-clash-type.out
    M tests/qapi-schema/flat-union-empty.out
    M tests/qapi-schema/ident-with-escape.out
    M tests/qapi-schema/include-relpath.out
    M tests/qapi-schema/include-repetition.out
    M tests/qapi-schema/include-simple.out
    M tests/qapi-schema/indented-expr.out
    M tests/qapi-schema/qapi-schema-test.json
    M tests/qapi-schema/qapi-schema-test.out
    A tests/qapi-schema/reserved-enum-q.err
    A tests/qapi-schema/reserved-enum-q.exit
    A tests/qapi-schema/reserved-enum-q.json
    A tests/qapi-schema/reserved-enum-q.out
    A tests/qapi-schema/reserved-member-underscore.err
    A tests/qapi-schema/reserved-member-underscore.exit
    A tests/qapi-schema/reserved-member-underscore.json
    A tests/qapi-schema/reserved-member-underscore.out
    M tests/qapi-schema/struct-base-clash-deep.err
    M tests/qapi-schema/struct-base-clash.err
    R tests/qapi-schema/union-bad-branch.err
    R tests/qapi-schema/union-bad-branch.exit
    R tests/qapi-schema/union-bad-branch.json
    R tests/qapi-schema/union-bad-branch.out
    A tests/qapi-schema/union-branch-case.err
    A tests/qapi-schema/union-branch-case.exit
    A tests/qapi-schema/union-branch-case.json
    A tests/qapi-schema/union-branch-case.out
    M tests/qapi-schema/union-clash-branches.err
    M tests/qapi-schema/union-clash-branches.json
    M tests/qapi-schema/union-clash-data.out
    R tests/qapi-schema/union-clash-type.err
    R tests/qapi-schema/union-clash-type.exit
    R tests/qapi-schema/union-clash-type.json
    R tests/qapi-schema/union-clash-type.out
    M tests/qapi-schema/union-empty.out
    R tests/qapi-schema/union-max.err
    R tests/qapi-schema/union-max.exit
    R tests/qapi-schema/union-max.json
    R tests/qapi-schema/union-max.out
    M tests/qemu-iotests/026
    M tests/qemu-iotests/026.out
    M tests/qemu-iotests/026.out.nocache
    M tests/qemu-iotests/077
    M tests/test-qmp-commands.c
    M tests/test-qmp-input-visitor.c
    M tests/test-qmp-output-visitor.c
    M tests/test-string-output-visitor.c
    M tpm.c
    M ui/cocoa.m
    M ui/console.c
    M ui/gtk.c
    M ui/input-keymap.c
    M ui/input-legacy.c
    M ui/input.c
    M ui/sdl.c
    M ui/sdl2.c
    M ui/spice-input.c
    M ui/vnc.c
    M vl.c

  Log Message:
  -----------
  Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2015-12-17' into 
staging

QAPI patches for 2015-12-17

# gpg: Signature made Thu 17 Dec 2015 07:33:41 GMT using RSA key ID EB918653
# gpg: Good signature from "Markus Armbruster <address@hidden>"
# gpg:                 aka "Markus Armbruster <address@hidden>"

* remotes/armbru/tags/pull-qapi-2015-12-17: (40 commits)
  qapi: Detect base class loops
  qapi: Move duplicate collision checks to schema check()
  qapi: Enforce (or whitelist) case conventions on qapi members
  qapi: Track enum values by QAPISchemaMember, not string
  qapi: Prepare new QAPISchemaMember base class
  qapi: Shorter visits of optional fields
  qapi: Simplify visits of optional fields
  qapi: Fix alternates that accept 'number' but not 'int'
  qapi: Inline _make_implicit_tag()
  qapi-types: Drop unnedeed ._fwdefn
  qapi: Simplify visiting of alternate types
  qapi: Convert QType into QAPI built-in enum type
  qobject: Rename qtype_code to QType
  qobject: Simplify QObject
  qapi: Change munging of CamelCase enum values
  qapi: Add alias for ErrorClass
  cpu: Convert CpuInfo into flat union
  qapi: Remove obsolete tests for MAX collision
  qapi: Don't let implicit enum MAX member collide
  qapi: Tighten the regex on valid names
  ...

Signed-off-by: Peter Maydell <address@hidden>


Compare: https://github.com/qemu/qemu/compare/fc77eb20d78e...c1a5f950cdee

reply via email to

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