]> git.proxmox.com Git - mirror_qemu.git/commitdiff
qapi: Assert incomplete object occurs only in dealloc visitor
authorMarkus Armbruster <armbru@redhat.com>
Fri, 24 Apr 2020 08:43:29 +0000 (10:43 +0200)
committerMarkus Armbruster <armbru@redhat.com>
Thu, 30 Apr 2020 04:51:15 +0000 (06:51 +0200)
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200424084338.26803-7-armbru@redhat.com>

docs/devel/qapi-code-gen.txt
include/qapi/visitor.h
qapi/qapi-visit-core.c
scripts/qapi/visit.py

index 1967adfa9237997127ef1a6d90bef74af41e618a..c6dd1891c318d633e7df6fe8ce601fb44af020f0 100644 (file)
@@ -1446,6 +1446,8 @@ Example:
             goto out;
         }
         if (!*obj) {
+            /* incomplete */
+            assert(visit_is_dealloc(v));
             goto out_obj;
         }
         visit_type_UserDefOne_members(v, *obj, &err);
index a425ea514c516f62e9582caccc97b0c9c7f35806..2d40d2fe0f75b6361b796c29648c588a14274a63 100644 (file)
@@ -479,6 +479,11 @@ void visit_type_enum(Visitor *v, const char *name, int *obj,
  */
 bool visit_is_input(Visitor *v);
 
+/*
+ * Check if visitor is a dealloc visitor.
+ */
+bool visit_is_dealloc(Visitor *v);
+
 /*** Visiting built-in types ***/
 
 /*
index 5365561b07c461c0d1da352f5d68da9f455a3bc1..d4aac206cf4712f0f39182f734ae4ebb6aafa5da 100644 (file)
@@ -142,6 +142,11 @@ bool visit_is_input(Visitor *v)
     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)
 {
     assert(obj);
index 23d9194aa4859b3872ad9409402c418445040edb..e3467b770b75a2563b25a6b1dabcb3f88651cbeb 100644 (file)
@@ -189,6 +189,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
         goto out;
     }
     if (!*obj) {
+        /* incomplete */
+        assert(visit_is_dealloc(v));
         goto out_obj;
     }
     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;
     }
     if (!*obj) {
+        /* incomplete */
+        assert(visit_is_dealloc(v));
         goto out_obj;
     }
     visit_type_%(c_name)s_members(v, *obj, &err);