aboutsummaryrefslogtreecommitdiff
path: root/qapi/string-input-visitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'qapi/string-input-visitor.c')
-rw-r--r--qapi/string-input-visitor.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index 0690abb..8dfa561 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -30,6 +30,7 @@ struct StringInputVisitor
int64_t cur;
const char *string;
+ void *list; /* Only needed for sanity checking the caller */
};
static StringInputVisitor *to_siv(Visitor *v)
@@ -120,6 +121,7 @@ start_list(Visitor *v, const char *name, GenericList **list, size_t size,
/* We don't support visits without a list */
assert(list);
+ siv->list = list;
if (parse_str(siv, name, errp) < 0) {
*list = NULL;
@@ -168,8 +170,11 @@ static GenericList *next_list(Visitor *v, GenericList *tail, size_t size)
return tail->next;
}
-static void end_list(Visitor *v)
+static void end_list(Visitor *v, void **obj)
{
+ StringInputVisitor *siv = to_siv(v);
+
+ assert(siv->list == obj);
}
static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
@@ -321,19 +326,16 @@ static void parse_optional(Visitor *v, const char *name, bool *present)
*present = true;
}
-Visitor *string_input_get_visitor(StringInputVisitor *v)
+static void string_input_free(Visitor *v)
{
- return &v->visitor;
-}
+ StringInputVisitor *siv = to_siv(v);
-void string_input_visitor_cleanup(StringInputVisitor *v)
-{
- g_list_foreach(v->ranges, free_range, NULL);
- g_list_free(v->ranges);
- g_free(v);
+ g_list_foreach(siv->ranges, free_range, NULL);
+ g_list_free(siv->ranges);
+ g_free(siv);
}
-StringInputVisitor *string_input_visitor_new(const char *str)
+Visitor *string_input_visitor_new(const char *str)
{
StringInputVisitor *v;
@@ -350,7 +352,8 @@ StringInputVisitor *string_input_visitor_new(const char *str)
v->visitor.next_list = next_list;
v->visitor.end_list = end_list;
v->visitor.optional = parse_optional;
+ v->visitor.free = string_input_free;
v->string = str;
- return v;
+ return &v->visitor;
}