Skip to content

Commit

Permalink
qapi: Add type.is_empty() helper
Browse files Browse the repository at this point in the history
In the near future, we want to lift our artificial restriction of
no variants at the top level of an event, at which point the
currently open-coded check for empty members will become
insufficient.  Factor it out into a new helper method is_empty()
now, and future-proof it by checking variants, too, along with an
assert that it is not used prior to the completion of .check().
Update places that were checking for (non-)empty .members to use
the new helper.

All of the current callers assert that there are no variants (either
directly, or by qapi.py asserting that base types have no variants),
so this is not a semantic change.

No change to generated code.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1468468228-27827-6-git-send-email-eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
  • Loading branch information
ebblake authored and Markus Armbruster committed Jul 19, 2016
1 parent da9cb19 commit b616770
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 7 deletions.
6 changes: 3 additions & 3 deletions scripts/qapi-commands.py
Expand Up @@ -107,7 +107,7 @@ def gen_marshal(name, arg_type, ret_type):
''',
c_type=ret_type.c_type())

if arg_type and arg_type.members:
if arg_type and not arg_type.is_empty():
ret += mcgen('''
Visitor *v;
%(c_name)s arg = {0};
Expand Down Expand Up @@ -137,15 +137,15 @@ def gen_marshal(name, arg_type, ret_type):
ret += gen_call(name, arg_type, ret_type)

# 'goto out' produced above for arg_type, and by gen_call() for ret_type
if (arg_type and arg_type.members) or ret_type:
if (arg_type and not arg_type.is_empty()) or ret_type:
ret += mcgen('''
out:
''')
ret += mcgen('''
error_propagate(errp, err);
''')
if arg_type and arg_type.members:
if arg_type and not arg_type.is_empty():
ret += mcgen('''
visit_free(v);
v = qapi_dealloc_visitor_new();
Expand Down
6 changes: 3 additions & 3 deletions scripts/qapi-event.py
Expand Up @@ -69,7 +69,7 @@ def gen_event_send(name, arg_type):
''',
proto=gen_event_send_proto(name, arg_type))

if arg_type and arg_type.members:
if arg_type and not arg_type.is_empty():
ret += mcgen('''
QObject *obj;
Visitor *v;
Expand All @@ -88,7 +88,7 @@ def gen_event_send(name, arg_type):
''',
name=name)

if arg_type and arg_type.members:
if arg_type and not arg_type.is_empty():
ret += mcgen('''
v = qmp_output_visitor_new(&obj);
Expand Down Expand Up @@ -116,7 +116,7 @@ def gen_event_send(name, arg_type):
''',
c_enum=c_enum_const(event_enum_name, name))

if arg_type and arg_type.members:
if arg_type and not arg_type.is_empty():
ret += mcgen('''
out:
visit_free(v);
Expand Down
2 changes: 1 addition & 1 deletion scripts/qapi-types.py
Expand Up @@ -91,7 +91,7 @@ def gen_object(name, base, members, variants):
# potential issues with attempting to malloc space for zero-length
# structs in C, and also incompatibility with C++ (where an empty
# struct is size 1).
if not (base and base.members) and not members and not variants:
if (not base or base.is_empty()) and not members and not variants:
ret += mcgen('''
char qapi_dummy_for_empty_struct;
''')
Expand Down
4 changes: 4 additions & 0 deletions scripts/qapi.py
Expand Up @@ -999,6 +999,10 @@ def is_implicit(self):
# _def_predefineds()
return self.name.startswith('q_')

def is_empty(self):
assert self.members is not None
return not self.members and not self.variants

def c_name(self):
assert self.name != 'q_empty'
return QAPISchemaType.c_name(self)
Expand Down

0 comments on commit b616770

Please sign in to comment.