qapi: Assert incomplete object occurs only in dealloc visitor

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200424084338.26803-7-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2020-04-24 10:43:29 +02:00
parent 554d6586ae
commit 8e08bf4ea2
4 changed files with 16 additions and 0 deletions

View file

@ -1446,6 +1446,8 @@ Example:
goto out; goto out;
} }
if (!*obj) { if (!*obj) {
/* incomplete */
assert(visit_is_dealloc(v));
goto out_obj; goto out_obj;
} }
visit_type_UserDefOne_members(v, *obj, &err); visit_type_UserDefOne_members(v, *obj, &err);

View file

@ -479,6 +479,11 @@ void visit_type_enum(Visitor *v, const char *name, int *obj,
*/ */
bool visit_is_input(Visitor *v); bool visit_is_input(Visitor *v);
/*
* Check if visitor is a dealloc visitor.
*/
bool visit_is_dealloc(Visitor *v);
/*** Visiting built-in types ***/ /*** Visiting built-in types ***/
/* /*

View file

@ -142,6 +142,11 @@ bool visit_is_input(Visitor *v)
return v->type == VISITOR_INPUT; return v->type == VISITOR_INPUT;
} }
bool visit_is_dealloc(Visitor *v)
{
return v->type == VISITOR_DEALLOC;
}
void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp) void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp)
{ {
assert(obj); assert(obj);

View file

@ -189,6 +189,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
goto out; goto out;
} }
if (!*obj) { if (!*obj) {
/* incomplete */
assert(visit_is_dealloc(v));
goto out_obj; goto out_obj;
} }
switch ((*obj)->type) { switch ((*obj)->type) {
@ -260,6 +262,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
goto out; goto out;
} }
if (!*obj) { if (!*obj) {
/* incomplete */
assert(visit_is_dealloc(v));
goto out_obj; goto out_obj;
} }
visit_type_%(c_name)s_members(v, *obj, &err); visit_type_%(c_name)s_members(v, *obj, &err);