#include "qapi/qmp/types.h"
#include "qapi/visitor-impl.h"
-typedef struct StackEntry
-{
- void *value;
- QTAILQ_ENTRY(StackEntry) node;
-} StackEntry;
-
struct QapiDeallocVisitor
{
Visitor visitor;
- QTAILQ_HEAD(, StackEntry) stack;
};
-static QapiDeallocVisitor *to_qov(Visitor *v)
-{
- return container_of(v, QapiDeallocVisitor, visitor);
-}
-
-static void qapi_dealloc_push(QapiDeallocVisitor *qov, void *value)
-{
- StackEntry *e = g_malloc0(sizeof(*e));
-
- e->value = value;
-
- QTAILQ_INSERT_HEAD(&qov->stack, e, node);
-}
-
-static void *qapi_dealloc_pop(QapiDeallocVisitor *qov)
-{
- StackEntry *e = QTAILQ_FIRST(&qov->stack);
- QObject *value;
- QTAILQ_REMOVE(&qov->stack, e, node);
- value = e->value;
- g_free(e);
- return value;
-}
-
static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj,
size_t unused, Error **errp)
{
- QapiDeallocVisitor *qov = to_qov(v);
- qapi_dealloc_push(qov, obj);
}
-static void qapi_dealloc_end_struct(Visitor *v)
+static void qapi_dealloc_end_struct(Visitor *v, void **obj)
{
- QapiDeallocVisitor *qov = to_qov(v);
- void **obj = qapi_dealloc_pop(qov);
if (obj) {
g_free(*obj);
}
static void qapi_dealloc_start_alternate(Visitor *v, const char *name,
GenericAlternate **obj, size_t size,
- bool promote_int, Error **errp)
+ Error **errp)
{
- QapiDeallocVisitor *qov = to_qov(v);
- qapi_dealloc_push(qov, obj);
}
-static void qapi_dealloc_end_alternate(Visitor *v)
+static void qapi_dealloc_end_alternate(Visitor *v, void **obj)
{
- QapiDeallocVisitor *qov = to_qov(v);
- void **obj = qapi_dealloc_pop(qov);
if (obj) {
g_free(*obj);
}
return next;
}
-static void qapi_dealloc_end_list(Visitor *v)
+static void qapi_dealloc_end_list(Visitor *v, void **obj)
{
}
{
}
-Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v)
+static void qapi_dealloc_free(Visitor *v)
{
- return &v->visitor;
+ g_free(container_of(v, QapiDeallocVisitor, visitor));
}
-void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *v)
-{
- g_free(v);
-}
-
-QapiDeallocVisitor *qapi_dealloc_visitor_new(void)
+Visitor *qapi_dealloc_visitor_new(void)
{
QapiDeallocVisitor *v;
v->visitor.type_number = qapi_dealloc_type_number;
v->visitor.type_any = qapi_dealloc_type_anything;
v->visitor.type_null = qapi_dealloc_type_null;
+ v->visitor.free = qapi_dealloc_free;
- QTAILQ_INIT(&v->stack);
-
- return v;
+ return &v->visitor;
}