aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/qapi-commands.py4
-rw-r--r--scripts/qapi-event.py4
-rw-r--r--scripts/qapi-types.py19
-rw-r--r--scripts/qapi-visit.py51
-rw-r--r--scripts/qapi.py20
-rwxr-xr-xscripts/qmp/qmp-shell23
6 files changed, 45 insertions, 76 deletions
diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index f831621843..f44e01f004 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -111,7 +111,7 @@ def gen_marshal_input_visit(arg_type, dealloc=False):
v = qmp_input_get_visitor(qiv);
''')
- ret += gen_visit_fields(arg_type.members, skiperr=dealloc)
+ ret += gen_visit_members(arg_type.members, skiperr=dealloc)
if dealloc:
ret += mcgen('''
@@ -175,7 +175,7 @@ def gen_marshal(name, arg_type, ret_type):
ret += gen_marshal_input_visit(arg_type)
ret += gen_call(name, arg_type, ret_type)
- # 'goto out' produced by gen_marshal_input_visit->gen_visit_fields()
+ # 'goto out' produced by gen_marshal_input_visit->gen_visit_members()
# for each arg_type member, and by gen_call() for ret_type
if (arg_type and arg_type.members) or ret_type:
ret += mcgen('''
diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
index 544ae1218d..fb579dd098 100644
--- a/scripts/qapi-event.py
+++ b/scripts/qapi-event.py
@@ -67,8 +67,8 @@ def gen_event_send(name, arg_type):
''',
name=name)
ret += gen_err_check()
- ret += gen_visit_fields(arg_type.members, need_cast=True,
- label='out_obj')
+ ret += gen_visit_members(arg_type.members, need_cast=True,
+ label='out_obj')
ret += mcgen('''
out_obj:
visit_end_struct(v, err ? NULL : &err);
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index eac90d2fe9..0306a884c3 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -38,7 +38,7 @@ struct %(c_name)s {
c_name=c_name(name), c_type=element_type.c_type())
-def gen_struct_fields(members):
+def gen_struct_members(members):
ret = ''
for memb in members:
if memb.optional:
@@ -77,22 +77,22 @@ struct %(c_name)s {
/* Members inherited from %(c_name)s: */
''',
c_name=base.c_name())
- ret += gen_struct_fields(base.members)
+ ret += gen_struct_members(base.members)
ret += mcgen('''
/* Own members: */
''')
- ret += gen_struct_fields(members)
+ ret += gen_struct_members(members)
if variants:
ret += gen_variants(variants)
- # Make sure that all structs have at least one field; this avoids
+ # Make sure that all structs have at least one member; this avoids
# potential issues with attempting to malloc space for zero-length
# structs in C, and also incompatibility with C++ (where an empty
# struct is size 1).
if not (base and base.members) and not members and not variants:
ret += mcgen('''
- char qapi_dummy_field_for_empty_struct;
+ char qapi_dummy_for_empty_struct;
''')
ret += mcgen('''
@@ -116,17 +116,8 @@ static inline %(base)s *qapi_%(c_name)s_base(const %(c_name)s *obj)
def gen_variants(variants):
- # FIXME: What purpose does data serve, besides preventing a union that
- # has a branch named 'data'? We use it in qapi-visit.py to decide
- # whether to bypass the switch statement if visiting the discriminator
- # failed; but since we 0-initialize structs, and cannot tell what
- # branch of the union is in use if the discriminator is invalid, there
- # should not be any data leaks even without a data pointer. Or, if
- # 'data' is merely added to guarantee we don't have an empty union,
- # shouldn't we enforce that at .json parse time?
ret = mcgen('''
union { /* union tag is @%(c_name)s */
- void *data;
''',
c_name=c_name(variants.tag_member.name))
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 2308268a62..a712e9af8a 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -15,10 +15,6 @@
from qapi import *
import re
-# visit_type_FOO_fields() is always emitted; track if a forward declaration
-# or implementation has already been output.
-struct_fields_seen = set()
-
def gen_visit_decl(name, scalar=False):
c_type = c_name(name) + ' *'
@@ -30,46 +26,32 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Error **
c_name=c_name(name), c_type=c_type)
-def gen_visit_fields_decl(typ):
- if typ.name in struct_fields_seen:
- return ''
- struct_fields_seen.add(typ.name)
+def gen_visit_members_decl(name):
return mcgen('''
-static void visit_type_%(c_type)s_fields(Visitor *v, %(c_type)s *obj, Error **errp);
+void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
''',
- c_type=typ.c_name())
+ c_name=c_name(name))
-def gen_visit_struct_fields(name, base, members, variants):
- ret = ''
+def gen_visit_object_members(name, base, members, variants):
+ ret = mcgen('''
- if base:
- ret += gen_visit_fields_decl(base)
- if variants:
- for var in variants.variants:
- # Ugly special case for simple union TODO get rid of it
- if not var.simple_union_type():
- ret += gen_visit_fields_decl(var.type)
-
- struct_fields_seen.add(name)
- ret += mcgen('''
-
-static void visit_type_%(c_name)s_fields(Visitor *v, %(c_name)s *obj, Error **errp)
+void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
{
Error *err = NULL;
''',
- c_name=c_name(name))
+ c_name=c_name(name))
if base:
ret += mcgen('''
- visit_type_%(c_type)s_fields(v, (%(c_type)s *)obj, &err);
+ visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, &err);
''',
c_type=base.c_name())
ret += gen_err_check()
- ret += gen_visit_fields(members, prefix='obj->')
+ ret += gen_visit_members(members, prefix='obj->')
if variants:
ret += mcgen('''
@@ -94,7 +76,7 @@ static void visit_type_%(c_name)s_fields(Visitor *v, %(c_name)s *obj, Error **er
c_name=c_name(var.name))
else:
ret += mcgen('''
- visit_type_%(c_type)s_fields(v, &obj->u.%(c_name)s, &err);
+ visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, &err);
''',
c_type=var.type.c_name(),
c_name=c_name(var.name))
@@ -108,7 +90,7 @@ static void visit_type_%(c_name)s_fields(Visitor *v, %(c_name)s *obj, Error **er
}
''')
- # 'goto out' produced for base, by gen_visit_fields() for each member,
+ # 'goto out' produced for base, by gen_visit_members() for each member,
# and if variants were present
if base or members or variants:
ret += mcgen('''
@@ -173,8 +155,6 @@ def gen_visit_alternate(name, variants):
for var in variants.variants:
if var.type.alternate_qtype() == 'QTYPE_QINT':
promote_int = 'false'
- if isinstance(var.type, QAPISchemaObjectType):
- ret += gen_visit_fields_decl(var.type)
ret += mcgen('''
@@ -202,7 +182,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
if (err) {
break;
}
- visit_type_%(c_type)s_fields(v, &(*obj)->u.%(c_name)s, &err);
+ visit_type_%(c_type)s_members(v, &(*obj)->u.%(c_name)s, &err);
error_propagate(errp, err);
err = NULL;
visit_end_struct(v, &err);
@@ -235,10 +215,10 @@ out:
def gen_visit_object(name, base, members, variants):
- ret = gen_visit_struct_fields(name, base, members, variants)
+ ret = gen_visit_object_members(name, base, members, variants)
# FIXME: if *obj is NULL on entry, and visit_start_struct() assigns to
- # *obj, but then visit_type_FOO_fields() fails, we should clean up *obj
+ # *obj, but then visit_type_FOO_members() fails, we should clean up *obj
# rather than leaving it non-NULL. As currently written, the caller must
# call qapi_free_FOO() to avoid a memory leak of the partial FOO.
ret += mcgen('''
@@ -254,7 +234,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
if (!*obj) {
goto out_obj;
}
- visit_type_%(c_name)s_fields(v, *obj, &err);
+ visit_type_%(c_name)s_members(v, *obj, &err);
error_propagate(errp, err);
err = NULL;
out_obj:
@@ -316,6 +296,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
self.defn += defn
def visit_object_type(self, name, info, base, members, variants):
+ self.decl += gen_visit_members_decl(name)
self.decl += gen_visit_decl(name)
self.defn += gen_visit_object(name, base, members, variants)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 18adca753d..6b2aa6e3df 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -326,7 +326,7 @@ class QAPISchemaParser(object):
#
-def find_base_fields(base):
+def find_base_members(base):
base_struct_define = find_struct(base)
if not base_struct_define:
return None
@@ -355,11 +355,11 @@ def discriminator_find_enum_define(expr):
if not (discriminator and base):
return None
- base_fields = find_base_fields(base)
- if not base_fields:
+ base_members = find_base_members(base)
+ if not base_members:
return None
- discriminator_type = base_fields.get(discriminator)
+ discriminator_type = base_members.get(discriminator)
if not discriminator_type:
return None
@@ -567,14 +567,14 @@ def check_union(expr, expr_info):
raise QAPIExprError(expr_info,
"Flat union '%s' must have a base"
% name)
- base_fields = find_base_fields(base)
- assert base_fields
+ base_members = find_base_members(base)
+ assert base_members
# The value of member 'discriminator' must name a non-optional
# member of the base struct.
check_name(expr_info, "Discriminator of flat union '%s'" % name,
discriminator)
- discriminator_type = base_fields.get(discriminator)
+ discriminator_type = base_members.get(discriminator)
if not discriminator_type:
raise QAPIExprError(expr_info,
"Discriminator '%s' is not a member of base "
@@ -969,7 +969,7 @@ class QAPISchemaObjectType(QAPISchemaType):
assert self.variants.tag_member in self.members
self.variants.check_clash(schema, self.info, seen)
- # Check that the members of this type do not cause duplicate JSON fields,
+ # Check that the members of this type do not cause duplicate JSON members,
# and update seen to track the members seen so far. Report any errors
# on behalf of info, which is not necessarily self.info
def check_clash(self, schema, info, seen):
@@ -1647,8 +1647,8 @@ def gen_err_check(label='out', skiperr=False):
label=label)
-def gen_visit_fields(members, prefix='', need_cast=False, skiperr=False,
- label='out'):
+def gen_visit_members(members, prefix='', need_cast=False, skiperr=False,
+ label='out'):
ret = ''
if skiperr:
errparg = 'NULL'
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index 7a402edf2a..0373b24b20 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -70,7 +70,6 @@ import json
import ast
import readline
import sys
-import pprint
class QMPCompleter(list):
def complete(self, text, state):
@@ -103,11 +102,11 @@ class FuzzyJSON(ast.NodeTransformer):
# TODO: QMPShell's interface is a bit ugly (eg. _fill_completion() and
# _execute_cmd()). Let's design a better one.
class QMPShell(qmp.QEMUMonitorProtocol):
- def __init__(self, address, pp=None):
+ def __init__(self, address, pretty=False):
qmp.QEMUMonitorProtocol.__init__(self, self.__get_address(address))
self._greeting = None
self._completer = None
- self._pp = pp
+ self._pretty = pretty
self._transmode = False
self._actions = list()
@@ -231,11 +230,11 @@ class QMPShell(qmp.QEMUMonitorProtocol):
return qmpcmd
def _print(self, qmp):
- jsobj = json.dumps(qmp)
- if self._pp is not None:
- self._pp.pprint(jsobj)
- else:
- print str(jsobj)
+ indent = None
+ if self._pretty:
+ indent = 4
+ jsobj = json.dumps(qmp, indent=indent)
+ print str(jsobj)
def _execute_cmd(self, cmdline):
try:
@@ -377,7 +376,7 @@ def main():
addr = ''
qemu = None
hmp = False
- pp = None
+ pretty = False
verbose = False
try:
@@ -387,9 +386,7 @@ def main():
fail_cmdline(arg)
hmp = True
elif arg == "-p":
- if pp is not None:
- fail_cmdline(arg)
- pp = pprint.PrettyPrinter(indent=4)
+ pretty = True
elif arg == "-v":
verbose = True
else:
@@ -398,7 +395,7 @@ def main():
if hmp:
qemu = HMPShell(arg)
else:
- qemu = QMPShell(arg, pp)
+ qemu = QMPShell(arg, pretty)
addr = arg
if qemu is None: