@@ -29,10 +29,9 @@ typedef struct OptsVisitor OptsVisitor;
* - values below INT64_MIN or LLONG_MIN are rejected,
* - values above INT64_MAX or LLONG_MAX are rejected.
*
- * The Opts input visitor does not implement support for visiting QAPI
- * alternates, numbers (other than integers), null, or arbitrary
- * QTypes. It also requires a non-null list argument to
- * visit_start_list().
+ * The Opts input visitor does not implement support for visiting numbers
+ * (other than integers), null, or arbitrary QTypes. It also requires a
+ * non-null list argument to visit_start_list().
*/
Visitor *opts_visitor_new(const QemuOpts *opts);
@@ -156,6 +156,13 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
}
}
+static void
+opts_start_alternate(Visitor *v, const char *name, GenericAlternate **obj,
+ size_t size, Error **errp)
+{
+ opts_start_struct(v, name, (void **)obj, size, errp);
+}
+
static void
opts_check_struct(Visitor *v, Error **errp)
@@ -198,6 +205,12 @@ opts_end_struct(Visitor *v, void **obj)
ov->fake_id_opt = NULL;
}
+static void
+opts_end_alternate(Visitor *v, void **obj)
+{
+ opts_end_struct(v, obj);
+}
+
static GQueue *
lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp)
@@ -547,6 +560,9 @@ opts_visitor_new(const QemuOpts *opts)
ov->visitor.check_struct = &opts_check_struct;
ov->visitor.end_struct = &opts_end_struct;
+ ov->visitor.start_alternate = &opts_start_alternate;
+ ov->visitor.end_alternate = &opts_end_alternate;
+
ov->visitor.start_list = &opts_start_list;
ov->visitor.next_list = &opts_next_list;
ov->visitor.check_list = &opts_check_list;
They are required for flat unions (you still have to allocate the structs). Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com> --- include/qapi/opts-visitor.h | 7 +++---- qapi/opts-visitor.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-)