Commit b0b58195 authored by Wenchao Xia's avatar Wenchao Xia Committed by Luiz Capitulino
Browse files

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: default avatarWenchao Xia <wenchaoqemu@gmail.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
parent 6299659f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -144,11 +144,11 @@ typedef enum %(name)s

    i = 0
    for value in enum_values:
        enum_full_value = generate_enum_full_value(name, value)
        enum_decl += mcgen('''
    %(abbrev)s_%(value)s = %(i)d,
    %(enum_full_value)s = %(i)d,
''',
                     abbrev=de_camel_case(name).upper(),
                     value=generate_enum_name(value),
                     enum_full_value = enum_full_value,
                     i=i)
        i += 1

+13 −6
Original line number Diff line number Diff line
@@ -214,18 +214,22 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
''',
    name=name)

    # For anon union, always use the default enum type automatically generated
    # as "'%sKind' % (name)"
    disc_type = '%sKind' % (name)

    for key in members:
        assert (members[key] in builtin_types
            or find_struct(members[key])
            or find_union(members[key])), "Invalid anonymous union member"

        enum_full_value = generate_enum_full_value(disc_type, key)
        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);
            break;
''',
                abbrev = de_camel_case(name).upper(),
                enum = c_fun(de_camel_case(key),False).upper(),
                enum_full_value = enum_full_value,
                c_type = type_name(members[key]),
                c_name = c_fun(key))

@@ -255,7 +259,10 @@ def generate_visit_union(expr):
        assert not base
        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())
    disc_type = '%sKind' % (name)

    if base:
        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);
                }'''

        enum_full_value = generate_enum_full_value(disc_type, key)
        ret += mcgen('''
            case %(abbrev)s_KIND_%(enum)s:
            case %(enum_full_value)s:
                ''' + fmt + '''
                break;
''',
                abbrev = de_camel_case(name).upper(),
                enum = c_fun(de_camel_case(key),False).upper(),
                enum_full_value = enum_full_value,
                c_type=type_name(members[key]),
                c_name=c_fun(key))

+9 −4
Original line number Diff line number Diff line
@@ -468,12 +468,17 @@ def guardend(name):
''',
                 name=guardname(name))

def generate_enum_name(name):
    if name.isupper():
        return c_fun(name, False)
def _generate_enum_value_string(value):
    if value.isupper():
        return c_fun(value, False)
    new_name = ''
    for c in c_fun(name, False):
    for c in c_fun(value, False):
        if c.isupper():
            new_name += '_'
        new_name += c
    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)