From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com
Subject: [Qemu-devel] [PATCH v8 09/22] qapi: add 'if' to enum members
Date: Thu, 13 Dec 2018 16:37:11 +0400 [thread overview]
Message-ID: <20181213123724.4866-10-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20181213123724.4866-1-marcandre.lureau@redhat.com>
QAPISchemaMember gains .ifcond for enum members: inherited classes,
such as QAPISchemaObjectTypeMember, will thus have an ifcond member
after this (those different types will also use the .ifcond to store
the condition and generate conditional code in the following patches).
The generated code remains unconditional for now. Later patches
generate the conditionals.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
scripts/qapi/common.py | 8 +++++---
docs/devel/qapi-code-gen.txt | 9 +++++++++
tests/Makefile.include | 1 +
tests/qapi-schema/enum-dict-member-unknown.err | 2 +-
tests/qapi-schema/enum-if-invalid.err | 1 +
tests/qapi-schema/enum-if-invalid.exit | 1 +
tests/qapi-schema/enum-if-invalid.json | 3 +++
tests/qapi-schema/enum-if-invalid.out | 0
tests/qapi-schema/qapi-schema-test.json | 5 +++--
tests/qapi-schema/qapi-schema-test.out | 2 ++
tests/qapi-schema/test-qapi.py | 1 +
11 files changed, 27 insertions(+), 6 deletions(-)
create mode 100644 tests/qapi-schema/enum-if-invalid.err
create mode 100644 tests/qapi-schema/enum-if-invalid.exit
create mode 100644 tests/qapi-schema/enum-if-invalid.json
create mode 100644 tests/qapi-schema/enum-if-invalid.out
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 510b177e6a..3897bf23eb 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -872,7 +872,8 @@ def check_enum(expr, info):
for member in members:
source = "dictionary member of enum '%s'" % name
- check_known_keys(info, source, member, ['name'], [])
+ check_known_keys(info, source, member, ['name'], ['if'])
+ check_if(member, info)
check_name(info, "Member of enum '%s'" % name, member['name'],
enum_member=True)
@@ -1346,9 +1347,10 @@ class QAPISchemaObjectType(QAPISchemaType):
class QAPISchemaMember(object):
role = 'member'
- def __init__(self, name):
+ def __init__(self, name, ifcond=None):
assert isinstance(name, str)
self.name = name
+ self.ifcond = listify_cond(ifcond)
self.owner = None
def set_owner(self, name):
@@ -1656,7 +1658,7 @@ class QAPISchema(object):
qtype_values, 'QTYPE'))
def _make_enum_members(self, values):
- return [QAPISchemaMember(v['name']) for v in values]
+ return [QAPISchemaMember(v['name'], v.get('if')) for v in values]
def _make_implicit_enum_type(self, name, info, ifcond, values):
# See also QAPISchemaObjectTypeMember._pretty_owner()
diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
index 2c8b392b20..7ba9066eac 100644
--- a/docs/devel/qapi-code-gen.txt
+++ b/docs/devel/qapi-code-gen.txt
@@ -752,6 +752,15 @@ gets its generated code guarded like this:
#endif /* defined(HAVE_BAR) */
#endif /* defined(CONFIG_FOO) */
+An enum value can be replaced by a dictionary with a 'name' and a 'if'
+key.
+
+Example: a conditional 'bar' enum member.
+
+{ 'enum': 'IfEnum', 'data':
+ [ 'foo',
+ { 'name' : 'bar', 'if': 'defined(IFCOND)' } ] }
+
Please note that you are responsible to ensure that the C code will
compile with an arbitrary combination of conditions, since the
generators are unable to check it at this point.
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 2e894c1037..3c9eea27fd 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -384,6 +384,7 @@ qapi-schema += enum-bad-name.json
qapi-schema += enum-bad-prefix.json
qapi-schema += enum-clash-member.json
qapi-schema += enum-dict-member-unknown.json
+qapi-schema += enum-if-invalid.json
qapi-schema += enum-int-member.json
qapi-schema += enum-member-case.json
qapi-schema += enum-missing-data.json
diff --git a/tests/qapi-schema/enum-dict-member-unknown.err b/tests/qapi-schema/enum-dict-member-unknown.err
index 76bd0471db..2aae618be0 100644
--- a/tests/qapi-schema/enum-dict-member-unknown.err
+++ b/tests/qapi-schema/enum-dict-member-unknown.err
@@ -1,2 +1,2 @@
tests/qapi-schema/enum-dict-member-unknown.json:2: Unknown key 'bad-key' in dictionary member of enum 'MyEnum'
-Valid keys are 'name'.
+Valid keys are 'if', 'name'.
diff --git a/tests/qapi-schema/enum-if-invalid.err b/tests/qapi-schema/enum-if-invalid.err
new file mode 100644
index 0000000000..54c3cf887b
--- /dev/null
+++ b/tests/qapi-schema/enum-if-invalid.err
@@ -0,0 +1 @@
+tests/qapi-schema/enum-if-invalid.json:2: 'if' condition must be a string or a list of strings
diff --git a/tests/qapi-schema/enum-if-invalid.exit b/tests/qapi-schema/enum-if-invalid.exit
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/tests/qapi-schema/enum-if-invalid.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/enum-if-invalid.json b/tests/qapi-schema/enum-if-invalid.json
new file mode 100644
index 0000000000..60bd0ef1d7
--- /dev/null
+++ b/tests/qapi-schema/enum-if-invalid.json
@@ -0,0 +1,3 @@
+# check invalid 'if' type
+{ 'enum': 'TestIfEnum', 'data':
+ [ 'foo', { 'name' : 'bar', 'if': { 'val': 'foo' } } ] }
diff --git a/tests/qapi-schema/enum-if-invalid.out b/tests/qapi-schema/enum-if-invalid.out
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index 15388ae9a4..8bfaf5aedd 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -204,7 +204,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' },
@@ -219,7 +220,7 @@
{ 'command': 'TestIfAlternateCmd', 'data': { 'alt_cmd_arg': 'TestIfAlternate' },
'if': 'defined(TEST_IF_ALT)' }
-{ 'command': 'TestIfCmd', 'data': { 'foo': 'TestIfStruct' },
+{ 'command': 'TestIfCmd', 'data': { 'foo': 'TestIfStruct', 'bar': 'TestIfEnum' },
'returns': 'UserDefThree',
'if': ['defined(TEST_IF_CMD)', 'defined(TEST_IF_STRUCT)'] }
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 06e80e5b04..d90d987651 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -272,6 +272,7 @@ object TestIfStruct
enum TestIfEnum
member foo
member bar
+ if ['defined(TEST_IF_ENUM_BAR)']
if ['defined(TEST_IF_ENUM)']
object q_obj_TestStruct-wrapper
member data: TestStruct optional=False
@@ -302,6 +303,7 @@ command TestIfAlternateCmd q_obj_TestIfAlternateCmd-arg -> None
if ['defined(TEST_IF_ALT)']
object q_obj_TestIfCmd-arg
member foo: TestIfStruct optional=False
+ member bar: TestIfEnum optional=False
if ['defined(TEST_IF_CMD)', 'defined(TEST_IF_STRUCT)']
command TestIfCmd q_obj_TestIfCmd-arg -> UserDefThree
gen=True success_response=True boxed=False oob=False preconfig=False
diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py
index 641a18f06d..aadf252d9d 100644
--- a/tests/qapi-schema/test-qapi.py
+++ b/tests/qapi-schema/test-qapi.py
@@ -29,6 +29,7 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor):
print(' prefix %s' % prefix)
for m in members:
print(' member %s' % m.name)
+ self._print_if(m.ifcond, indent=8)
self._print_if(ifcond)
def visit_object_type(self, name, info, ifcond, base, members, variants):
--
2.20.0
next prev parent reply other threads:[~2018-12-13 12:38 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-13 12:37 [Qemu-devel] [PATCH v8 00/22] qapi: add #if pre-processor conditions to generated code (part 2) Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 01/22] qapi: Do not define enumeration value explicitly Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 02/22] qapi: change enum visitor and gen_enum* to take QAPISchemaMember Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 03/22] tests: print enum type members more like object type members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 04/22] qapi: factor out checking for keys Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 05/22] qapi: improve reporting of unknown or missing keys Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 06/22] qapi: add a dictionary form with 'name' key for enum members Marc-André Lureau
2018-12-13 13:23 ` Markus Armbruster
2018-12-13 14:32 ` Markus Armbruster
2018-12-13 14:35 ` Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 07/22] qapi: pass long form enum to make_enum_members Marc-André Lureau
2018-12-13 14:29 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 08/22] qapi: simplify make_enum_members() Marc-André Lureau
2018-12-13 12:37 ` Marc-André Lureau [this message]
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 10/22] qapi-events: add 'if' condition to implicit event enum Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 11/22] qapi: rename allow_dict to allow_implicit Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 12/22] qapi: add a dictionary form for TYPE Marc-André Lureau
2018-12-13 13:31 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 13/22] qapi: add 'if' to implicit struct members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 14/22] qapi: add an error in case a discriminator is conditional Marc-André Lureau
2018-12-13 13:34 ` Markus Armbruster
2018-12-13 15:45 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 15/22] qapi: add 'if' to union members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 16/22] qapi: add 'if' to alternate members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 17/22] qapi: add #if conditions to generated code members Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 18/22] qapi: add 'If:' condition to enum values documentation Marc-André Lureau
2018-12-13 14:03 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 19/22] qapi: add 'If:' condition to struct members documentation Marc-André Lureau
2018-12-13 14:05 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 20/22] qapi: add condition to variants documentation Marc-André Lureau
2018-12-13 14:06 ` Markus Armbruster
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 21/22] qapi: add more conditions to SPICE Marc-André Lureau
2018-12-13 12:37 ` [Qemu-devel] [PATCH v8 22/22] qapi: add conditions to REPLICATION type/commands on the schema Marc-André Lureau
2018-12-13 14:47 ` [Qemu-devel] [PATCH v8 00/22] qapi: add #if pre-processor conditions to generated code (part 2) Markus Armbruster
2018-12-13 14:52 ` Marc-André Lureau
2018-12-13 16:52 ` 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=20181213123724.4866-10-marcandre.lureau@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=armbru@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).