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

qapi: change enum visitor and gen_enum* to take QAPISchemaMember



This will allow to add and access more properties associated with enum
values/members, like the associated 'if' condition. We may want to
have a specialized type QAPISchemaEnumMember, for now this will do.

Modify gen_enum() and gen_enum_lookup() for the same reason.

Suggested-by: default avatarMarkus Armbruster <armbru@redhat.com>
Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
Message-Id: <20181213123724.4866-3-marcandre.lureau@redhat.com>
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent 9c2f56e9
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -1063,7 +1063,7 @@ class QAPISchemaVisitor(object):
    def visit_builtin_type(self, name, info, json_type):
        pass

    def visit_enum_type(self, name, info, ifcond, values, prefix):
    def visit_enum_type(self, name, info, ifcond, members, prefix):
        pass

    def visit_array_type(self, name, info, ifcond, element_type):
@@ -1193,7 +1193,7 @@ class QAPISchemaEnumType(QAPISchemaType):

    def visit(self, visitor):
        visitor.visit_enum_type(self.name, self.info, self.ifcond,
                                self.member_names(), self.prefix)
                                self.members, self.prefix)


class QAPISchemaArrayType(QAPISchemaType):
@@ -2012,19 +2012,19 @@ def _wrap_ifcond(ifcond, before, after):
    return out


def gen_enum_lookup(name, values, prefix=None):
def gen_enum_lookup(name, members, prefix=None):
    ret = mcgen('''

const QEnumLookup %(c_name)s_lookup = {
    .array = (const char *const[]) {
''',
                c_name=c_name(name))
    for value in values:
        index = c_enum_const(name, value, prefix)
    for m in members:
        index = c_enum_const(name, m.name, prefix)
        ret += mcgen('''
        [%(index)s] = "%(value)s",
        [%(index)s] = "%(name)s",
''',
                     index=index, value=value)
                     index=index, name=m.name)

    ret += mcgen('''
    },
@@ -2035,9 +2035,9 @@ const QEnumLookup %(c_name)s_lookup = {
    return ret


def gen_enum(name, values, prefix=None):
def gen_enum(name, members, prefix=None):
    # append automatically generated _MAX value
    enum_values = values + ['_MAX']
    enum_members = members + [QAPISchemaMember('_MAX')]

    ret = mcgen('''

@@ -2045,11 +2045,11 @@ typedef enum %(c_name)s {
''',
                c_name=c_name(name))

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

    ret += mcgen('''
} %(c_name)s;
+1 −1
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ class QAPISchemaGenDocVisitor(qapi.common.QAPISchemaVisitor):
    def write(self, output_dir):
        self._gen.write(output_dir, self._prefix + 'qapi-doc.texi')

    def visit_enum_type(self, name, info, ifcond, values, prefix):
    def visit_enum_type(self, name, info, ifcond, members, prefix):
        doc = self.cur_doc
        self._gen.add(TYPE_FMT(type='Enum',
                               name=doc.symbol,
+7 −6
Original line number Diff line number Diff line
@@ -143,8 +143,8 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
        QAPISchemaModularCVisitor.__init__(
            self, prefix, 'qapi-events',
            ' * Schema-defined QAPI/QMP events', __doc__)
        self._enum_name = c_name(prefix + 'QAPIEvent', protect=False)
        self._event_names = []
        self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
        self._event_enum_members = []

    def _begin_module(self, name):
        types = self._module_basename('qapi-types', name)
@@ -170,15 +170,16 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):

    def visit_end(self):
        (genc, genh) = self._module[self._main_module]
        genh.add(gen_enum(self._enum_name, self._event_names))
        genc.add(gen_enum_lookup(self._enum_name, self._event_names))
        genh.add(gen_enum(self._event_enum_name, self._event_enum_members))
        genc.add(gen_enum_lookup(self._event_enum_name,
                                 self._event_enum_members))

    def visit_event(self, name, info, ifcond, arg_type, boxed):
        with ifcontext(ifcond, self._genh, self._genc):
            self._genh.add(gen_event_send_decl(name, arg_type, boxed))
            self._genc.add(gen_event_send(name, arg_type, boxed,
                                          self._enum_name))
        self._event_names.append(name)
                                          self._event_enum_name))
        self._event_enum_members.append(QAPISchemaMember(name))


def gen_events(schema, output_dir, prefix):
+3 −2
Original line number Diff line number Diff line
@@ -174,8 +174,9 @@ const QLitObject %(c_name)s = %(c_string)s;
    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, values, prefix):
        self._gen_qlit(name, 'enum', {'values': values}, ifcond)
    def visit_enum_type(self, name, info, ifcond, members, prefix):
        self._gen_qlit(name, 'enum',
                       {'values': [m.name for m in members]}, ifcond)

    def visit_array_type(self, name, info, ifcond, element_type):
        element = self._use_type(element_type)
+3 −3
Original line number Diff line number Diff line
@@ -212,10 +212,10 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
        self._genh.add(gen_type_cleanup_decl(name))
        self._genc.add(gen_type_cleanup(name))

    def visit_enum_type(self, name, info, ifcond, values, prefix):
    def visit_enum_type(self, name, info, ifcond, members, prefix):
        with ifcontext(ifcond, self._genh, self._genc):
            self._genh.preamble_add(gen_enum(name, values, prefix))
            self._genc.add(gen_enum_lookup(name, values, prefix))
            self._genh.preamble_add(gen_enum(name, members, prefix))
            self._genc.add(gen_enum_lookup(name, members, prefix))

    def visit_array_type(self, name, info, ifcond, element_type):
        with ifcontext(ifcond, self._genh, self._genc):
Loading