]>
Commit | Line | Data |
---|---|---|
d5f3c29c MR |
1 | /* |
2 | * Dealloc Visitor | |
3 | * | |
08f9541d | 4 | * Copyright (C) 2012-2016 Red Hat, Inc. |
d5f3c29c MR |
5 | * Copyright IBM, Corp. 2011 |
6 | * | |
7 | * Authors: | |
8 | * Michael Roth <mdroth@linux.vnet.ibm.com> | |
9 | * | |
10 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. | |
11 | * See the COPYING.LIB file in the top-level directory. | |
12 | * | |
13 | */ | |
14 | ||
cbf21151 | 15 | #include "qemu/osdep.h" |
7b1b5d19 | 16 | #include "qapi/dealloc-visitor.h" |
15280c36 | 17 | #include "qapi/qmp/qnull.h" |
7b1b5d19 | 18 | #include "qapi/visitor-impl.h" |
d5f3c29c | 19 | |
d5f3c29c MR |
20 | struct QapiDeallocVisitor |
21 | { | |
22 | Visitor visitor; | |
d5f3c29c MR |
23 | }; |
24 | ||
012d4c96 | 25 | static bool qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj, |
337283df | 26 | size_t unused, Error **errp) |
d5f3c29c | 27 | { |
012d4c96 | 28 | return true; |
d5f3c29c MR |
29 | } |
30 | ||
1158bb2a | 31 | static void qapi_dealloc_end_struct(Visitor *v, void **obj) |
d5f3c29c | 32 | { |
d5f3c29c | 33 | if (obj) { |
7267c094 | 34 | g_free(*obj); |
d5f3c29c MR |
35 | } |
36 | } | |
37 | ||
1158bb2a | 38 | static void qapi_dealloc_end_alternate(Visitor *v, void **obj) |
3dce9cad | 39 | { |
3dce9cad WX |
40 | if (obj) { |
41 | g_free(*obj); | |
42 | } | |
43 | } | |
44 | ||
012d4c96 | 45 | static bool qapi_dealloc_start_list(Visitor *v, const char *name, |
d9f62dde EB |
46 | GenericList **list, size_t size, |
47 | Error **errp) | |
d5f3c29c | 48 | { |
012d4c96 | 49 | return true; |
d5f3c29c MR |
50 | } |
51 | ||
d9f62dde | 52 | static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList *tail, |
e65d89bf | 53 | size_t size) |
d5f3c29c | 54 | { |
d9f62dde EB |
55 | GenericList *next = tail->next; |
56 | g_free(tail); | |
57 | return next; | |
d5f3c29c MR |
58 | } |
59 | ||
1158bb2a | 60 | static void qapi_dealloc_end_list(Visitor *v, void **obj) |
d5f3c29c MR |
61 | { |
62 | } | |
63 | ||
012d4c96 | 64 | static bool qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, |
d5f3c29c MR |
65 | Error **errp) |
66 | { | |
b690d679 PL |
67 | if (obj) { |
68 | g_free(*obj); | |
69 | } | |
012d4c96 | 70 | return true; |
d5f3c29c MR |
71 | } |
72 | ||
012d4c96 | 73 | static bool qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj, |
4c40314a | 74 | Error **errp) |
d5f3c29c | 75 | { |
012d4c96 | 76 | return true; |
d5f3c29c MR |
77 | } |
78 | ||
012d4c96 | 79 | static bool qapi_dealloc_type_uint64(Visitor *v, const char *name, |
0b2a0d6b | 80 | uint64_t *obj, Error **errp) |
f755dea7 | 81 | { |
012d4c96 | 82 | return true; |
f755dea7 EB |
83 | } |
84 | ||
012d4c96 | 85 | static bool qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, |
d5f3c29c MR |
86 | Error **errp) |
87 | { | |
012d4c96 | 88 | return true; |
d5f3c29c MR |
89 | } |
90 | ||
012d4c96 | 91 | static bool qapi_dealloc_type_number(Visitor *v, const char *name, double *obj, |
d5f3c29c MR |
92 | Error **errp) |
93 | { | |
012d4c96 | 94 | return true; |
d5f3c29c MR |
95 | } |
96 | ||
012d4c96 | 97 | static bool qapi_dealloc_type_anything(Visitor *v, const char *name, |
0b2a0d6b | 98 | QObject **obj, Error **errp) |
28770e05 MA |
99 | { |
100 | if (obj) { | |
cb3e7f08 | 101 | qobject_unref(*obj); |
28770e05 | 102 | } |
012d4c96 | 103 | return true; |
28770e05 MA |
104 | } |
105 | ||
012d4c96 | 106 | static bool qapi_dealloc_type_null(Visitor *v, const char *name, |
d2f95f4d | 107 | QNull **obj, Error **errp) |
3bc97fd5 | 108 | { |
d2f95f4d | 109 | if (obj) { |
cb3e7f08 | 110 | qobject_unref(*obj); |
d2f95f4d | 111 | } |
012d4c96 | 112 | return true; |
3bc97fd5 EB |
113 | } |
114 | ||
2c0ef9f4 | 115 | static void qapi_dealloc_free(Visitor *v) |
d5f3c29c | 116 | { |
2c0ef9f4 | 117 | g_free(container_of(v, QapiDeallocVisitor, visitor)); |
d5f3c29c MR |
118 | } |
119 | ||
2c0ef9f4 | 120 | Visitor *qapi_dealloc_visitor_new(void) |
d5f3c29c MR |
121 | { |
122 | QapiDeallocVisitor *v; | |
123 | ||
7267c094 | 124 | v = g_malloc0(sizeof(*v)); |
d5f3c29c | 125 | |
983f52d4 | 126 | v->visitor.type = VISITOR_DEALLOC; |
d5f3c29c MR |
127 | v->visitor.start_struct = qapi_dealloc_start_struct; |
128 | v->visitor.end_struct = qapi_dealloc_end_struct; | |
dbf11922 | 129 | v->visitor.end_alternate = qapi_dealloc_end_alternate; |
d5f3c29c MR |
130 | v->visitor.start_list = qapi_dealloc_start_list; |
131 | v->visitor.next_list = qapi_dealloc_next_list; | |
132 | v->visitor.end_list = qapi_dealloc_end_list; | |
4c40314a | 133 | v->visitor.type_int64 = qapi_dealloc_type_int64; |
f755dea7 | 134 | v->visitor.type_uint64 = qapi_dealloc_type_uint64; |
d5f3c29c MR |
135 | v->visitor.type_bool = qapi_dealloc_type_bool; |
136 | v->visitor.type_str = qapi_dealloc_type_str; | |
137 | v->visitor.type_number = qapi_dealloc_type_number; | |
28770e05 | 138 | v->visitor.type_any = qapi_dealloc_type_anything; |
3bc97fd5 | 139 | v->visitor.type_null = qapi_dealloc_type_null; |
2c0ef9f4 | 140 | v->visitor.free = qapi_dealloc_free; |
d5f3c29c | 141 | |
2c0ef9f4 | 142 | return &v->visitor; |
d5f3c29c | 143 | } |