mirror of https://github.com/xemu-project/xemu.git
qapi script: use same function to generate enum string
Prior to this patch, qapi-visit.py used custom code to generate enum names used for handling a qapi union. Fix it to instead reuse common code, with identical generated results, and allowing future updates to generation to only need to touch one place. Signed-off-by: Wenchao Xia <wenchaoqemu@gmail.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
6299659f54
commit
b0b58195e4
|
@ -144,11 +144,11 @@ typedef enum %(name)s
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
for value in enum_values:
|
for value in enum_values:
|
||||||
|
enum_full_value = generate_enum_full_value(name, value)
|
||||||
enum_decl += mcgen('''
|
enum_decl += mcgen('''
|
||||||
%(abbrev)s_%(value)s = %(i)d,
|
%(enum_full_value)s = %(i)d,
|
||||||
''',
|
''',
|
||||||
abbrev=de_camel_case(name).upper(),
|
enum_full_value = enum_full_value,
|
||||||
value=generate_enum_name(value),
|
|
||||||
i=i)
|
i=i)
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
|
|
@ -214,18 +214,22 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
|
||||||
''',
|
''',
|
||||||
name=name)
|
name=name)
|
||||||
|
|
||||||
|
# For anon union, always use the default enum type automatically generated
|
||||||
|
# as "'%sKind' % (name)"
|
||||||
|
disc_type = '%sKind' % (name)
|
||||||
|
|
||||||
for key in members:
|
for key in members:
|
||||||
assert (members[key] in builtin_types
|
assert (members[key] in builtin_types
|
||||||
or find_struct(members[key])
|
or find_struct(members[key])
|
||||||
or find_union(members[key])), "Invalid anonymous union member"
|
or find_union(members[key])), "Invalid anonymous union member"
|
||||||
|
|
||||||
|
enum_full_value = generate_enum_full_value(disc_type, key)
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
case %(abbrev)s_KIND_%(enum)s:
|
case %(enum_full_value)s:
|
||||||
visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, name, &err);
|
visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, name, &err);
|
||||||
break;
|
break;
|
||||||
''',
|
''',
|
||||||
abbrev = de_camel_case(name).upper(),
|
enum_full_value = enum_full_value,
|
||||||
enum = c_fun(de_camel_case(key),False).upper(),
|
|
||||||
c_type = type_name(members[key]),
|
c_type = type_name(members[key]),
|
||||||
c_name = c_fun(key))
|
c_name = c_fun(key))
|
||||||
|
|
||||||
|
@ -255,7 +259,10 @@ def generate_visit_union(expr):
|
||||||
assert not base
|
assert not base
|
||||||
return generate_visit_anon_union(name, members)
|
return generate_visit_anon_union(name, members)
|
||||||
|
|
||||||
|
# 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())
|
ret = generate_visit_enum('%sKind' % name, members.keys())
|
||||||
|
disc_type = '%sKind' % (name)
|
||||||
|
|
||||||
if base:
|
if base:
|
||||||
base_fields = find_struct(base)['data']
|
base_fields = find_struct(base)['data']
|
||||||
|
@ -313,13 +320,13 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
|
||||||
visit_end_implicit_struct(m, &err);
|
visit_end_implicit_struct(m, &err);
|
||||||
}'''
|
}'''
|
||||||
|
|
||||||
|
enum_full_value = generate_enum_full_value(disc_type, key)
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
case %(abbrev)s_KIND_%(enum)s:
|
case %(enum_full_value)s:
|
||||||
''' + fmt + '''
|
''' + fmt + '''
|
||||||
break;
|
break;
|
||||||
''',
|
''',
|
||||||
abbrev = de_camel_case(name).upper(),
|
enum_full_value = enum_full_value,
|
||||||
enum = c_fun(de_camel_case(key),False).upper(),
|
|
||||||
c_type=type_name(members[key]),
|
c_type=type_name(members[key]),
|
||||||
c_name=c_fun(key))
|
c_name=c_fun(key))
|
||||||
|
|
||||||
|
|
|
@ -468,12 +468,17 @@ def guardend(name):
|
||||||
''',
|
''',
|
||||||
name=guardname(name))
|
name=guardname(name))
|
||||||
|
|
||||||
def generate_enum_name(name):
|
def _generate_enum_value_string(value):
|
||||||
if name.isupper():
|
if value.isupper():
|
||||||
return c_fun(name, False)
|
return c_fun(value, False)
|
||||||
new_name = ''
|
new_name = ''
|
||||||
for c in c_fun(name, False):
|
for c in c_fun(value, False):
|
||||||
if c.isupper():
|
if c.isupper():
|
||||||
new_name += '_'
|
new_name += '_'
|
||||||
new_name += c
|
new_name += c
|
||||||
return new_name.lstrip('_').upper()
|
return new_name.lstrip('_').upper()
|
||||||
|
|
||||||
|
def generate_enum_full_value(enum_name, enum_value):
|
||||||
|
abbrev_string = de_camel_case(enum_name).upper()
|
||||||
|
value_string = _generate_enum_value_string(enum_value)
|
||||||
|
return "%s_%s" % (abbrev_string, value_string)
|
||||||
|
|
Loading…
Reference in New Issue