mirror of https://github.com/xemu-project/xemu.git
qapi: Better separate the different kinds of helpers
Insert comments to separate sections dealing with parsing, semantic analysis, code generation, and so forth. Move helpers to their proper section. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
4d076d67c2
commit
00e4b285a3
128
scripts/qapi.py
128
scripts/qapi.py
|
@ -65,6 +65,10 @@ union_types = []
|
||||||
events = []
|
events = []
|
||||||
all_names = {}
|
all_names = {}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parsing the schema into expressions
|
||||||
|
#
|
||||||
|
|
||||||
def error_path(parent):
|
def error_path(parent):
|
||||||
res = ""
|
res = ""
|
||||||
while parent:
|
while parent:
|
||||||
|
@ -296,6 +300,10 @@ class QAPISchema:
|
||||||
raise QAPISchemaError(self, 'Expected "{", "[" or string')
|
raise QAPISchemaError(self, 'Expected "{", "[" or string')
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
|
#
|
||||||
|
# Semantic analysis of schema expressions
|
||||||
|
#
|
||||||
|
|
||||||
def find_base_fields(base):
|
def find_base_fields(base):
|
||||||
base_struct_define = find_struct(base)
|
base_struct_define = find_struct(base)
|
||||||
if not base_struct_define:
|
if not base_struct_define:
|
||||||
|
@ -356,6 +364,60 @@ def check_name(expr_info, source, name, allow_optional = False,
|
||||||
raise QAPIExprError(expr_info,
|
raise QAPIExprError(expr_info,
|
||||||
"%s uses invalid name '%s'" % (source, name))
|
"%s uses invalid name '%s'" % (source, name))
|
||||||
|
|
||||||
|
def add_name(name, info, meta, implicit = False):
|
||||||
|
global all_names
|
||||||
|
check_name(info, "'%s'" % meta, name)
|
||||||
|
if name in all_names:
|
||||||
|
raise QAPIExprError(info,
|
||||||
|
"%s '%s' is already defined"
|
||||||
|
% (all_names[name], name))
|
||||||
|
if not implicit and name[-4:] == 'Kind':
|
||||||
|
raise QAPIExprError(info,
|
||||||
|
"%s '%s' should not end in 'Kind'"
|
||||||
|
% (meta, name))
|
||||||
|
all_names[name] = meta
|
||||||
|
|
||||||
|
def add_struct(definition, info):
|
||||||
|
global struct_types
|
||||||
|
name = definition['struct']
|
||||||
|
add_name(name, info, 'struct')
|
||||||
|
struct_types.append(definition)
|
||||||
|
|
||||||
|
def find_struct(name):
|
||||||
|
global struct_types
|
||||||
|
for struct in struct_types:
|
||||||
|
if struct['struct'] == name:
|
||||||
|
return struct
|
||||||
|
return None
|
||||||
|
|
||||||
|
def add_union(definition, info):
|
||||||
|
global union_types
|
||||||
|
name = definition['union']
|
||||||
|
add_name(name, info, 'union')
|
||||||
|
union_types.append(definition)
|
||||||
|
|
||||||
|
def find_union(name):
|
||||||
|
global union_types
|
||||||
|
for union in union_types:
|
||||||
|
if union['union'] == name:
|
||||||
|
return union
|
||||||
|
return None
|
||||||
|
|
||||||
|
def add_enum(name, info, enum_values = None, implicit = False):
|
||||||
|
global enum_types
|
||||||
|
add_name(name, info, 'enum', implicit)
|
||||||
|
enum_types.append({"enum_name": name, "enum_values": enum_values})
|
||||||
|
|
||||||
|
def find_enum(name):
|
||||||
|
global enum_types
|
||||||
|
for enum in enum_types:
|
||||||
|
if enum['enum_name'] == name:
|
||||||
|
return enum
|
||||||
|
return None
|
||||||
|
|
||||||
|
def is_enum(name):
|
||||||
|
return find_enum(name) != None
|
||||||
|
|
||||||
def check_type(expr_info, source, value, allow_array = False,
|
def check_type(expr_info, source, value, allow_array = False,
|
||||||
allow_dict = False, allow_optional = False,
|
allow_dict = False, allow_optional = False,
|
||||||
allow_star = False, allow_metas = []):
|
allow_star = False, allow_metas = []):
|
||||||
|
@ -700,6 +762,10 @@ def parse_schema(fname):
|
||||||
print >>sys.stderr, e
|
print >>sys.stderr, e
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Code generation helpers
|
||||||
|
#
|
||||||
|
|
||||||
def parse_args(typeinfo):
|
def parse_args(typeinfo):
|
||||||
if isinstance(typeinfo, str):
|
if isinstance(typeinfo, str):
|
||||||
struct = find_struct(typeinfo)
|
struct = find_struct(typeinfo)
|
||||||
|
@ -817,60 +883,6 @@ def type_name(value):
|
||||||
return value
|
return value
|
||||||
return c_name(value)
|
return c_name(value)
|
||||||
|
|
||||||
def add_name(name, info, meta, implicit = False):
|
|
||||||
global all_names
|
|
||||||
check_name(info, "'%s'" % meta, name)
|
|
||||||
if name in all_names:
|
|
||||||
raise QAPIExprError(info,
|
|
||||||
"%s '%s' is already defined"
|
|
||||||
% (all_names[name], name))
|
|
||||||
if not implicit and name[-4:] == 'Kind':
|
|
||||||
raise QAPIExprError(info,
|
|
||||||
"%s '%s' should not end in 'Kind'"
|
|
||||||
% (meta, name))
|
|
||||||
all_names[name] = meta
|
|
||||||
|
|
||||||
def add_struct(definition, info):
|
|
||||||
global struct_types
|
|
||||||
name = definition['struct']
|
|
||||||
add_name(name, info, 'struct')
|
|
||||||
struct_types.append(definition)
|
|
||||||
|
|
||||||
def find_struct(name):
|
|
||||||
global struct_types
|
|
||||||
for struct in struct_types:
|
|
||||||
if struct['struct'] == name:
|
|
||||||
return struct
|
|
||||||
return None
|
|
||||||
|
|
||||||
def add_union(definition, info):
|
|
||||||
global union_types
|
|
||||||
name = definition['union']
|
|
||||||
add_name(name, info, 'union')
|
|
||||||
union_types.append(definition)
|
|
||||||
|
|
||||||
def find_union(name):
|
|
||||||
global union_types
|
|
||||||
for union in union_types:
|
|
||||||
if union['union'] == name:
|
|
||||||
return union
|
|
||||||
return None
|
|
||||||
|
|
||||||
def add_enum(name, info, enum_values = None, implicit = False):
|
|
||||||
global enum_types
|
|
||||||
add_name(name, info, 'enum', implicit)
|
|
||||||
enum_types.append({"enum_name": name, "enum_values": enum_values})
|
|
||||||
|
|
||||||
def find_enum(name):
|
|
||||||
global enum_types
|
|
||||||
for enum in enum_types:
|
|
||||||
if enum['enum_name'] == name:
|
|
||||||
return enum
|
|
||||||
return None
|
|
||||||
|
|
||||||
def is_enum(name):
|
|
||||||
return find_enum(name) != None
|
|
||||||
|
|
||||||
eatspace = '\033EATSPACE.'
|
eatspace = '\033EATSPACE.'
|
||||||
pointer_suffix = ' *' + eatspace
|
pointer_suffix = ' *' + eatspace
|
||||||
|
|
||||||
|
@ -967,6 +979,10 @@ def guardend(name):
|
||||||
''',
|
''',
|
||||||
name=guardname(name))
|
name=guardname(name))
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common command line parsing
|
||||||
|
#
|
||||||
|
|
||||||
def parse_command_line(extra_options = "", extra_long_options = []):
|
def parse_command_line(extra_options = "", extra_long_options = []):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -1008,6 +1024,10 @@ def parse_command_line(extra_options = "", extra_long_options = []):
|
||||||
|
|
||||||
return (fname, output_dir, do_c, do_h, prefix, extra_opts)
|
return (fname, output_dir, do_c, do_h, prefix, extra_opts)
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generate output files with boilerplate
|
||||||
|
#
|
||||||
|
|
||||||
def open_output(output_dir, do_c, do_h, prefix, c_file, h_file,
|
def open_output(output_dir, do_c, do_h, prefix, c_file, h_file,
|
||||||
c_comment, h_comment):
|
c_comment, h_comment):
|
||||||
c_file = output_dir + prefix + c_file
|
c_file = output_dir + prefix + c_file
|
||||||
|
|
Loading…
Reference in New Issue