qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH Resend V3 0/9] qapi script: support enum as discriminator and better enum name
@ 2013-11-29  8:41 Wenchao Xia
  2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 1/9] qapi script: remember enum values Wenchao Xia
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Wenchao Xia @ 2013-11-29  8:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia

I forgot to cc the maillist before, so resend it to qemu-devel@nongnu.org.
 
This series address two issues:

1. support using enum as discriminator in union.
For example, if we have following define in qapi schema:
{ 'enum': 'EnumOne',
  'data': [ 'value1', 'value2', 'value3' ] }

{ 'type': 'UserDefBase0',
  'data': { 'base-string0': 'str', 'base-enum0': 'EnumOne' } }

Before this series, discriminator in union must be a string, and a
hidden enum type as discriminator is generated. After this series,
qapi schema can directly use predefined enum type:
{ 'union': 'UserDefEnumDiscriminatorUnion',
  'base': 'UserDefBase0',
  'discriminator' : 'base-enum0',
  'data': { 'value1' : 'UserDefA',
            'value2' : 'UserDefInherit',
            'value3' : 'UserDefB' } }

The benefit is that every thing is defined explicitly in schema file,
the discriminator enum type can be used in other API define in schema,
and a compile time check will be put to verify the correctness according
to enum define. Currently BlockdevOptions used discriminator which can
be converted, in the future other union can also use enum discriminator.

The implement is done by:
1.1 remember the enum defines by qapi scripts.(patch 1)
1.2 use the remembered enum define to check correctness at compile
time.(patch 3), more strict check(patch 2)
1.3 use the same enum name generation rule to avoid C code mismatch,
esp for "case [ENUM_VALUE]" in qapi-visit.c.(patch 4,5)
1.4 switch the code path, when pre-defined enum type is used as discriminator,
don't generate a hidden enum type, use the enum type instead, add
docs/qapi-code-gen.txt.(Patch 6)
1.5 test case shows how it looks like.(Patch 7)
1.6 convert BlockdevOptions. (Patch 8)

2. Better enum name generation
Before this patch, AIOContext->A_I_O_Context, after this patch,
AIOContet->AIO_Context. Since previous patch has foldered enum
name generation codes into one function, it is done easily by modifying
it.(Patch 9)


Changes from RFC:
  Mainly address Eric's comments: fix typo, add patch 2 to allow partly mapping
enum value in union, add related test case, remove direct inherit support "_base"
and related test case. RFC series at:
http://lists.nongnu.org/archive/html/qemu-devel/2013-11/msg00363.html

v2:
  General:
  3/8: use Raise exception instead of sys.error.write in qapi.py.
  Address Eric's comments:
  2/8,3/8: more check for enum value at compile time.
  8/8: correspond test case change.

v3:
  General:
  move enum name generation patch to last in the series, add convert patch
8/9.
  Address Luiz and Kevin's comments:
  Better introduction.
  6/9: renamed this patch, add docs/qapi-code-gen.txt part.

Wenchao Xia (9):
  1 qapi script: remember enum values
  2 qapi script: add check for duplicated key
  3 qapi script: check correctness of discriminator values in union
  4 qapi script: code move for generate_enum_name()
  5 qapi script: use same function to generate enum string
  6 qapi script: support pre-defined enum type as discriminator in union
  7 tests: add cases for inherited struct and union with discriminator
  8 qapi: convert BlockdevOptions to use enum discriminator
  9 qapi script: do not add "_" for every capitalized char in enum

 docs/qapi-code-gen.txt                  |    8 ++-
 include/qapi/qmp/qerror.h               |    2 +-
 qapi-schema.json                        |   14 +++-
 scripts/qapi-types.py                   |   34 ++++----
 scripts/qapi-visit.py                   |   55 +++++++++--
 scripts/qapi.py                         |   84 ++++++++++++++++-
 target-i386/cpu.c                       |    2 +-
 tests/qapi-schema/comments.out          |    2 +-
 tests/qapi-schema/qapi-schema-test.json |   27 ++++++
 tests/qapi-schema/qapi-schema-test.out  |   15 +++-
 tests/test-qmp-input-visitor.c          |  120 +++++++++++++++++++++++++
 tests/test-qmp-output-visitor.c         |  149 +++++++++++++++++++++++++++++++
 12 files changed, 473 insertions(+), 39 deletions(-)

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-12-04 22:58 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-29  8:41 [Qemu-devel] [PATCH Resend V3 0/9] qapi script: support enum as discriminator and better enum name Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 1/9] qapi script: remember enum values Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 2/9] qapi script: add check for duplicated key Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 3/9] qapi script: check correctness of discriminator values in union Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 4/9] qapi script: code move for generate_enum_name() Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 5/9] qapi script: use same function to generate enum string Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 6/9] qapi script: support pre-defined enum type as discriminator in union Wenchao Xia
2013-12-03  3:13   ` Eric Blake
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 7/9] tests: add cases for inherited struct and union with discriminator Wenchao Xia
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 8/9] qapi: convert BlockdevOptions to use enum discriminator Wenchao Xia
2013-12-03  3:15   ` Eric Blake
2013-11-29  8:41 ` [Qemu-devel] [PATCH V3 9/9] qapi script: do not add "_" for every capitalized char in enum Wenchao Xia
2013-12-04 22:58   ` Eric Blake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).