[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 16/29] qapi: Generate in source order
From: |
Michael Roth |
Subject: |
Re: [Qemu-devel] [PATCH v2 16/29] qapi: Generate in source order |
Date: |
Sun, 18 Feb 2018 18:01:32 -0600 |
User-agent: |
alot/0.6 |
Quoting Markus Armbruster (2018-02-11 03:35:54)
> The generators' conversion to visitors (merge commit 9e72681d16)
> changed the processing order of entities from source order to
> alphabetical order. The next commit needs source order, so change it
> back.
>
> Signed-off-by: Markus Armbruster <address@hidden>
> Reviewed-by: Marc-André Lureau <address@hidden>
Reviewed-by: Michael Roth <address@hidden>
> ---
> scripts/qapi/common.py | 6 +-
> tests/qapi-schema/comments.out | 2 +-
> tests/qapi-schema/doc-bad-section.out | 4 +-
> tests/qapi-schema/doc-good.out | 32 ++--
> tests/qapi-schema/empty.out | 2 +-
> tests/qapi-schema/event-case.out | 2 +-
> tests/qapi-schema/ident-with-escape.out | 6 +-
> tests/qapi-schema/include-relpath.out | 2 +-
> tests/qapi-schema/include-repetition.out | 2 +-
> tests/qapi-schema/include-simple.out | 2 +-
> tests/qapi-schema/indented-expr.out | 2 +-
> tests/qapi-schema/qapi-schema-test.out | 320
> +++++++++++++++----------------
> 12 files changed, 192 insertions(+), 190 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index 6d49709784..b531ab519f 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -1475,6 +1475,7 @@ class QAPISchema(object):
> parser = QAPISchemaParser(open(fname, 'r'))
> exprs = check_exprs(parser.exprs)
> self.docs = parser.docs
> + self._entity_list = []
> self._entity_dict = {}
> self._predefining = True
> self._def_predefineds()
> @@ -1486,6 +1487,7 @@ class QAPISchema(object):
> # Only the predefined types are allowed to not have info
> assert ent.info or self._predefining
> assert ent.name not in self._entity_dict
> + self._entity_list.append(ent)
> self._entity_dict[ent.name] = ent
>
> def lookup_entity(self, name, typ=None):
> @@ -1684,12 +1686,12 @@ class QAPISchema(object):
> assert False
>
> def check(self):
> - for (name, ent) in sorted(self._entity_dict.items()):
> + for ent in self._entity_list:
> ent.check(self)
>
> def visit(self, visitor):
> visitor.visit_begin(self)
> - for (name, entity) in sorted(self._entity_dict.items()):
> + for entity in self._entity_list:
> if visitor.visit_needed(entity):
> entity.visit(visitor)
> visitor.visit_end()
> diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out
> index 17e652535c..0261ddf202 100644
> --- a/tests/qapi-schema/comments.out
> +++ b/tests/qapi-schema/comments.out
> @@ -1,4 +1,4 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> enum Status ['good', 'bad', 'ugly']
> -object q_empty
> diff --git a/tests/qapi-schema/doc-bad-section.out
> b/tests/qapi-schema/doc-bad-section.out
> index 089bde1381..23bf8c71ab 100644
> --- a/tests/qapi-schema/doc-bad-section.out
> +++ b/tests/qapi-schema/doc-bad-section.out
> @@ -1,7 +1,7 @@
> -enum Enum ['one', 'two']
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> -object q_empty
> +enum Enum ['one', 'two']
> doc symbol=Enum
> body=
> == Produces *invalid* texinfo
> diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out
> index 1d2c250527..0c07301f07 100644
> --- a/tests/qapi-schema/doc-good.out
> +++ b/tests/qapi-schema/doc-good.out
> @@ -1,35 +1,35 @@
> +object q_empty
> +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> + prefix QTYPE
> +enum Enum ['one', 'two']
> object Base
> member base1: Enum optional=False
> -enum Enum ['one', 'two']
> +object Variant1
> + member var1: str optional=False
> +object Variant2
> object Object
> base Base
> tag base1
> case one: Variant1
> case two: Variant2
> -enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> - prefix QTYPE
> +object q_obj_Variant1-wrapper
> + member data: Variant1 optional=False
> +object q_obj_Variant2-wrapper
> + member data: Variant2 optional=False
> +enum SugaredUnionKind ['one', 'two']
> object SugaredUnion
> member type: SugaredUnionKind optional=False
> tag type
> case one: q_obj_Variant1-wrapper
> case two: q_obj_Variant2-wrapper
> -enum SugaredUnionKind ['one', 'two']
> -object Variant1
> - member var1: str optional=False
> -object Variant2
> -command cmd q_obj_cmd-arg -> Object
> - gen=True success_response=True boxed=False
> -command cmd-boxed Object -> None
> - gen=True success_response=True boxed=True
> -object q_empty
> -object q_obj_Variant1-wrapper
> - member data: Variant1 optional=False
> -object q_obj_Variant2-wrapper
> - member data: Variant2 optional=False
> object q_obj_cmd-arg
> member arg1: int optional=False
> member arg2: str optional=True
> member arg3: bool optional=False
> +command cmd q_obj_cmd-arg -> Object
> + gen=True success_response=True boxed=False
> +command cmd-boxed Object -> None
> + gen=True success_response=True boxed=True
> doc freeform
> body=
> = Section
> diff --git a/tests/qapi-schema/empty.out b/tests/qapi-schema/empty.out
> index 40b886ddae..0ec234eec4 100644
> --- a/tests/qapi-schema/empty.out
> +++ b/tests/qapi-schema/empty.out
> @@ -1,3 +1,3 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> -object q_empty
> diff --git a/tests/qapi-schema/event-case.out
> b/tests/qapi-schema/event-case.out
> index 313c0fe7be..110571b793 100644
> --- a/tests/qapi-schema/event-case.out
> +++ b/tests/qapi-schema/event-case.out
> @@ -1,5 +1,5 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> event oops None
> boxed=False
> -object q_empty
> diff --git a/tests/qapi-schema/ident-with-escape.out
> b/tests/qapi-schema/ident-with-escape.out
> index b5637cb2e0..8336aa7629 100644
> --- a/tests/qapi-schema/ident-with-escape.out
> +++ b/tests/qapi-schema/ident-with-escape.out
> @@ -1,7 +1,7 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> -command fooA q_obj_fooA-arg -> None
> - gen=True success_response=True boxed=False
> -object q_empty
> object q_obj_fooA-arg
> member bar1: str optional=False
> +command fooA q_obj_fooA-arg -> None
> + gen=True success_response=True boxed=False
> diff --git a/tests/qapi-schema/include-relpath.out
> b/tests/qapi-schema/include-relpath.out
> index 17e652535c..0261ddf202 100644
> --- a/tests/qapi-schema/include-relpath.out
> +++ b/tests/qapi-schema/include-relpath.out
> @@ -1,4 +1,4 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> enum Status ['good', 'bad', 'ugly']
> -object q_empty
> diff --git a/tests/qapi-schema/include-repetition.out
> b/tests/qapi-schema/include-repetition.out
> index 17e652535c..0261ddf202 100644
> --- a/tests/qapi-schema/include-repetition.out
> +++ b/tests/qapi-schema/include-repetition.out
> @@ -1,4 +1,4 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> enum Status ['good', 'bad', 'ugly']
> -object q_empty
> diff --git a/tests/qapi-schema/include-simple.out
> b/tests/qapi-schema/include-simple.out
> index 17e652535c..0261ddf202 100644
> --- a/tests/qapi-schema/include-simple.out
> +++ b/tests/qapi-schema/include-simple.out
> @@ -1,4 +1,4 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> enum Status ['good', 'bad', 'ugly']
> -object q_empty
> diff --git a/tests/qapi-schema/indented-expr.out
> b/tests/qapi-schema/indented-expr.out
> index 586795f44d..34de8be426 100644
> --- a/tests/qapi-schema/indented-expr.out
> +++ b/tests/qapi-schema/indented-expr.out
> @@ -1,7 +1,7 @@
> +object q_empty
> enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> prefix QTYPE
> command eins None -> None
> gen=True success_response=True boxed=False
> -object q_empty
> command zwei None -> None
> gen=True success_response=True boxed=False
> diff --git a/tests/qapi-schema/qapi-schema-test.out
> b/tests/qapi-schema/qapi-schema-test.out
> index 3b1e9082d3..50706b0136 100644
> --- a/tests/qapi-schema/qapi-schema-test.out
> +++ b/tests/qapi-schema/qapi-schema-test.out
> @@ -1,87 +1,129 @@
> -alternate AltEnumBool
> - tag type
> - case e: EnumOne
> - case b: bool
> -alternate AltEnumInt
> - tag type
> - case e: EnumOne
> - case i: int
> -alternate AltEnumNum
> - tag type
> - case e: EnumOne
> - case n: number
> -alternate AltNumEnum
> - tag type
> - case n: number
> - case e: EnumOne
> -alternate AltStrObj
> - tag type
> - case s: str
> - case o: TestStruct
> -event EVENT_A None
> - boxed=False
> -event EVENT_B None
> - boxed=False
> -event EVENT_C q_obj_EVENT_C-arg
> - boxed=False
> -event EVENT_D q_obj_EVENT_D-arg
> - boxed=False
> -event EVENT_E UserDefZero
> - boxed=True
> -event EVENT_F UserDefAlternate
> - boxed=True
> +object q_empty
> +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> + prefix QTYPE
> +object TestStruct
> + member integer: int optional=False
> + member boolean: bool optional=False
> + member string: str optional=False
> +object NestedEnumsOne
> + member enum1: EnumOne optional=False
> + member enum2: EnumOne optional=True
> + member enum3: EnumOne optional=False
> + member enum4: EnumOne optional=True
> +enum MyEnum []
> object Empty1
> object Empty2
> base Empty1
> +command user_def_cmd0 Empty2 -> Empty2
> + gen=True success_response=True boxed=False
> +enum QEnumTwo ['value1', 'value2']
> + prefix QENUM_TWO
> +object UserDefOne
> + base UserDefZero
> + member string: str optional=False
> + member enum1: EnumOne optional=True
> enum EnumOne ['value1', 'value2', 'value3']
> -object EventStructOne
> - member struct1: UserDefOne optional=False
> +object UserDefZero
> + member integer: int optional=False
> +object UserDefTwoDictDict
> + member userdef: UserDefOne optional=False
> member string: str optional=False
> - member enum2: EnumOne optional=True
> +object UserDefTwoDict
> + member string1: str optional=False
> + member dict2: UserDefTwoDictDict optional=False
> + member dict3: UserDefTwoDictDict optional=True
> +object UserDefTwo
> + member string0: str optional=False
> + member dict1: UserDefTwoDict optional=False
> object ForceArrays
> member unused1: UserDefOneList optional=False
> member unused2: UserDefTwoList optional=False
> member unused3: TestStructList optional=False
> -enum MyEnum []
> -object NestedEnumsOne
> - member enum1: EnumOne optional=False
> - member enum2: EnumOne optional=True
> - member enum3: EnumOne optional=False
> - member enum4: EnumOne optional=True
> -enum QEnumTwo ['value1', 'value2']
> - prefix QENUM_TWO
> -enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> - prefix QTYPE
> -object TestStruct
> - member integer: int optional=False
> - member boolean: bool optional=False
> - member string: str optional=False
> object UserDefA
> member boolean: bool optional=False
> member a_b: int optional=True
> -alternate UserDefAlternate
> - tag type
> - case udfu: UserDefFlatUnion
> - case e: EnumOne
> - case i: int
> - case n: null
> object UserDefB
> member intb: int optional=False
> member a-b: bool optional=True
> -object UserDefC
> - member string1: str optional=False
> - member string2: str optional=False
> object UserDefFlatUnion
> base UserDefUnionBase
> tag enum1
> case value1: UserDefA
> case value2: UserDefB
> case value3: UserDefB
> +object UserDefUnionBase
> + base UserDefZero
> + member string: str optional=False
> + member enum1: EnumOne optional=False
> +object q_obj_UserDefFlatUnion2-base
> + member integer: int optional=True
> + member string: str optional=False
> + member enum1: QEnumTwo optional=False
> object UserDefFlatUnion2
> base q_obj_UserDefFlatUnion2-base
> tag enum1
> case value1: UserDefC
> case value2: UserDefB
> +object WrapAlternate
> + member alt: UserDefAlternate optional=False
> +alternate UserDefAlternate
> + tag type
> + case udfu: UserDefFlatUnion
> + case e: EnumOne
> + case i: int
> + case n: null
> +object UserDefC
> + member string1: str optional=False
> + member string2: str optional=False
> +alternate AltEnumBool
> + tag type
> + case e: EnumOne
> + case b: bool
> +alternate AltEnumNum
> + tag type
> + case e: EnumOne
> + case n: number
> +alternate AltNumEnum
> + tag type
> + case n: number
> + case e: EnumOne
> +alternate AltEnumInt
> + tag type
> + case e: EnumOne
> + case i: int
> +alternate AltStrObj
> + tag type
> + case s: str
> + case o: TestStruct
> +object q_obj_intList-wrapper
> + member data: intList optional=False
> +object q_obj_int8List-wrapper
> + member data: int8List optional=False
> +object q_obj_int16List-wrapper
> + member data: int16List optional=False
> +object q_obj_int32List-wrapper
> + member data: int32List optional=False
> +object q_obj_int64List-wrapper
> + member data: int64List optional=False
> +object q_obj_uint8List-wrapper
> + member data: uint8List optional=False
> +object q_obj_uint16List-wrapper
> + member data: uint16List optional=False
> +object q_obj_uint32List-wrapper
> + member data: uint32List optional=False
> +object q_obj_uint64List-wrapper
> + member data: uint64List optional=False
> +object q_obj_numberList-wrapper
> + member data: numberList optional=False
> +object q_obj_boolList-wrapper
> + member data: boolList optional=False
> +object q_obj_strList-wrapper
> + member data: strList optional=False
> +object q_obj_sizeList-wrapper
> + member data: sizeList optional=False
> +object q_obj_anyList-wrapper
> + member data: anyList optional=False
> +enum UserDefNativeListUnionKind ['integer', 's8', 's16', 's32', 's64', 'u8',
> 'u16', 'u32', 'u64', 'number', 'boolean', 'string', 'sizes', 'any']
> object UserDefNativeListUnion
> member type: UserDefNativeListUnionKind optional=False
> tag type
> @@ -99,133 +141,91 @@ object UserDefNativeListUnion
> case string: q_obj_strList-wrapper
> case sizes: q_obj_sizeList-wrapper
> case any: q_obj_anyList-wrapper
> -enum UserDefNativeListUnionKind ['integer', 's8', 's16', 's32', 's64', 'u8',
> 'u16', 'u32', 'u64', 'number', 'boolean', 'string', 'sizes', 'any']
> -object UserDefOne
> - base UserDefZero
> - member string: str optional=False
> - member enum1: EnumOne optional=True
> +command user_def_cmd None -> None
> + gen=True success_response=True boxed=False
> +object q_obj_user_def_cmd1-arg
> + member ud1a: UserDefOne optional=False
> +command user_def_cmd1 q_obj_user_def_cmd1-arg -> None
> + gen=True success_response=True boxed=False
> +object q_obj_user_def_cmd2-arg
> + member ud1a: UserDefOne optional=False
> + member ud1b: UserDefOne optional=True
> +command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
> + gen=True success_response=True boxed=False
> +object q_obj_guest-get-time-arg
> + member a: int optional=False
> + member b: int optional=True
> +command guest-get-time q_obj_guest-get-time-arg -> int
> + gen=True success_response=True boxed=False
> +object q_obj_guest-sync-arg
> + member arg: any optional=False
> +command guest-sync q_obj_guest-sync-arg -> any
> + gen=True success_response=True boxed=False
> +command boxed-struct UserDefZero -> None
> + gen=True success_response=True boxed=True
> +command boxed-union UserDefNativeListUnion -> None
> + gen=True success_response=True boxed=True
> object UserDefOptions
> member i64: intList optional=True
> member u64: uint64List optional=True
> member u16: uint16List optional=True
> member i64x: int optional=True
> member u64x: uint64 optional=True
> -object UserDefTwo
> - member string0: str optional=False
> - member dict1: UserDefTwoDict optional=False
> -object UserDefTwoDict
> - member string1: str optional=False
> - member dict2: UserDefTwoDictDict optional=False
> - member dict3: UserDefTwoDictDict optional=True
> -object UserDefTwoDictDict
> - member userdef: UserDefOne optional=False
> +object EventStructOne
> + member struct1: UserDefOne optional=False
> member string: str optional=False
> -object UserDefUnionBase
> - base UserDefZero
> - member string: str optional=False
> - member enum1: EnumOne optional=False
> -object UserDefZero
> - member integer: int optional=False
> -object WrapAlternate
> - member alt: UserDefAlternate optional=False
> -event __ORG.QEMU_X-EVENT __org.qemu_x-Struct
> + member enum2: EnumOne optional=True
> +event EVENT_A None
> + boxed=False
> +event EVENT_B None
> + boxed=False
> +object q_obj_EVENT_C-arg
> + member a: int optional=True
> + member b: UserDefOne optional=True
> + member c: str optional=False
> +event EVENT_C q_obj_EVENT_C-arg
> + boxed=False
> +object q_obj_EVENT_D-arg
> + member a: EventStructOne optional=False
> + member b: str optional=False
> + member c: str optional=True
> + member enum3: EnumOne optional=True
> +event EVENT_D q_obj_EVENT_D-arg
> boxed=False
> -alternate __org.qemu_x-Alt
> - tag type
> - case __org.qemu_x-branch: str
> - case b: __org.qemu_x-Base
> +event EVENT_E UserDefZero
> + boxed=True
> +event EVENT_F UserDefAlternate
> + boxed=True
> +enum __org.qemu_x-Enum ['__org.qemu_x-value']
> object __org.qemu_x-Base
> member __org.qemu_x-member1: __org.qemu_x-Enum optional=False
> -enum __org.qemu_x-Enum ['__org.qemu_x-value']
> object __org.qemu_x-Struct
> base __org.qemu_x-Base
> member __org.qemu_x-member2: str optional=False
> member wchar-t: int optional=True
> -object __org.qemu_x-Struct2
> - member array: __org.qemu_x-Union1List optional=False
> +object q_obj_str-wrapper
> + member data: str optional=False
> +enum __org.qemu_x-Union1Kind ['__org.qemu_x-branch']
> object __org.qemu_x-Union1
> member type: __org.qemu_x-Union1Kind optional=False
> tag type
> case __org.qemu_x-branch: q_obj_str-wrapper
> -enum __org.qemu_x-Union1Kind ['__org.qemu_x-branch']
> +object __org.qemu_x-Struct2
> + member array: __org.qemu_x-Union1List optional=False
> object __org.qemu_x-Union2
> base __org.qemu_x-Base
> tag __org.qemu_x-member1
> case __org.qemu_x-value: __org.qemu_x-Struct2
> -command __org.qemu_x-command q_obj___org.qemu_x-command-arg ->
> __org.qemu_x-Union1
> - gen=True success_response=True boxed=False
> -command boxed-struct UserDefZero -> None
> - gen=True success_response=True boxed=True
> -command boxed-union UserDefNativeListUnion -> None
> - gen=True success_response=True boxed=True
> -command guest-get-time q_obj_guest-get-time-arg -> int
> - gen=True success_response=True boxed=False
> -command guest-sync q_obj_guest-sync-arg -> any
> - gen=True success_response=True boxed=False
> -object q_empty
> -object q_obj_EVENT_C-arg
> - member a: int optional=True
> - member b: UserDefOne optional=True
> - member c: str optional=False
> -object q_obj_EVENT_D-arg
> - member a: EventStructOne optional=False
> - member b: str optional=False
> - member c: str optional=True
> - member enum3: EnumOne optional=True
> -object q_obj_UserDefFlatUnion2-base
> - member integer: int optional=True
> - member string: str optional=False
> - member enum1: QEnumTwo optional=False
> +alternate __org.qemu_x-Alt
> + tag type
> + case __org.qemu_x-branch: str
> + case b: __org.qemu_x-Base
> +event __ORG.QEMU_X-EVENT __org.qemu_x-Struct
> + boxed=False
> object q_obj___org.qemu_x-command-arg
> member a: __org.qemu_x-EnumList optional=False
> member b: __org.qemu_x-StructList optional=False
> member c: __org.qemu_x-Union2 optional=False
> member d: __org.qemu_x-Alt optional=False
> -object q_obj_anyList-wrapper
> - member data: anyList optional=False
> -object q_obj_boolList-wrapper
> - member data: boolList optional=False
> -object q_obj_guest-get-time-arg
> - member a: int optional=False
> - member b: int optional=True
> -object q_obj_guest-sync-arg
> - member arg: any optional=False
> -object q_obj_int16List-wrapper
> - member data: int16List optional=False
> -object q_obj_int32List-wrapper
> - member data: int32List optional=False
> -object q_obj_int64List-wrapper
> - member data: int64List optional=False
> -object q_obj_int8List-wrapper
> - member data: int8List optional=False
> -object q_obj_intList-wrapper
> - member data: intList optional=False
> -object q_obj_numberList-wrapper
> - member data: numberList optional=False
> -object q_obj_sizeList-wrapper
> - member data: sizeList optional=False
> -object q_obj_str-wrapper
> - member data: str optional=False
> -object q_obj_strList-wrapper
> - member data: strList optional=False
> -object q_obj_uint16List-wrapper
> - member data: uint16List optional=False
> -object q_obj_uint32List-wrapper
> - member data: uint32List optional=False
> -object q_obj_uint64List-wrapper
> - member data: uint64List optional=False
> -object q_obj_uint8List-wrapper
> - member data: uint8List optional=False
> -object q_obj_user_def_cmd1-arg
> - member ud1a: UserDefOne optional=False
> -object q_obj_user_def_cmd2-arg
> - member ud1a: UserDefOne optional=False
> - member ud1b: UserDefOne optional=True
> -command user_def_cmd None -> None
> - gen=True success_response=True boxed=False
> -command user_def_cmd0 Empty2 -> Empty2
> - gen=True success_response=True boxed=False
> -command user_def_cmd1 q_obj_user_def_cmd1-arg -> None
> - gen=True success_response=True boxed=False
> -command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
> +command __org.qemu_x-command q_obj___org.qemu_x-command-arg ->
> __org.qemu_x-Union1
> gen=True success_response=True boxed=False
> --
> 2.13.6
>
[Qemu-devel] [PATCH v2 13/29] qapi: Lift error reporting from QAPISchema.__init__() to callers, Markus Armbruster, 2018/02/11