qapi: Move gen_enum(), gen_enum_lookup() back to qapi/types.py
The next commit will split up qapi/common.py. gen_enum() needs QAPISchemaEnumMember, and that's in the way. Move it to qapi/types.py along with its buddy gen_enum_lookup(). Permit me a short a digression on history: how did gen_enum() end up in qapi/common.py? Commit21cd70dfc1
"qapi script: add event support" duplicated qapi-types.py's gen_enum() and gen_enum_lookup() in qapi-event.py. Simply importing them would have been cleaner, but wasn't possible as qapi-types.py was a program, not a module. Commitefd2eaa6c2
"qapi: De-duplicate enum code generation" de-duplicated by moving them to qapi.py, which was a module. Since then, program qapi-types.py has morphed into module types.py. It's where gen_enum() and gen_enum_lookup() started, and where they belong. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20191018074345.24034-6-armbru@redhat.com>
This commit is contained in:
parent
f01338cce6
commit
61bfb2e1a4
|
@ -2239,65 +2239,6 @@ def _wrap_ifcond(ifcond, before, after):
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
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 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('''
|
|
||||||
},
|
|
||||||
.size = %(max_index)s
|
|
||||||
};
|
|
||||||
''',
|
|
||||||
max_index=c_enum_const(name, '_MAX', prefix))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def gen_enum(name, members, prefix=None):
|
|
||||||
# append automatically generated _MAX value
|
|
||||||
enum_members = members + [QAPISchemaEnumMember('_MAX', None)]
|
|
||||||
|
|
||||||
ret = mcgen('''
|
|
||||||
|
|
||||||
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;
|
|
||||||
''',
|
|
||||||
c_name=c_name(name))
|
|
||||||
|
|
||||||
ret += mcgen('''
|
|
||||||
|
|
||||||
#define %(c_name)s_str(val) \\
|
|
||||||
qapi_enum_lookup(&%(c_name)s_lookup, (val))
|
|
||||||
|
|
||||||
extern const QEnumLookup %(c_name)s_lookup;
|
|
||||||
''',
|
|
||||||
c_name=c_name(name))
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def build_params(arg_type, boxed, extra=None):
|
def build_params(arg_type, boxed, extra=None):
|
||||||
ret = ''
|
ret = ''
|
||||||
sep = ''
|
sep = ''
|
||||||
|
|
|
@ -13,6 +13,7 @@ See the COPYING file in the top-level directory.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from qapi.common import *
|
from qapi.common import *
|
||||||
|
from qapi.types import gen_enum, gen_enum_lookup
|
||||||
|
|
||||||
|
|
||||||
def build_event_send_proto(name, arg_type, boxed):
|
def build_event_send_proto(name, arg_type, boxed):
|
||||||
|
|
|
@ -21,6 +21,65 @@ from qapi.common import *
|
||||||
objects_seen = set()
|
objects_seen = set()
|
||||||
|
|
||||||
|
|
||||||
|
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 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('''
|
||||||
|
},
|
||||||
|
.size = %(max_index)s
|
||||||
|
};
|
||||||
|
''',
|
||||||
|
max_index=c_enum_const(name, '_MAX', prefix))
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def gen_enum(name, members, prefix=None):
|
||||||
|
# append automatically generated _MAX value
|
||||||
|
enum_members = members + [QAPISchemaEnumMember('_MAX', None)]
|
||||||
|
|
||||||
|
ret = mcgen('''
|
||||||
|
|
||||||
|
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;
|
||||||
|
''',
|
||||||
|
c_name=c_name(name))
|
||||||
|
|
||||||
|
ret += mcgen('''
|
||||||
|
|
||||||
|
#define %(c_name)s_str(val) \\
|
||||||
|
qapi_enum_lookup(&%(c_name)s_lookup, (val))
|
||||||
|
|
||||||
|
extern const QEnumLookup %(c_name)s_lookup;
|
||||||
|
''',
|
||||||
|
c_name=c_name(name))
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def gen_fwd_object_or_array(name):
|
def gen_fwd_object_or_array(name):
|
||||||
return mcgen('''
|
return mcgen('''
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue