On 06/01/2016 09:36 AM, Markus Armbruster wrote: > 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.
At this point, only the QMP visitors track a stack (the OptsVisitor does not, and we just got rid of the dealloc visitor stack); but since the string visitors only support a top-level visit with no struct or nested list, those can also support an assert. That makes 4 of the 6 visitors at this stage in the series; and only 4/8 when the clone and json visitors are added. I'll go ahead and add it in, though. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature