From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50324) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WGMbV-00057l-8P for qemu-devel@nongnu.org; Thu, 20 Feb 2014 00:55:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WGMbK-000165-UB for qemu-devel@nongnu.org; Thu, 20 Feb 2014 00:55:25 -0500 Received: from e28smtp05.in.ibm.com ([122.248.162.5]:57934) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WGMbK-00014e-8H for qemu-devel@nongnu.org; Thu, 20 Feb 2014 00:55:14 -0500 Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 20 Feb 2014 11:25:08 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id D0BA61258055 for ; Thu, 20 Feb 2014 11:27:04 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s1K5t64S62193810 for ; Thu, 20 Feb 2014 11:25:06 +0530 Received: from d28av02.in.ibm.com (localhost [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s1K5t3NT001750 for ; Thu, 20 Feb 2014 11:25:03 +0530 From: Wenchao Xia Date: Thu, 20 Feb 2014 00:54:44 -0500 Message-Id: <1392875695-15627-1-git-send-email-xiawenc@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH V7 00/11] qapi script: support enum as discriminator and better enum name List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, mdroth@linux.vnet.ibm.com, armbru@redhat.com, lcapitulino@redhat.com, Wenchao Xia 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, not allow partly mapping. 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. v4: Address Eric's comments: 5/9: better commit message. 6/9: typo fix in doc. 9/9: typo fix, fix indentation, better incode comment. v5: Address Eric's comments: 6/10: doc typo fix. 8/10: new patch to remove string discriminator. 9/10: removed the string discriminator test case. v6: rebased on upstream by adding "blgdebug" and "blkverify" in qapi-schema.json in patch 7/10. v7: The series is rebased on Markus's tree: git://repo.or.cz/qemu/armbru.git branch qapi-scripts Address Markus's comments: 2/11: typo fix in error message. 3/11: new patch to recording addtional line info in schema parsing. 4/11: move the check into qapi.py, report better with fp/line info. 7/11: move the UnionKind adding in qapi.py after 1st parsing and with better error info. 9/11: move the check into qapi.py with fp/line info, test case corresond change. 11/11: new patch for errpr path test case. Wenchao Xia (11): 1 qapi script: remember enum values 2 qapi script: add check for duplicated key 3 qapi-script: remember line number in schema parsing 4 qapi script: check correctness of discriminator values in union 5 qapi script: code move for generate_enum_name() 6 qapi script: use same function to generate enum string 7 qapi script: support pre-defined enum type as discriminator in union 8 qapi: convert BlockdevOptions to use enum discriminator 9 qapi script: do not allow string discriminator 10 qapi script: do not add "_" for every capitalized char in enum 11 qapi test: add error path test for union docs/qapi-code-gen.txt | 8 +- include/qapi/qmp/qerror.h | 2 +- qapi-schema.json | 14 ++- scripts/qapi-types.py | 36 +++-- scripts/qapi-visit.py | 42 ++++-- scripts/qapi.py | 166 ++++++++++++++++++-- target-i386/cpu.c | 2 +- tests/Makefile | 8 +- tests/qapi-schema/comments.out | 2 +- tests/qapi-schema/duplicate-key.err | 1 + tests/qapi-schema/duplicate-key.exit | 1 + tests/qapi-schema/duplicate-key.json | 2 + tests/qapi-schema/qapi-schema-test.json | 9 +- tests/qapi-schema/qapi-schema-test.out | 13 +- tests/qapi-schema/union-enum-value-not-cover.err | 1 + tests/qapi-schema/union-enum-value-not-cover.exit | 1 + tests/qapi-schema/union-enum-value-not-cover.json | 16 ++ tests/qapi-schema/union-invalid-base.err | 1 + tests/qapi-schema/union-invalid-base.exit | 1 + tests/qapi-schema/union-invalid-base.json | 17 ++ .../union-invalid-discriminator-value.err | 1 + .../union-invalid-discriminator-value.exit | 1 + .../union-invalid-discriminator-value.json | 17 ++ tests/qapi-schema/union-invalid-discriminator.err | 1 + tests/qapi-schema/union-invalid-discriminator.exit | 1 + tests/qapi-schema/union-invalid-discriminator.json | 17 ++ tests/test-qmp-input-strict.c | 5 +- tests/test-qmp-input-visitor.c | 10 +- tests/test-qmp-output-visitor.c | 10 +- 29 files changed, 339 insertions(+), 67 deletions(-) create mode 100644 tests/qapi-schema/duplicate-key.err create mode 100644 tests/qapi-schema/duplicate-key.exit create mode 100644 tests/qapi-schema/duplicate-key.json create mode 100644 tests/qapi-schema/duplicate-key.out create mode 100644 tests/qapi-schema/union-enum-value-not-cover.err create mode 100644 tests/qapi-schema/union-enum-value-not-cover.exit create mode 100644 tests/qapi-schema/union-enum-value-not-cover.json create mode 100644 tests/qapi-schema/union-enum-value-not-cover.out create mode 100644 tests/qapi-schema/union-invalid-base.err create mode 100644 tests/qapi-schema/union-invalid-base.exit create mode 100644 tests/qapi-schema/union-invalid-base.json create mode 100644 tests/qapi-schema/union-invalid-base.out create mode 100644 tests/qapi-schema/union-invalid-discriminator-value.err create mode 100644 tests/qapi-schema/union-invalid-discriminator-value.exit create mode 100644 tests/qapi-schema/union-invalid-discriminator-value.json create mode 100644 tests/qapi-schema/union-invalid-discriminator-value.out create mode 100644 tests/qapi-schema/union-invalid-discriminator.err create mode 100644 tests/qapi-schema/union-invalid-discriminator.exit create mode 100644 tests/qapi-schema/union-invalid-discriminator.json create mode 100644 tests/qapi-schema/union-invalid-discriminator.out