Eric Blake <ebl...@redhat.com> writes: > The macro DO_UPCAST() is incorrectly named: it converts from a > parent class to a derived class (which is a downcast). Better, > and more consistent with some of the other qapi visitors, is > to use the container_of() macro through a to_FOO() helper. > > Our current definition of container_of() is weaker than > DO_UPCAST(), in that it does not require the derived class to > have Visitor as its first member, but this does not hurt our > usage patterns in qapi visitors. > > Signed-off-by: Eric Blake <ebl...@redhat.com> > Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > > --- > v9: no change > v8: no change > v7: new patch > --- > qapi/opts-visitor.c | 28 +++++++++++++++++----------- > qapi/string-input-visitor.c | 23 ++++++++++++++--------- > qapi/string-output-visitor.c | 21 +++++++++++++-------- > 3 files changed, 44 insertions(+), 28 deletions(-) > > diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c > index ef5fb8b..dd4094c 100644 > --- a/qapi/opts-visitor.c > +++ b/qapi/opts-visitor.c > @@ -89,6 +89,12 @@ struct OptsVisitor > }; > > > +static OptsVisitor *to_ov(Visitor *v) > +{ > + return container_of(v, OptsVisitor, visitor); > +} > + > +
The name to_ov() is rather laconic even for my taste. Tolerable, since it's static. > static void > destroy_list(gpointer list) > { > @@ -121,7 +127,7 @@ static void > opts_start_struct(Visitor *v, void **obj, const char *kind, > const char *name, size_t size, Error **errp) > { > - OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v); > + OptsVisitor *ov = to_ov(v); > const QemuOpt *opt; > > if (obj) { Much clearer! [...] Patch gets rid of all DO_UPCAST() in qapi/. PATCH 33 brings one back; it should use to_ov() instead.