summaryrefslogtreecommitdiffstats
path: root/scripts/qapi/common.py
diff options
context:
space:
mode:
authorPeter Maydell2018-06-22 18:08:57 +0200
committerPeter Maydell2018-06-22 18:08:58 +0200
commit7ed14cbf3cf083f125c079bd02b3215941853830 (patch)
treea845e5314ea1b5af5aa4a4b9c9af7d9c2aa9605c /scripts/qapi/common.py
parentMerge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180622'... (diff)
parentMAINTAINERS: Update QAPI stanza for commit fb0bc835e56 (diff)
downloadqemu-7ed14cbf3cf083f125c079bd02b3215941853830.tar.gz
qemu-7ed14cbf3cf083f125c079bd02b3215941853830.tar.xz
qemu-7ed14cbf3cf083f125c079bd02b3215941853830.zip
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2018-06-22' into staging
QAPI patches for 2018-06-22 # gpg: Signature made Fri 22 Jun 2018 15:36:22 BST # gpg: using RSA key 3870B400EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-qapi-2018-06-22: MAINTAINERS: Update QAPI stanza for commit fb0bc835e56 qapi/introspect: Eliminate pointless variable in .visit_end() Revert commit d4e5ec877ca qapi: Open files with encoding='utf-8' qapi: remove empty flat union branches and types qapi: allow empty branches in flat unions tests: Add QDict clone-flatten test qdict: Make qdict_flatten() shallow-clone-friendly qapi/events: generate event enum in main module qapi/visit: remove useless prefix argument Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'scripts/qapi/common.py')
-rw-r--r--scripts/qapi/common.py32
1 files changed, 22 insertions, 10 deletions
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 2462fc0291..8b6708dbf1 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -16,6 +16,7 @@ import errno
import os
import re
import string
+import sys
from collections import OrderedDict
builtin_types = {
@@ -340,7 +341,10 @@ class QAPISchemaParser(object):
return None
try:
- fobj = open(incl_fname, 'r')
+ if sys.version_info[0] >= 3:
+ fobj = open(incl_fname, 'r', encoding='utf-8')
+ else:
+ fobj = open(incl_fname, 'r')
except IOError as e:
raise QAPISemError(info, '%s: %s' % (e.strerror, incl_fname))
return QAPISchemaParser(fobj, previously_included, info)
@@ -779,13 +783,6 @@ def check_union(expr, info):
"enum '%s'"
% (key, enum_define['enum']))
- # If discriminator is user-defined, ensure all values are covered
- if enum_define:
- for value in enum_define['data']:
- if value not in members.keys():
- raise QAPISemError(info, "Union '%s' data missing '%s' branch"
- % (name, value))
-
def check_alternate(expr, info):
name = expr['alternate']
@@ -1357,6 +1354,14 @@ class QAPISchemaObjectTypeVariants(object):
self.tag_member = seen[c_name(self._tag_name)]
assert self._tag_name == self.tag_member.name
assert isinstance(self.tag_member.type, QAPISchemaEnumType)
+ if self._tag_name: # flat union
+ # branches that are not explicitly covered get an empty type
+ cases = set([v.name for v in self.variants])
+ for val in self.tag_member.type.values:
+ if val.name not in cases:
+ v = QAPISchemaObjectTypeVariant(val.name, 'q_empty')
+ v.set_owner(self.tag_member.owner)
+ self.variants.append(v)
for v in self.variants:
v.check(schema)
# Union names must match enum values; alternate names are
@@ -1492,7 +1497,11 @@ class QAPISchemaEvent(QAPISchemaEntity):
class QAPISchema(object):
def __init__(self, fname):
self._fname = fname
- parser = QAPISchemaParser(open(fname, 'r'))
+ if sys.version_info[0] >= 3:
+ f = open(fname, 'r', encoding='utf-8')
+ else:
+ f = open(fname, 'r')
+ parser = QAPISchemaParser(f)
exprs = check_exprs(parser.exprs)
self.docs = parser.docs
self._entity_list = []
@@ -2006,7 +2015,10 @@ class QAPIGen(object):
if e.errno != errno.EEXIST:
raise
fd = os.open(pathname, os.O_RDWR | os.O_CREAT, 0o666)
- f = os.fdopen(fd, 'r+')
+ if sys.version_info[0] >= 3:
+ f = open(fd, 'r+', encoding='utf-8')
+ else:
+ f = os.fdopen(fd, 'r+')
text = (self._top(fname) + self._preamble + self._body
+ self._bottom(fname))
oldtext = f.read(len(text) + 1)