aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2022-12-14 22:42:13 +0000
committerPeter Maydell <peter.maydell@linaro.org>2022-12-14 22:42:14 +0000
commitae2b87341b5ddb0dcb1b3f2d4f586ef18de75873 (patch)
tree3af0e07d7aca1a635cdd13966ce5688e5ec79585 /scripts
parent5204b499a6cae4dfd9fe762d5e6e82224892383b (diff)
parent5efb40d6571457c3cc35b7a91088cc2fceee5763 (diff)
Merge tag 'pull-qapi-2022-12-14-v2' of https://repo.or.cz/qemu/armbru into staging
QAPI patches patches for 2022-12-14 # gpg: Signature made Wed 14 Dec 2022 19:14:34 GMT # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full] # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * tag 'pull-qapi-2022-12-14-v2' of https://repo.or.cz/qemu/armbru: (30 commits) qapi: Drop temporary logic to support conversion step by step qapi qga: Elide redundant has_FOO in generated C qapi virtio: Elide redundant has_FOO in generated C qapi ui: Elide redundant has_FOO in generated C qapi transaction: Elide redundant has_FOO in generated C qapi tpm: Elide redundant has_FOO in generated C qapi stats: Elide redundant has_FOO in generated C qapi run-state: Elide redundant has_FOO in generated C qapi rocker: Elide redundant has_FOO in generated C qapi replay: Elide redundant has_FOO in generated C qapi qdev qom: Elide redundant has_FOO in generated C qapi pci: Elide redundant has_FOO in generated C qapi net: Elide redundant has_FOO in generated C qapi misc: Elide redundant has_FOO in generated C qapi migration: Elide redundant has_FOO in generated C qapi machine: Elide redundant has_FOO in generated C qapi job: Elide redundant has_FOO in generated C qapi dump: Elide redundant has_FOO in generated C qapi crypto: Elide redundant has_FOO in generated C qapi chardev: Elide redundant has_FOO in generated C ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/qapi/commands.py9
-rw-r--r--scripts/qapi/events.py3
-rw-r--r--scripts/qapi/gen.py2
-rw-r--r--scripts/qapi/schema.py14
-rw-r--r--scripts/qapi/types.py2
-rw-r--r--scripts/qapi/visit.py17
6 files changed, 36 insertions, 11 deletions
diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py
index 38ca38a7b9..79c5e5c3a9 100644
--- a/scripts/qapi/commands.py
+++ b/scripts/qapi/commands.py
@@ -64,7 +64,7 @@ def gen_call(name: str,
elif arg_type:
assert not arg_type.variants
for memb in arg_type.members:
- if memb.optional:
+ if memb.need_has():
argstr += 'arg.has_%s, ' % c_name(memb.name)
argstr += 'arg.%s, ' % c_name(memb.name)
@@ -83,7 +83,7 @@ def gen_call(name: str,
trace_qmp_enter_%(name)s(req_json->str);
}
- ''',
+''',
upper=upper, name=name)
ret += mcgen('''
@@ -124,13 +124,13 @@ def gen_call(name: str,
trace_qmp_exit_%(name)s(ret_json->str, true);
}
- ''',
+''',
upper=upper, name=name)
else:
ret += mcgen('''
trace_qmp_exit_%(name)s("{}", true);
- ''',
+''',
name=name)
return ret
@@ -316,7 +316,6 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
#include "qapi/error.h"
#include "%(visit)s.h"
#include "%(commands)s.h"
-
''',
commands=commands, visit=visit))
diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
index 27b44c49f5..3cf01e96b6 100644
--- a/scripts/qapi/events.py
+++ b/scripts/qapi/events.py
@@ -60,7 +60,7 @@ def gen_param_var(typ: QAPISchemaObjectType) -> str:
for memb in typ.members:
ret += sep
sep = ', '
- if memb.optional:
+ if memb.need_has():
ret += 'has_' + c_name(memb.name) + sep
if memb.type.name == 'str':
# Cast away const added in build_params()
@@ -196,7 +196,6 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp-event.h"
-
''',
events=events, visit=visit,
prefix=self._prefix))
diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
index 113b49134d..b5a8d03e8e 100644
--- a/scripts/qapi/gen.py
+++ b/scripts/qapi/gen.py
@@ -121,7 +121,7 @@ def build_params(arg_type: Optional[QAPISchemaObjectType],
for memb in arg_type.members:
ret += sep
sep = ', '
- if memb.optional:
+ if memb.need_has():
ret += 'bool has_%s, ' % c_name(memb.name)
ret += '%s %s' % (memb.type.c_param_type(),
c_name(memb.name))
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 3728340c37..cd8661125c 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -253,6 +253,11 @@ class QAPISchemaType(QAPISchemaEntity):
return None
return self.name
+ def need_has_if_optional(self):
+ # When FOO is a pointer, has_FOO == !!FOO, i.e. has_FOO is redundant.
+ # Except for arrays; see QAPISchemaArrayType.need_has_if_optional().
+ return not self.c_type().endswith(POINTER_SUFFIX)
+
def check(self, schema):
QAPISchemaEntity.check(self, schema)
for feat in self.features:
@@ -352,6 +357,11 @@ class QAPISchemaArrayType(QAPISchemaType):
self._element_type_name = element_type
self.element_type = None
+ def need_has_if_optional(self):
+ # When FOO is an array, we still need has_FOO to distinguish
+ # absent (!has_FOO) from present and empty (has_FOO && !FOO).
+ return True
+
def check(self, schema):
super().check(schema)
self.element_type = schema.resolve_type(
@@ -745,6 +755,10 @@ class QAPISchemaObjectTypeMember(QAPISchemaMember):
self.optional = optional
self.features = features or []
+ def need_has(self):
+ assert self.type
+ return self.optional and self.type.need_has_if_optional()
+
def check(self, schema):
assert self.defined_in
self.type = schema.resolve_type(self._type_name, self.info,
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 477d027001..c39d054d2c 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -142,7 +142,7 @@ def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
ret = ''
for memb in members:
ret += memb.ifcond.gen_if()
- if memb.optional:
+ if memb.need_has():
ret += mcgen('''
bool has_%(c_name)s;
''',
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 380fa197f5..26a584ee4c 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -71,6 +71,16 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
''',
c_name=c_name(name))
+ sep = ''
+ for memb in members:
+ if memb.optional and not memb.need_has():
+ ret += mcgen('''
+ bool has_%(c_name)s = !!obj->%(c_name)s;
+''',
+ c_name=c_name(memb.name))
+ sep = '\n'
+ ret += sep
+
if base:
ret += mcgen('''
if (!visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, errp)) {
@@ -82,10 +92,13 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
for memb in members:
ret += memb.ifcond.gen_if()
if memb.optional:
+ has = 'has_' + c_name(memb.name)
+ if memb.need_has():
+ has = 'obj->' + has
ret += mcgen('''
- if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
+ if (visit_optional(v, "%(name)s", &%(has)s)) {
''',
- name=memb.name, c_name=c_name(memb.name))
+ name=memb.name, has=has)
indent.increase()
special_features = gen_special_features(memb.features)
if special_features != '0':