diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/qapi-types.py | 7 | ||||
-rw-r--r-- | scripts/qapi-visit.py | 11 | ||||
-rw-r--r-- | scripts/qapi.py | 20 |
3 files changed, 18 insertions, 20 deletions
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index e400b03479..f6fb930279 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -242,10 +242,9 @@ struct %(name)s ''') if base: - base_fields = find_struct(base)['data'] - if discriminator: - base_fields = base_fields.copy() - del base_fields[discriminator] + assert discriminator + base_fields = find_struct(base)['data'].copy() + del base_fields[discriminator] ret += generate_struct_fields(base_fields) else: assert not discriminator diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 41596bb95b..dbf0101cba 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -310,16 +310,15 @@ def generate_visit_union(expr): ret = "" disc_type = enum_define['enum_name'] else: - # There will always be a discriminator in the C switch code, by default it - # is an enum type generated silently as "'%sKind' % (name)" + # There will always be a discriminator in the C switch code, by default + # it is an enum type generated silently as "'%sKind' % (name)" ret = generate_visit_enum('%sKind' % name, members.keys()) disc_type = '%sKind' % (name) if base: - base_fields = find_struct(base)['data'] - if discriminator: - base_fields = base_fields.copy() - del base_fields[discriminator] + assert discriminator + base_fields = find_struct(base)['data'].copy() + del base_fields[discriminator] ret += generate_visit_struct_fields(name, "", "", base_fields) if discriminator: diff --git a/scripts/qapi.py b/scripts/qapi.py index 3ce8c3321b..438468e3aa 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -259,22 +259,22 @@ def check_union(expr, expr_info): discriminator = expr.get('discriminator') members = expr['data'] - # If the object has a member 'base', its value must name a complex type. - if base: + # If the object has a member 'base', its value must name a complex type, + # and there must be a discriminator. + if base is not None: + if discriminator is None: + raise QAPIExprError(expr_info, + "Union '%s' requires a discriminator to go " + "along with base" %name) base_fields = find_base_fields(base) if not base_fields: raise QAPIExprError(expr_info, "Base '%s' is not a valid type" % base) - # If the union object has no member 'discriminator', it's an - # ordinary union. - if not discriminator: - enum_define = None - - # Else if the value of member 'discriminator' is {}, it's an - # anonymous union. - elif discriminator == {}: + # If the union object has no member 'discriminator', it's a + # simple union. If 'discriminator' is {}, it is an anonymous union. + if not discriminator or discriminator == {}: enum_define = None # Else, it's a flat union. |