QAPI patches for 2020-03-05
-----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAl5g86cSHGFybWJydUBy ZWRoYXQuY29tAAoJEDhwtADrkYZTmKMP/R9d9Ce+UUuirtfKpwgcsNTsv3p+5QzC ZjkrIfPOiUr3ep6J4TW3NwWiarDlaoz2OM6fvCr4y8Iv4dQi8cNFqWxAOrvFPH+J c0YVR3RqIT3mQdYF+ad6AqpBy9e1Ggr0le9YsFMu1Hyy/wjAxVcik+d2qdQCHt0l px2w9HRUjmbmRzItMqXzj0pC65K2HEcA8I3FxhxPeali+feMf9uHLwLCLBoqgUjj k7mFR09j1IcPc04tV9n2p9ZDA9hqxofec+JTDvPP/7nFZD2X9JAxKyAJuphvEWEE +y6K7P5hyDBs0kN6jb4QgPMYe75TNEBPPCEPbl4LwWM0QBw3y2MRAFbRfnVPbWNw pFFnGGYHXdThW0I2/abtS2qOTz9KbYSCDN2/nl/PbXdyf+JmjB9mfwH2H1BmoBnM x+Ci1CstcUJXW9rk7NJLZ89O2r2abJjf5U7wRzQo7Jk2Wil1ACsiACyv99ttucJi 3UVfsKPLRxhcbIg9oP6EBmtEdjC7QQwSWzcb1sy12XEgicIjbH2UyPNABux/Vtu5 Yre4dOpnMPwCq8oBjczNyhnHijG1y+FSXqYiT3ShrvbhMxAMraPnUsmV5cXCLcTb nz/0bb8LFx0FV2WRFAP/O7vBsi2hXnWlRvuzj3QxPcFbf5xhsFz0LdPzlblxYIbJ czc83nVcdaVF =7P1K -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2020-03-05' into staging QAPI patches for 2020-03-05 # gpg: Signature made Thu 05 Mar 2020 12:42:15 GMT # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full] # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-qapi-2020-03-05: qapi: Brush off some (py)lint qapi: Use super() now we have Python 3 qapi: Drop conditionals for Python 2 qapi: Inheriting from object is pointless with Python 3, drop Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
af4378c39e
|
@ -237,8 +237,8 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds)
|
||||||
class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
||||||
|
|
||||||
def __init__(self, prefix):
|
def __init__(self, prefix):
|
||||||
QAPISchemaModularCVisitor.__init__(
|
super().__init__(
|
||||||
self, prefix, 'qapi-commands',
|
prefix, 'qapi-commands',
|
||||||
' * Schema-defined QAPI/QMP commands', None, __doc__)
|
' * Schema-defined QAPI/QMP commands', None, __doc__)
|
||||||
self._regy = QAPIGenCCode(None)
|
self._regy = QAPIGenCCode(None)
|
||||||
self._visited_ret_types = {}
|
self._visited_ret_types = {}
|
||||||
|
@ -274,7 +274,7 @@ class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
|
||||||
|
|
||||||
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
|
void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
|
||||||
''',
|
''',
|
||||||
c_prefix=c_name(self._prefix, protect=False)))
|
c_prefix=c_name(self._prefix, protect=False)))
|
||||||
self._genc.preamble_add(mcgen('''
|
self._genc.preamble_add(mcgen('''
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "%(prefix)sqapi-commands.h"
|
#include "%(prefix)sqapi-commands.h"
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
# See the COPYING file in the top-level directory.
|
# See the COPYING file in the top-level directory.
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import string
|
|
||||||
|
|
||||||
|
|
||||||
# ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
|
# ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1
|
||||||
|
@ -43,10 +42,7 @@ def c_enum_const(type_name, const_name, prefix=None):
|
||||||
return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper()
|
return camel_to_upper(type_name) + '_' + c_name(const_name, False).upper()
|
||||||
|
|
||||||
|
|
||||||
if hasattr(str, 'maketrans'):
|
c_name_trans = str.maketrans('.-', '__')
|
||||||
c_name_trans = str.maketrans('.-', '__')
|
|
||||||
else:
|
|
||||||
c_name_trans = string.maketrans('.-', '__')
|
|
||||||
|
|
||||||
|
|
||||||
# Map @name to a valid C identifier.
|
# Map @name to a valid C identifier.
|
||||||
|
|
|
@ -35,9 +35,9 @@ class QAPIParseError(QAPIError):
|
||||||
col = (col + 7) % 8 + 1
|
col = (col + 7) % 8 + 1
|
||||||
else:
|
else:
|
||||||
col += 1
|
col += 1
|
||||||
QAPIError.__init__(self, parser.info, col, msg)
|
super().__init__(parser.info, col, msg)
|
||||||
|
|
||||||
|
|
||||||
class QAPISemError(QAPIError):
|
class QAPISemError(QAPIError):
|
||||||
def __init__(self, info, msg):
|
def __init__(self, info, msg):
|
||||||
QAPIError.__init__(self, info, None, msg)
|
super().__init__(info, None, msg)
|
||||||
|
|
|
@ -138,8 +138,8 @@ def gen_event_send(name, arg_type, boxed, event_enum_name, event_emit):
|
||||||
class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
|
class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
|
||||||
|
|
||||||
def __init__(self, prefix):
|
def __init__(self, prefix):
|
||||||
QAPISchemaModularCVisitor.__init__(
|
super().__init__(
|
||||||
self, prefix, 'qapi-events',
|
prefix, 'qapi-events',
|
||||||
' * Schema-defined QAPI/QMP events', None, __doc__)
|
' * Schema-defined QAPI/QMP events', None, __doc__)
|
||||||
self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
|
self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
|
||||||
self._event_enum_members = []
|
self._event_enum_members = []
|
||||||
|
|
|
@ -35,7 +35,6 @@ def check_name_is_str(name, info, source):
|
||||||
def check_name_str(name, info, source,
|
def check_name_str(name, info, source,
|
||||||
allow_optional=False, enum_member=False,
|
allow_optional=False, enum_member=False,
|
||||||
permit_upper=False):
|
permit_upper=False):
|
||||||
global valid_name
|
|
||||||
membername = name
|
membername = name
|
||||||
|
|
||||||
if allow_optional and name.startswith('*'):
|
if allow_optional and name.startswith('*'):
|
||||||
|
@ -249,7 +248,7 @@ def check_union(expr, info):
|
||||||
def check_alternate(expr, info):
|
def check_alternate(expr, info):
|
||||||
members = expr['data']
|
members = expr['data']
|
||||||
|
|
||||||
if len(members) == 0:
|
if not members:
|
||||||
raise QAPISemError(info, "'data' must not be empty")
|
raise QAPISemError(info, "'data' must not be empty")
|
||||||
for (key, value) in members.items():
|
for (key, value) in members.items():
|
||||||
source = "'data' member '%s'" % key
|
source = "'data' member '%s'" % key
|
||||||
|
|
|
@ -15,14 +15,13 @@
|
||||||
import errno
|
import errno
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from qapi.common import *
|
from qapi.common import *
|
||||||
from qapi.schema import QAPISchemaVisitor
|
from qapi.schema import QAPISchemaVisitor
|
||||||
|
|
||||||
|
|
||||||
class QAPIGen(object):
|
class QAPIGen:
|
||||||
|
|
||||||
def __init__(self, fname):
|
def __init__(self, fname):
|
||||||
self.fname = fname
|
self.fname = fname
|
||||||
|
@ -46,18 +45,15 @@ class QAPIGen(object):
|
||||||
|
|
||||||
def write(self, output_dir):
|
def write(self, output_dir):
|
||||||
pathname = os.path.join(output_dir, self.fname)
|
pathname = os.path.join(output_dir, self.fname)
|
||||||
dir = os.path.dirname(pathname)
|
odir = os.path.dirname(pathname)
|
||||||
if dir:
|
if odir:
|
||||||
try:
|
try:
|
||||||
os.makedirs(dir)
|
os.makedirs(odir)
|
||||||
except os.error as e:
|
except os.error as e:
|
||||||
if e.errno != errno.EEXIST:
|
if e.errno != errno.EEXIST:
|
||||||
raise
|
raise
|
||||||
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
|
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
|
||||||
if sys.version_info[0] >= 3:
|
f = open(fd, 'r+', encoding='utf-8')
|
||||||
f = open(fd, 'r+', encoding='utf-8')
|
|
||||||
else:
|
|
||||||
f = os.fdopen(fd, 'r+')
|
|
||||||
text = self.get_content()
|
text = self.get_content()
|
||||||
oldtext = f.read(len(text) + 1)
|
oldtext = f.read(len(text) + 1)
|
||||||
if text != oldtext:
|
if text != oldtext:
|
||||||
|
@ -86,7 +82,7 @@ def _wrap_ifcond(ifcond, before, after):
|
||||||
class QAPIGenCCode(QAPIGen):
|
class QAPIGenCCode(QAPIGen):
|
||||||
|
|
||||||
def __init__(self, fname):
|
def __init__(self, fname):
|
||||||
QAPIGen.__init__(self, fname)
|
super().__init__(fname)
|
||||||
self._start_if = None
|
self._start_if = None
|
||||||
|
|
||||||
def start_if(self, ifcond):
|
def start_if(self, ifcond):
|
||||||
|
@ -106,13 +102,13 @@ class QAPIGenCCode(QAPIGen):
|
||||||
|
|
||||||
def get_content(self):
|
def get_content(self):
|
||||||
assert self._start_if is None
|
assert self._start_if is None
|
||||||
return QAPIGen.get_content(self)
|
return super().get_content()
|
||||||
|
|
||||||
|
|
||||||
class QAPIGenC(QAPIGenCCode):
|
class QAPIGenC(QAPIGenCCode):
|
||||||
|
|
||||||
def __init__(self, fname, blurb, pydoc):
|
def __init__(self, fname, blurb, pydoc):
|
||||||
QAPIGenCCode.__init__(self, fname)
|
super().__init__(fname)
|
||||||
self._blurb = blurb
|
self._blurb = blurb
|
||||||
self._copyright = '\n * '.join(re.findall(r'^Copyright .*', pydoc,
|
self._copyright = '\n * '.join(re.findall(r'^Copyright .*', pydoc,
|
||||||
re.MULTILINE))
|
re.MULTILINE))
|
||||||
|
@ -145,7 +141,7 @@ char qapi_dummy_%(name)s;
|
||||||
class QAPIGenH(QAPIGenC):
|
class QAPIGenH(QAPIGenC):
|
||||||
|
|
||||||
def _top(self):
|
def _top(self):
|
||||||
return QAPIGenC._top(self) + guardstart(self.fname)
|
return super()._top() + guardstart(self.fname)
|
||||||
|
|
||||||
def _bottom(self):
|
def _bottom(self):
|
||||||
return guardend(self.fname)
|
return guardend(self.fname)
|
||||||
|
@ -180,7 +176,7 @@ def ifcontext(ifcond, *args):
|
||||||
class QAPIGenDoc(QAPIGen):
|
class QAPIGenDoc(QAPIGen):
|
||||||
|
|
||||||
def _top(self):
|
def _top(self):
|
||||||
return (QAPIGen._top(self)
|
return (super()._top()
|
||||||
+ '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n')
|
+ '@c AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n')
|
||||||
|
|
||||||
|
|
||||||
|
@ -265,6 +261,9 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
|
||||||
genc.write(output_dir)
|
genc.write(output_dir)
|
||||||
genh.write(output_dir)
|
genh.write(output_dir)
|
||||||
|
|
||||||
|
def _begin_system_module(self, name):
|
||||||
|
pass
|
||||||
|
|
||||||
def _begin_user_module(self, name):
|
def _begin_user_module(self, name):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,6 @@ This work is licensed under the terms of the GNU GPL, version 2.
|
||||||
See the COPYING file in the top-level directory.
|
See the COPYING file in the top-level directory.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import string
|
|
||||||
|
|
||||||
from qapi.common import *
|
from qapi.common import *
|
||||||
from qapi.gen import QAPISchemaMonolithicCVisitor
|
from qapi.gen import QAPISchemaMonolithicCVisitor
|
||||||
from qapi.schema import (QAPISchemaArrayType, QAPISchemaBuiltinType,
|
from qapi.schema import (QAPISchemaArrayType, QAPISchemaBuiltinType,
|
||||||
|
@ -76,8 +74,8 @@ def to_c_string(string):
|
||||||
class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor):
|
class QAPISchemaGenIntrospectVisitor(QAPISchemaMonolithicCVisitor):
|
||||||
|
|
||||||
def __init__(self, prefix, unmask):
|
def __init__(self, prefix, unmask):
|
||||||
QAPISchemaMonolithicCVisitor.__init__(
|
super().__init__(
|
||||||
self, prefix, 'qapi-introspect',
|
prefix, 'qapi-introspect',
|
||||||
' * QAPI/QMP schema introspection', __doc__)
|
' * QAPI/QMP schema introspection', __doc__)
|
||||||
self._unmask = unmask
|
self._unmask = unmask
|
||||||
self._schema = None
|
self._schema = None
|
||||||
|
|
|
@ -16,24 +16,20 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from qapi.error import QAPIParseError, QAPISemError
|
from qapi.error import QAPIParseError, QAPISemError
|
||||||
from qapi.source import QAPISourceInfo
|
from qapi.source import QAPISourceInfo
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaParser(object):
|
class QAPISchemaParser:
|
||||||
|
|
||||||
def __init__(self, fname, previously_included=None, incl_info=None):
|
def __init__(self, fname, previously_included=None, incl_info=None):
|
||||||
previously_included = previously_included or set()
|
previously_included = previously_included or set()
|
||||||
previously_included.add(os.path.abspath(fname))
|
previously_included.add(os.path.abspath(fname))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if sys.version_info[0] >= 3:
|
fp = open(fname, 'r', encoding='utf-8')
|
||||||
fp = open(fname, 'r', encoding='utf-8')
|
|
||||||
else:
|
|
||||||
fp = open(fname, 'r')
|
|
||||||
self.src = fp.read()
|
self.src = fp.read()
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
raise QAPISemError(incl_info or QAPISourceInfo(None, None, None),
|
raise QAPISemError(incl_info or QAPISourceInfo(None, None, None),
|
||||||
|
@ -286,14 +282,13 @@ class QAPISchemaParser(object):
|
||||||
doc.end_comment()
|
doc.end_comment()
|
||||||
self.accept()
|
self.accept()
|
||||||
return doc
|
return doc
|
||||||
else:
|
doc.append(self.val)
|
||||||
doc.append(self.val)
|
|
||||||
self.accept(False)
|
self.accept(False)
|
||||||
|
|
||||||
raise QAPIParseError(self, "documentation comment must end with '##'")
|
raise QAPIParseError(self, "documentation comment must end with '##'")
|
||||||
|
|
||||||
|
|
||||||
class QAPIDoc(object):
|
class QAPIDoc:
|
||||||
"""
|
"""
|
||||||
A documentation comment block, either definition or free-form
|
A documentation comment block, either definition or free-form
|
||||||
|
|
||||||
|
@ -312,7 +307,7 @@ class QAPIDoc(object):
|
||||||
Free-form documentation blocks consist only of a body section.
|
Free-form documentation blocks consist only of a body section.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
class Section(object):
|
class Section:
|
||||||
def __init__(self, name=None):
|
def __init__(self, name=None):
|
||||||
# optional section name (argument/member or section name)
|
# optional section name (argument/member or section name)
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -324,7 +319,7 @@ class QAPIDoc(object):
|
||||||
|
|
||||||
class ArgSection(Section):
|
class ArgSection(Section):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
QAPIDoc.Section.__init__(self, name)
|
super().__init__(name)
|
||||||
self.member = None
|
self.member = None
|
||||||
|
|
||||||
def connect(self, member):
|
def connect(self, member):
|
||||||
|
@ -496,7 +491,7 @@ class QAPIDoc(object):
|
||||||
raise QAPIParseError(self._parser,
|
raise QAPIParseError(self._parser,
|
||||||
"'%s' can't follow '%s' section"
|
"'%s' can't follow '%s' section"
|
||||||
% (name, self.sections[0].name))
|
% (name, self.sections[0].name))
|
||||||
elif self._is_section_tag(name):
|
if self._is_section_tag(name):
|
||||||
line = line[len(name)+1:]
|
line = line[len(name)+1:]
|
||||||
self._start_section(name[:-1])
|
self._start_section(name[:-1])
|
||||||
|
|
||||||
|
@ -560,7 +555,6 @@ class QAPIDoc(object):
|
||||||
raise QAPISemError(feature.info,
|
raise QAPISemError(feature.info,
|
||||||
"feature '%s' lacks documentation"
|
"feature '%s' lacks documentation"
|
||||||
% feature.name)
|
% feature.name)
|
||||||
self.features[feature.name] = QAPIDoc.ArgSection(feature.name)
|
|
||||||
self.features[feature.name].connect(feature)
|
self.features[feature.name].connect(feature)
|
||||||
|
|
||||||
def check_expr(self, expr):
|
def check_expr(self, expr):
|
||||||
|
|
|
@ -19,12 +19,12 @@ import re
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from qapi.common import c_name, pointer_suffix
|
from qapi.common import c_name, pointer_suffix
|
||||||
from qapi.error import QAPIError, QAPIParseError, QAPISemError
|
from qapi.error import QAPIError, QAPISemError
|
||||||
from qapi.expr import check_exprs
|
from qapi.expr import check_exprs
|
||||||
from qapi.parser import QAPISchemaParser
|
from qapi.parser import QAPISchemaParser
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaEntity(object):
|
class QAPISchemaEntity:
|
||||||
meta = None
|
meta = None
|
||||||
|
|
||||||
def __init__(self, name, info, doc, ifcond=None, features=None):
|
def __init__(self, name, info, doc, ifcond=None, features=None):
|
||||||
|
@ -89,21 +89,21 @@ class QAPISchemaEntity(object):
|
||||||
return "%s '%s'" % (self.meta, self.name)
|
return "%s '%s'" % (self.meta, self.name)
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaVisitor(object):
|
class QAPISchemaVisitor:
|
||||||
def visit_begin(self, schema):
|
def visit_begin(self, schema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def visit_end(self):
|
def visit_end(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def visit_module(self, fname):
|
def visit_module(self, name):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def visit_needed(self, entity):
|
def visit_needed(self, entity):
|
||||||
# Default to visiting everything
|
# Default to visiting everything
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def visit_include(self, fname, info):
|
def visit_include(self, name, info):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def visit_builtin_type(self, name, info, json_type):
|
def visit_builtin_type(self, name, info, json_type):
|
||||||
|
@ -135,7 +135,7 @@ class QAPISchemaVisitor(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaModule(object):
|
class QAPISchemaModule:
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
self._entity_list = []
|
self._entity_list = []
|
||||||
|
@ -152,11 +152,11 @@ class QAPISchemaModule(object):
|
||||||
|
|
||||||
class QAPISchemaInclude(QAPISchemaEntity):
|
class QAPISchemaInclude(QAPISchemaEntity):
|
||||||
def __init__(self, sub_module, info):
|
def __init__(self, sub_module, info):
|
||||||
QAPISchemaEntity.__init__(self, None, info, None)
|
super().__init__(None, info, None)
|
||||||
self._sub_module = sub_module
|
self._sub_module = sub_module
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaEntity.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_include(self._sub_module.name, self.info)
|
visitor.visit_include(self._sub_module.name, self.info)
|
||||||
|
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ class QAPISchemaBuiltinType(QAPISchemaType):
|
||||||
meta = 'built-in'
|
meta = 'built-in'
|
||||||
|
|
||||||
def __init__(self, name, json_type, c_type):
|
def __init__(self, name, json_type, c_type):
|
||||||
QAPISchemaType.__init__(self, name, None, None)
|
super().__init__(name, None, None)
|
||||||
assert not c_type or isinstance(c_type, str)
|
assert not c_type or isinstance(c_type, str)
|
||||||
assert json_type in ('string', 'number', 'int', 'boolean', 'null',
|
assert json_type in ('string', 'number', 'int', 'boolean', 'null',
|
||||||
'value')
|
'value')
|
||||||
|
@ -227,7 +227,7 @@ class QAPISchemaBuiltinType(QAPISchemaType):
|
||||||
return self.json_type()
|
return self.json_type()
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaType.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_builtin_type(self.name, self.info, self.json_type())
|
visitor.visit_builtin_type(self.name, self.info, self.json_type())
|
||||||
|
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ class QAPISchemaEnumType(QAPISchemaType):
|
||||||
meta = 'enum'
|
meta = 'enum'
|
||||||
|
|
||||||
def __init__(self, name, info, doc, ifcond, members, prefix):
|
def __init__(self, name, info, doc, ifcond, members, prefix):
|
||||||
QAPISchemaType.__init__(self, name, info, doc, ifcond)
|
super().__init__(name, info, doc, ifcond)
|
||||||
for m in members:
|
for m in members:
|
||||||
assert isinstance(m, QAPISchemaEnumMember)
|
assert isinstance(m, QAPISchemaEnumMember)
|
||||||
m.set_defined_in(name)
|
m.set_defined_in(name)
|
||||||
|
@ -244,7 +244,7 @@ class QAPISchemaEnumType(QAPISchemaType):
|
||||||
self.prefix = prefix
|
self.prefix = prefix
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaType.check(self, schema)
|
super().check(schema)
|
||||||
seen = {}
|
seen = {}
|
||||||
for m in self.members:
|
for m in self.members:
|
||||||
m.check_clash(self.info, seen)
|
m.check_clash(self.info, seen)
|
||||||
|
@ -269,7 +269,7 @@ class QAPISchemaEnumType(QAPISchemaType):
|
||||||
return 'string'
|
return 'string'
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaType.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_enum_type(self.name, self.info, self.ifcond,
|
visitor.visit_enum_type(self.name, self.info, self.ifcond,
|
||||||
self.members, self.prefix)
|
self.members, self.prefix)
|
||||||
|
|
||||||
|
@ -278,13 +278,13 @@ class QAPISchemaArrayType(QAPISchemaType):
|
||||||
meta = 'array'
|
meta = 'array'
|
||||||
|
|
||||||
def __init__(self, name, info, element_type):
|
def __init__(self, name, info, element_type):
|
||||||
QAPISchemaType.__init__(self, name, info, None, None)
|
super().__init__(name, info, None, None)
|
||||||
assert isinstance(element_type, str)
|
assert isinstance(element_type, str)
|
||||||
self._element_type_name = element_type
|
self._element_type_name = element_type
|
||||||
self.element_type = None
|
self.element_type = None
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaType.check(self, schema)
|
super().check(schema)
|
||||||
self.element_type = schema.resolve_type(
|
self.element_type = schema.resolve_type(
|
||||||
self._element_type_name, self.info,
|
self._element_type_name, self.info,
|
||||||
self.info and self.info.defn_meta)
|
self.info and self.info.defn_meta)
|
||||||
|
@ -314,7 +314,7 @@ class QAPISchemaArrayType(QAPISchemaType):
|
||||||
return 'array of ' + elt_doc_type
|
return 'array of ' + elt_doc_type
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaType.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_array_type(self.name, self.info, self.ifcond,
|
visitor.visit_array_type(self.name, self.info, self.ifcond,
|
||||||
self.element_type)
|
self.element_type)
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||||
# struct has local_members, optional base, and no variants
|
# struct has local_members, optional base, and no variants
|
||||||
# flat union has base, variants, and no local_members
|
# flat union has base, variants, and no local_members
|
||||||
# simple union has local_members, variants, and no base
|
# simple union has local_members, variants, and no base
|
||||||
QAPISchemaType.__init__(self, name, info, doc, ifcond, features)
|
super().__init__(name, info, doc, ifcond, features)
|
||||||
self.meta = 'union' if variants else 'struct'
|
self.meta = 'union' if variants else 'struct'
|
||||||
assert base is None or isinstance(base, str)
|
assert base is None or isinstance(base, str)
|
||||||
for m in local_members:
|
for m in local_members:
|
||||||
|
@ -356,7 +356,7 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||||
raise QAPISemError(self.info,
|
raise QAPISemError(self.info,
|
||||||
"object %s contains itself" % self.name)
|
"object %s contains itself" % self.name)
|
||||||
|
|
||||||
QAPISchemaType.check(self, schema)
|
super().check(schema)
|
||||||
assert self._checked and self.members is None
|
assert self._checked and self.members is None
|
||||||
|
|
||||||
seen = OrderedDict()
|
seen = OrderedDict()
|
||||||
|
@ -419,7 +419,7 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||||
|
|
||||||
def c_name(self):
|
def c_name(self):
|
||||||
assert self.name != 'q_empty'
|
assert self.name != 'q_empty'
|
||||||
return QAPISchemaType.c_name(self)
|
return super().c_name()
|
||||||
|
|
||||||
def c_type(self):
|
def c_type(self):
|
||||||
assert not self.is_implicit()
|
assert not self.is_implicit()
|
||||||
|
@ -432,7 +432,7 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||||
return 'object'
|
return 'object'
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaType.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_object_type(self.name, self.info, self.ifcond,
|
visitor.visit_object_type(self.name, self.info, self.ifcond,
|
||||||
self.base, self.local_members, self.variants,
|
self.base, self.local_members, self.variants,
|
||||||
self.features)
|
self.features)
|
||||||
|
@ -441,7 +441,7 @@ class QAPISchemaObjectType(QAPISchemaType):
|
||||||
self.features)
|
self.features)
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaMember(object):
|
class QAPISchemaMember:
|
||||||
""" Represents object members, enum members and features """
|
""" Represents object members, enum members and features """
|
||||||
role = 'member'
|
role = 'member'
|
||||||
|
|
||||||
|
@ -506,7 +506,7 @@ class QAPISchemaFeature(QAPISchemaMember):
|
||||||
|
|
||||||
class QAPISchemaObjectTypeMember(QAPISchemaMember):
|
class QAPISchemaObjectTypeMember(QAPISchemaMember):
|
||||||
def __init__(self, name, info, typ, optional, ifcond=None):
|
def __init__(self, name, info, typ, optional, ifcond=None):
|
||||||
QAPISchemaMember.__init__(self, name, info, ifcond)
|
super().__init__(name, info, ifcond)
|
||||||
assert isinstance(typ, str)
|
assert isinstance(typ, str)
|
||||||
assert isinstance(optional, bool)
|
assert isinstance(optional, bool)
|
||||||
self._type_name = typ
|
self._type_name = typ
|
||||||
|
@ -519,7 +519,7 @@ class QAPISchemaObjectTypeMember(QAPISchemaMember):
|
||||||
self.describe)
|
self.describe)
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaObjectTypeVariants(object):
|
class QAPISchemaObjectTypeVariants:
|
||||||
def __init__(self, tag_name, info, tag_member, variants):
|
def __init__(self, tag_name, info, tag_member, variants):
|
||||||
# Flat unions pass tag_name but not tag_member.
|
# Flat unions pass tag_name but not tag_member.
|
||||||
# Simple unions and alternates pass tag_member but not tag_name.
|
# Simple unions and alternates pass tag_member but not tag_name.
|
||||||
|
@ -576,7 +576,7 @@ class QAPISchemaObjectTypeVariants(object):
|
||||||
assert self.tag_member.ifcond == []
|
assert self.tag_member.ifcond == []
|
||||||
if self._tag_name: # flat union
|
if self._tag_name: # flat union
|
||||||
# branches that are not explicitly covered get an empty type
|
# branches that are not explicitly covered get an empty type
|
||||||
cases = set([v.name for v in self.variants])
|
cases = {v.name for v in self.variants}
|
||||||
for m in self.tag_member.type.members:
|
for m in self.tag_member.type.members:
|
||||||
if m.name not in cases:
|
if m.name not in cases:
|
||||||
v = QAPISchemaObjectTypeVariant(m.name, self.info,
|
v = QAPISchemaObjectTypeVariant(m.name, self.info,
|
||||||
|
@ -614,15 +614,14 @@ class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
|
||||||
role = 'branch'
|
role = 'branch'
|
||||||
|
|
||||||
def __init__(self, name, info, typ, ifcond=None):
|
def __init__(self, name, info, typ, ifcond=None):
|
||||||
QAPISchemaObjectTypeMember.__init__(self, name, info, typ,
|
super().__init__(name, info, typ, False, ifcond)
|
||||||
False, ifcond)
|
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaAlternateType(QAPISchemaType):
|
class QAPISchemaAlternateType(QAPISchemaType):
|
||||||
meta = 'alternate'
|
meta = 'alternate'
|
||||||
|
|
||||||
def __init__(self, name, info, doc, ifcond, variants):
|
def __init__(self, name, info, doc, ifcond, variants):
|
||||||
QAPISchemaType.__init__(self, name, info, doc, ifcond)
|
super().__init__(name, info, doc, ifcond)
|
||||||
assert isinstance(variants, QAPISchemaObjectTypeVariants)
|
assert isinstance(variants, QAPISchemaObjectTypeVariants)
|
||||||
assert variants.tag_member
|
assert variants.tag_member
|
||||||
variants.set_defined_in(name)
|
variants.set_defined_in(name)
|
||||||
|
@ -630,7 +629,7 @@ class QAPISchemaAlternateType(QAPISchemaType):
|
||||||
self.variants = variants
|
self.variants = variants
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaType.check(self, schema)
|
super().check(schema)
|
||||||
self.variants.tag_member.check(schema)
|
self.variants.tag_member.check(schema)
|
||||||
# Not calling self.variants.check_clash(), because there's nothing
|
# Not calling self.variants.check_clash(), because there's nothing
|
||||||
# to clash with
|
# to clash with
|
||||||
|
@ -680,7 +679,7 @@ class QAPISchemaAlternateType(QAPISchemaType):
|
||||||
return 'value'
|
return 'value'
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaType.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_alternate_type(self.name, self.info, self.ifcond,
|
visitor.visit_alternate_type(self.name, self.info, self.ifcond,
|
||||||
self.variants)
|
self.variants)
|
||||||
|
|
||||||
|
@ -691,7 +690,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
||||||
def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
|
def __init__(self, name, info, doc, ifcond, arg_type, ret_type,
|
||||||
gen, success_response, boxed, allow_oob, allow_preconfig,
|
gen, success_response, boxed, allow_oob, allow_preconfig,
|
||||||
features):
|
features):
|
||||||
QAPISchemaEntity.__init__(self, name, info, doc, ifcond, features)
|
super().__init__(name, info, doc, ifcond, features)
|
||||||
assert not arg_type or isinstance(arg_type, str)
|
assert not arg_type or isinstance(arg_type, str)
|
||||||
assert not ret_type or isinstance(ret_type, str)
|
assert not ret_type or isinstance(ret_type, str)
|
||||||
self._arg_type_name = arg_type
|
self._arg_type_name = arg_type
|
||||||
|
@ -705,7 +704,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
||||||
self.allow_preconfig = allow_preconfig
|
self.allow_preconfig = allow_preconfig
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaEntity.check(self, schema)
|
super().check(schema)
|
||||||
if self._arg_type_name:
|
if self._arg_type_name:
|
||||||
self.arg_type = schema.resolve_type(
|
self.arg_type = schema.resolve_type(
|
||||||
self._arg_type_name, self.info, "command's 'data'")
|
self._arg_type_name, self.info, "command's 'data'")
|
||||||
|
@ -740,7 +739,7 @@ class QAPISchemaCommand(QAPISchemaEntity):
|
||||||
self.arg_type.connect_doc(doc)
|
self.arg_type.connect_doc(doc)
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaEntity.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_command(self.name, self.info, self.ifcond,
|
visitor.visit_command(self.name, self.info, self.ifcond,
|
||||||
self.arg_type, self.ret_type,
|
self.arg_type, self.ret_type,
|
||||||
self.gen, self.success_response,
|
self.gen, self.success_response,
|
||||||
|
@ -753,14 +752,14 @@ class QAPISchemaEvent(QAPISchemaEntity):
|
||||||
meta = 'event'
|
meta = 'event'
|
||||||
|
|
||||||
def __init__(self, name, info, doc, ifcond, arg_type, boxed):
|
def __init__(self, name, info, doc, ifcond, arg_type, boxed):
|
||||||
QAPISchemaEntity.__init__(self, name, info, doc, ifcond)
|
super().__init__(name, info, doc, ifcond)
|
||||||
assert not arg_type or isinstance(arg_type, str)
|
assert not arg_type or isinstance(arg_type, str)
|
||||||
self._arg_type_name = arg_type
|
self._arg_type_name = arg_type
|
||||||
self.arg_type = None
|
self.arg_type = None
|
||||||
self.boxed = boxed
|
self.boxed = boxed
|
||||||
|
|
||||||
def check(self, schema):
|
def check(self, schema):
|
||||||
QAPISchemaEntity.check(self, schema)
|
super().check(schema)
|
||||||
if self._arg_type_name:
|
if self._arg_type_name:
|
||||||
self.arg_type = schema.resolve_type(
|
self.arg_type = schema.resolve_type(
|
||||||
self._arg_type_name, self.info, "event's 'data'")
|
self._arg_type_name, self.info, "event's 'data'")
|
||||||
|
@ -782,12 +781,12 @@ class QAPISchemaEvent(QAPISchemaEntity):
|
||||||
self.arg_type.connect_doc(doc)
|
self.arg_type.connect_doc(doc)
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
QAPISchemaEntity.visit(self, visitor)
|
super().visit(visitor)
|
||||||
visitor.visit_event(self.name, self.info, self.ifcond,
|
visitor.visit_event(self.name, self.info, self.ifcond,
|
||||||
self.arg_type, self.boxed)
|
self.arg_type, self.boxed)
|
||||||
|
|
||||||
|
|
||||||
class QAPISchema(object):
|
class QAPISchema:
|
||||||
def __init__(self, fname):
|
def __init__(self, fname):
|
||||||
self.fname = fname
|
self.fname = fname
|
||||||
parser = QAPISchemaParser(fname)
|
parser = QAPISchemaParser(fname)
|
||||||
|
@ -849,7 +848,7 @@ class QAPISchema(object):
|
||||||
|
|
||||||
def _make_module(self, fname):
|
def _make_module(self, fname):
|
||||||
name = self._module_name(fname)
|
name = self._module_name(fname)
|
||||||
if not name in self._module_dict:
|
if name not in self._module_dict:
|
||||||
self._module_dict[name] = QAPISchemaModule(name)
|
self._module_dict[name] = QAPISchemaModule(name)
|
||||||
return self._module_dict[name]
|
return self._module_dict[name]
|
||||||
|
|
||||||
|
@ -1098,7 +1097,6 @@ class QAPISchema(object):
|
||||||
|
|
||||||
def visit(self, visitor):
|
def visit(self, visitor):
|
||||||
visitor.visit_begin(self)
|
visitor.visit_begin(self)
|
||||||
module = None
|
|
||||||
for mod in self._module_dict.values():
|
for mod in self._module_dict.values():
|
||||||
mod.visit(visitor)
|
mod.visit(visitor)
|
||||||
visitor.visit_end()
|
visitor.visit_end()
|
||||||
|
|
|
@ -13,7 +13,7 @@ import copy
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaPragma(object):
|
class QAPISchemaPragma:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# Are documentation comments required?
|
# Are documentation comments required?
|
||||||
self.doc_required = False
|
self.doc_required = False
|
||||||
|
@ -23,7 +23,7 @@ class QAPISchemaPragma(object):
|
||||||
self.name_case_whitelist = []
|
self.name_case_whitelist = []
|
||||||
|
|
||||||
|
|
||||||
class QAPISourceInfo(object):
|
class QAPISourceInfo:
|
||||||
def __init__(self, fname, line, parent):
|
def __init__(self, fname, line, parent):
|
||||||
self.fname = fname
|
self.fname = fname
|
||||||
self.line = line
|
self.line = line
|
||||||
|
|
|
@ -241,8 +241,8 @@ void qapi_free_%(c_name)s(%(c_name)s *obj)
|
||||||
class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
|
class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
|
||||||
|
|
||||||
def __init__(self, prefix):
|
def __init__(self, prefix):
|
||||||
QAPISchemaModularCVisitor.__init__(
|
super().__init__(
|
||||||
self, prefix, 'qapi-types', ' * Schema-defined QAPI types',
|
prefix, 'qapi-types', ' * Schema-defined QAPI types',
|
||||||
' * Built-in QAPI types', __doc__)
|
' * Built-in QAPI types', __doc__)
|
||||||
|
|
||||||
def _begin_system_module(self, name):
|
def _begin_system_module(self, name):
|
||||||
|
|
|
@ -283,8 +283,8 @@ out:
|
||||||
class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
|
class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
|
||||||
|
|
||||||
def __init__(self, prefix):
|
def __init__(self, prefix):
|
||||||
QAPISchemaModularCVisitor.__init__(
|
super().__init__(
|
||||||
self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
|
prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
|
||||||
' * Built-in QAPI visitors', __doc__)
|
' * Built-in QAPI visitors', __doc__)
|
||||||
|
|
||||||
def _begin_system_module(self, name):
|
def _begin_system_module(self, name):
|
||||||
|
|
|
@ -16,15 +16,11 @@ import argparse
|
||||||
import difflib
|
import difflib
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
from io import StringIO
|
||||||
|
|
||||||
from qapi.error import QAPIError
|
from qapi.error import QAPIError
|
||||||
from qapi.schema import QAPISchema, QAPISchemaVisitor
|
from qapi.schema import QAPISchema, QAPISchemaVisitor
|
||||||
|
|
||||||
if sys.version_info[0] < 3:
|
|
||||||
from cStringIO import StringIO
|
|
||||||
else:
|
|
||||||
from io import StringIO
|
|
||||||
|
|
||||||
|
|
||||||
class QAPISchemaTestVisitor(QAPISchemaVisitor):
|
class QAPISchemaTestVisitor(QAPISchemaVisitor):
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue