Marc-André Lureau <marcandre.lur...@redhat.com> writes: > We commonly initialize attributes to None in .init(), then set their > real value in .check(). Accessing the attribute before .check() > yields None. If we're lucky, the code that accesses the attribute > prematurely chokes on None. > > It won't for .ifcond, because None is a legitimate value. > > Leave the ifcond attribute undefined until check(). > > Suggested-by: Markus Armbruster <arm...@redhat.com> > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > Reviewed-by: Markus Armbruster <arm...@redhat.com>
Note to self: consider squashing into previous patch. > --- > scripts/qapi/common.py | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py > index 4f4014b387..46e33e23e4 100644 > --- a/scripts/qapi/common.py > +++ b/scripts/qapi/common.py > @@ -1021,13 +1021,19 @@ class QAPISchemaEntity(object): > # such place). > self.info = info > self.doc = doc > - self.ifcond = listify_cond(ifcond) > + self._ifcond = ifcond # self.ifcond is set only after .check() > > def c_name(self): > return c_name(self.name) > > def check(self, schema): > - pass > + if isinstance(self._ifcond, QAPISchemaType): > + # inherit the condition from a type > + typ = self._ifcond > + typ.check(schema) > + self.ifcond = typ.ifcond > + else: > + self.ifcond = listify_cond(self._ifcond) > > def is_implicit(self): > return not self.info One of the questions I had on v5 of this patch is still open. I asked whether we can restrict the inheritance feature to array elements. You pointed to implicit object types. I asked for an example (because I couldn't figure out what you meant). Please reply in that thread. [...]