Eric Blake <ebl...@redhat.com> writes: > Rather than making the dealloc visitor track of stack of pointers > remembered during visit_start_* in order to free them during > visit_end_*, it's a lot easier to just make all callers pass the > same pointer to visit_end_*. The generated code has access to the > same pointer, while all other users are doing virtual walks and > can pass NULL. The dealloc visitor is then greatly simplified. > > All three visit_end_*() functions intentionally take a void**, > even though the visit_start_*() functions differ between void**, > GenericList**, and GenericAlternate**. This is done for several > reasons: when doing a virtual walk, passing NULL doesn't care > what the type is, but when doing a generated walk, we already > have to cast the caller's specific FOO* to call visit_start, > while using void** lets us use visit_end without a cast. Also, > an upcoming patch will add a clone visitor that wants to use > the same implementation for all three visit_end callbacks, > which is made easier if all three share the same signature. > > Signed-off-by: Eric Blake <ebl...@redhat.com> [...] > diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c > index aea90a1..84f32fc 100644 > --- a/qapi/qmp-input-visitor.c > +++ b/qapi/qmp-input-visitor.c > @@ -145,7 +145,7 @@ static void qmp_input_check_struct(Visitor *v, Error > **errp) > } > } > > -static void qmp_input_pop(Visitor *v) > +static void qmp_input_pop(Visitor *v, void **obj) > { > QmpInputVisitor *qiv = to_qiv(v); > StackObject *tos = &qiv->stack[qiv->nb_stack - 1];
You could assert @obj matches tos->obj. Same for the other visitors that still need a stack. Adding a stack to the ones that don't just for the assertion seems excessive, though. [...]