Commit 8ee06f61 authored by Marc-André Lureau's avatar Marc-André Lureau Committed by Markus Armbruster
Browse files

qapi: Add #if conditions to generated code members



Wrap generated enum and struct members and their supporting code with
#if/#endif, using the .ifcond members added in the previous patches.

We do enum and struct in a single patch because union tag enum and the
associated variants tie them together, and dealing with that to split
the patch doesn't seem worthwhile.

Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
Message-Id: <20181213123724.4866-18-marcandre.lureau@redhat.com>
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent 3e270dca
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2078,11 +2078,13 @@ const QEnumLookup %(c_name)s_lookup = {
''',
                c_name=c_name(name))
    for m in members:
        ret += gen_if(m.ifcond)
        index = c_enum_const(name, m.name, prefix)
        ret += mcgen('''
        [%(index)s] = "%(name)s",
''',
                     index=index, name=m.name)
        ret += gen_endif(m.ifcond)

    ret += mcgen('''
    },
@@ -2104,10 +2106,12 @@ typedef enum %(c_name)s {
                c_name=c_name(name))

    for m in enum_members:
        ret += gen_if(m.ifcond)
        ret += mcgen('''
    %(c_enum)s,
''',
                     c_enum=c_enum_const(name, m.name, prefix))
        ret += gen_endif(m.ifcond)

    ret += mcgen('''
} %(c_name)s;
+10 −4
Original line number Diff line number Diff line
@@ -162,6 +162,8 @@ const QLitObject %(c_name)s = %(c_string)s;
        ret = {'name': member.name, 'type': self._use_type(member.type)}
        if member.optional:
            ret['default'] = None
        if member.ifcond:
            ret = (ret, {'if': member.ifcond})
        return ret

    def _gen_variants(self, tag_name, variants):
@@ -169,14 +171,17 @@ const QLitObject %(c_name)s = %(c_string)s;
                'variants': [self._gen_variant(v) for v in variants]}

    def _gen_variant(self, variant):
        return {'case': variant.name, 'type': self._use_type(variant.type)}
        return ({'case': variant.name, 'type': self._use_type(variant.type)},
                {'if': variant.ifcond})

    def visit_builtin_type(self, name, info, json_type):
        self._gen_qlit(name, 'builtin', {'json-type': json_type}, [])

    def visit_enum_type(self, name, info, ifcond, members, prefix):
        self._gen_qlit(name, 'enum',
                       {'values': [m.name for m in members]}, ifcond)
                       {'values':
                        [(m.name, {'if': m.ifcond}) for m in members]},
                       ifcond)

    def visit_array_type(self, name, info, ifcond, element_type):
        element = self._use_type(element_type)
@@ -192,7 +197,8 @@ const QLitObject %(c_name)s = %(c_string)s;

    def visit_alternate_type(self, name, info, ifcond, variants):
        self._gen_qlit(name, 'alternate',
                       {'members': [{'type': self._use_type(m.type)}
                       {'members': [
                           ({'type': self._use_type(m.type)}, {'if': m.ifcond})
                           for m in variants.variants]}, ifcond)

    def visit_command(self, name, info, ifcond, arg_type, ret_type, gen,
+4 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ struct %(c_name)s {
def gen_struct_members(members):
    ret = ''
    for memb in members:
        ret += gen_if(memb.ifcond)
        if memb.optional:
            ret += mcgen('''
    bool has_%(c_name)s;
@@ -52,6 +53,7 @@ def gen_struct_members(members):
    %(c_type)s %(c_name)s;
''',
                     c_type=memb.type.c_type(), c_name=c_name(memb.name))
        ret += gen_endif(memb.ifcond)
    return ret


@@ -131,11 +133,13 @@ def gen_variants(variants):
    for var in variants.variants:
        if var.type.name == 'q_empty':
            continue
        ret += gen_if(var.ifcond)
        ret += mcgen('''
        %(c_type)s %(c_name)s;
''',
                     c_type=var.type.c_unboxed_type(),
                     c_name=c_name(var.name))
        ret += gen_endif(var.ifcond)

    ret += mcgen('''
    } u;
+6 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
                     c_type=base.c_name())

    for memb in members:
        ret += gen_if(memb.ifcond)
        if memb.optional:
            ret += mcgen('''
    if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
@@ -73,6 +74,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
            ret += mcgen('''
    }
''')
        ret += gen_endif(memb.ifcond)

    if variants:
        ret += mcgen('''
@@ -84,6 +86,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
            case_str = c_enum_const(variants.tag_member.type.name,
                                    var.name,
                                    variants.tag_member.type.prefix)
            ret += gen_if(var.ifcond)
            if var.type.name == 'q_empty':
                # valid variant and nothing to do
                ret += mcgen('''
@@ -100,6 +103,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
                             case=case_str,
                             c_type=var.type.c_name(), c_name=c_name(var.name))

            ret += gen_endif(var.ifcond)
        ret += mcgen('''
    default:
        abort();
@@ -190,6 +194,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
                c_name=c_name(name))

    for var in variants.variants:
        ret += gen_if(var.ifcond)
        ret += mcgen('''
    case %(case)s:
''',
@@ -217,6 +222,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
        ret += mcgen('''
        break;
''')
        ret += gen_endif(var.ifcond)

    ret += mcgen('''
    case QTYPE_NONE: