mirror of
https://github.com/qemu/qemu.git
synced 2024-11-27 05:43:47 +08:00
qapi: Simplify what gets stored in enum_types
Don't invent a new dictionary structure just for enum_types, simply store the defining expression, like we do for struct_types and union_types. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <1489582656-31133-41-git-send-email-armbru@redhat.com>
This commit is contained in:
parent
062e856b15
commit
eda43c6844
@ -668,16 +668,17 @@ def find_union(name):
|
||||
return None
|
||||
|
||||
|
||||
def add_enum(name, info, enum_values=None, implicit=False):
|
||||
def add_enum(definition, info):
|
||||
global enum_types
|
||||
add_name(name, info, 'enum', implicit)
|
||||
enum_types.append({'enum_name': name, 'enum_values': enum_values})
|
||||
name = definition['enum']
|
||||
add_name(name, info, 'enum', 'data' not in definition)
|
||||
enum_types.append(definition)
|
||||
|
||||
|
||||
def find_enum(name):
|
||||
global enum_types
|
||||
for enum in enum_types:
|
||||
if enum['enum_name'] == name:
|
||||
if enum['enum'] == name:
|
||||
return enum
|
||||
return None
|
||||
|
||||
@ -825,15 +826,15 @@ def check_union(expr, info):
|
||||
# If the discriminator names an enum type, then all members
|
||||
# of 'data' must also be members of the enum type.
|
||||
if enum_define:
|
||||
if key not in enum_define['enum_values']:
|
||||
if key not in enum_define['data']:
|
||||
raise QAPISemError(info,
|
||||
"Discriminator value '%s' is not found in "
|
||||
"enum '%s'"
|
||||
% (key, enum_define['enum_name']))
|
||||
% (key, enum_define['enum']))
|
||||
|
||||
# If discriminator is user-defined, ensure all values are covered
|
||||
if enum_define:
|
||||
for value in enum_define['enum_values']:
|
||||
for value in enum_define['data']:
|
||||
if value not in members.keys():
|
||||
raise QAPISemError(info, "Union '%s' data missing '%s' branch"
|
||||
% (name, value))
|
||||
@ -938,7 +939,7 @@ def check_exprs(exprs):
|
||||
if 'enum' in expr:
|
||||
name = expr['enum']
|
||||
check_keys(expr_elem, 'enum', ['data'], ['prefix'])
|
||||
add_enum(name, info, expr['data'])
|
||||
add_enum(expr, info)
|
||||
elif 'union' in expr:
|
||||
name = expr['union']
|
||||
check_keys(expr_elem, 'union', ['data'],
|
||||
@ -971,13 +972,13 @@ def check_exprs(exprs):
|
||||
# Try again for hidden UnionKind enum
|
||||
for expr_elem in exprs:
|
||||
expr = expr_elem['expr']
|
||||
if 'union' in expr:
|
||||
if not discriminator_find_enum_define(expr):
|
||||
add_enum('%sKind' % expr['union'], expr_elem['info'],
|
||||
implicit=True)
|
||||
if 'union' in expr and not discriminator_find_enum_define(expr):
|
||||
name = '%sKind' % expr['union']
|
||||
elif 'alternate' in expr:
|
||||
add_enum('%sKind' % expr['alternate'], expr_elem['info'],
|
||||
implicit=True)
|
||||
name = '%sKind' % expr['alternate']
|
||||
else:
|
||||
continue
|
||||
add_enum({ 'enum': name }, expr_elem['info'])
|
||||
|
||||
# Validate that exprs make sense
|
||||
for expr_elem in exprs:
|
||||
|
Loading…
Reference in New Issue
Block a user