mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 05:13:54 -06:00
qapi: Permit 'boxed' with empty type
We reject empty types with 'boxed': true. We don't really need that to work, but making it work is actually simpler than rejecting it, so do that. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20190913201349.24332-9-armbru@redhat.com>
This commit is contained in:
parent
9b4416bfc1
commit
675b214bc6
11 changed files with 19 additions and 25 deletions
|
@ -30,7 +30,7 @@ def gen_call(name, arg_type, boxed, ret_type):
|
|||
|
||||
argstr = ''
|
||||
if boxed:
|
||||
assert arg_type and not arg_type.is_empty()
|
||||
assert arg_type
|
||||
argstr = '&arg, '
|
||||
elif arg_type:
|
||||
assert not arg_type.variants
|
||||
|
@ -96,7 +96,7 @@ def gen_marshal_decl(name):
|
|||
|
||||
|
||||
def gen_marshal(name, arg_type, boxed, ret_type):
|
||||
have_args = arg_type and not arg_type.is_empty()
|
||||
have_args = boxed or (arg_type and not arg_type.is_empty())
|
||||
|
||||
ret = mcgen('''
|
||||
|
||||
|
|
|
@ -1687,12 +1687,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
|||
self.arg_type = schema.lookup_type(self._arg_type_name)
|
||||
assert isinstance(self.arg_type, QAPISchemaObjectType)
|
||||
self.arg_type.check(schema)
|
||||
if self.boxed:
|
||||
if self.arg_type.is_empty():
|
||||
raise QAPISemError(self.info,
|
||||
"Cannot use 'boxed' with empty type")
|
||||
else:
|
||||
assert not self.arg_type.variants
|
||||
assert not self.arg_type.variants or self.boxed
|
||||
elif self.boxed:
|
||||
raise QAPISemError(self.info, "Use of 'boxed' requires 'data'")
|
||||
if self._ret_type_name:
|
||||
|
@ -1721,12 +1716,7 @@ class QAPISchemaEvent(QAPISchemaEntity):
|
|||
self.arg_type = schema.lookup_type(self._arg_type_name)
|
||||
assert isinstance(self.arg_type, QAPISchemaObjectType)
|
||||
self.arg_type.check(schema)
|
||||
if self.boxed:
|
||||
if self.arg_type.is_empty():
|
||||
raise QAPISemError(self.info,
|
||||
"Cannot use 'boxed' with empty type")
|
||||
else:
|
||||
assert not self.arg_type.variants
|
||||
assert not self.arg_type.variants or self.boxed
|
||||
elif self.boxed:
|
||||
raise QAPISemError(self.info, "Use of 'boxed' requires 'data'")
|
||||
|
||||
|
|
|
@ -65,6 +65,8 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
|
|||
# practice, we can rename our local variables with a leading _ prefix,
|
||||
# or split the code into a wrapper function that creates a boxed
|
||||
# 'param' object then calls another to do the real work.
|
||||
have_args = boxed or (arg_type and not arg_type.is_empty())
|
||||
|
||||
ret = mcgen('''
|
||||
|
||||
%(proto)s
|
||||
|
@ -73,15 +75,13 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
|
|||
''',
|
||||
proto=build_event_send_proto(name, arg_type, boxed))
|
||||
|
||||
if arg_type and not arg_type.is_empty():
|
||||
if have_args:
|
||||
ret += mcgen('''
|
||||
QObject *obj;
|
||||
Visitor *v;
|
||||
''')
|
||||
if not boxed:
|
||||
ret += gen_param_var(arg_type)
|
||||
else:
|
||||
assert not boxed
|
||||
|
||||
ret += mcgen('''
|
||||
|
||||
|
@ -90,7 +90,7 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
|
|||
''',
|
||||
name=name)
|
||||
|
||||
if arg_type and not arg_type.is_empty():
|
||||
if have_args:
|
||||
ret += mcgen('''
|
||||
v = qobject_output_visitor_new(&obj);
|
||||
''')
|
||||
|
@ -121,7 +121,7 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
|
|||
event_emit=event_emit,
|
||||
c_enum=c_enum_const(event_enum_name, name))
|
||||
|
||||
if arg_type and not arg_type.is_empty():
|
||||
if have_args:
|
||||
ret += mcgen('''
|
||||
visit_free(v);
|
||||
''')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue