]>
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 <[email protected]> | |
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 | ||
0b2a0d6b | 25 | static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj, |
337283df | 26 | size_t unused, Error **errp) |
d5f3c29c | 27 | { |
d5f3c29c MR |
28 | } |
29 | ||
1158bb2a | 30 | static void qapi_dealloc_end_struct(Visitor *v, void **obj) |
d5f3c29c | 31 | { |
d5f3c29c | 32 | if (obj) { |
7267c094 | 33 | g_free(*obj); |
d5f3c29c MR |
34 | } |
35 | } | |
36 | ||
dbf11922 EB |
37 | static void qapi_dealloc_start_alternate(Visitor *v, const char *name, |
38 | GenericAlternate **obj, size_t size, | |
60390d2d | 39 | Error **errp) |
3dce9cad | 40 | { |
3dce9cad WX |
41 | } |
42 | ||
1158bb2a | 43 | static void qapi_dealloc_end_alternate(Visitor *v, void **obj) |
3dce9cad | 44 | { |
3dce9cad WX |
45 | if (obj) { |
46 | g_free(*obj); | |
47 | } | |
48 | } | |
49 | ||
d9f62dde EB |
50 | static void qapi_dealloc_start_list(Visitor *v, const char *name, |
51 | GenericList **list, size_t size, | |
52 | Error **errp) | |
d5f3c29c MR |
53 | { |
54 | } | |
55 | ||
d9f62dde | 56 | static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList *tail, |
e65d89bf | 57 | size_t size) |
d5f3c29c | 58 | { |
d9f62dde EB |
59 | GenericList *next = tail->next; |
60 | g_free(tail); | |
61 | return next; | |
d5f3c29c MR |
62 | } |
63 | ||
1158bb2a | 64 | static void qapi_dealloc_end_list(Visitor *v, void **obj) |
d5f3c29c MR |
65 | { |
66 | } | |
67 | ||
0b2a0d6b | 68 | static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, |
d5f3c29c MR |
69 | Error **errp) |
70 | { | |
b690d679 PL |
71 | if (obj) { |
72 | g_free(*obj); | |
73 | } | |
d5f3c29c MR |
74 | } |
75 | ||
0b2a0d6b | 76 | static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj, |
4c40314a | 77 | Error **errp) |
d5f3c29c MR |
78 | { |
79 | } | |
80 | ||
0b2a0d6b EB |
81 | static void qapi_dealloc_type_uint64(Visitor *v, const char *name, |
82 | uint64_t *obj, Error **errp) | |
f755dea7 EB |
83 | { |
84 | } | |
85 | ||
0b2a0d6b | 86 | static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, |
d5f3c29c MR |
87 | Error **errp) |
88 | { | |
89 | } | |
90 | ||
0b2a0d6b | 91 | static void qapi_dealloc_type_number(Visitor *v, const char *name, double *obj, |
d5f3c29c MR |
92 | Error **errp) |
93 | { | |
94 | } | |
95 | ||
0b2a0d6b EB |
96 | static void qapi_dealloc_type_anything(Visitor *v, const char *name, |
97 | QObject **obj, Error **errp) | |
28770e05 MA |
98 | { |
99 | if (obj) { | |
cb3e7f08 | 100 | qobject_unref(*obj); |
28770e05 MA |
101 | } |
102 | } | |
103 | ||
d2f95f4d MA |
104 | static void qapi_dealloc_type_null(Visitor *v, const char *name, |
105 | QNull **obj, Error **errp) | |
3bc97fd5 | 106 | { |
d2f95f4d | 107 | if (obj) { |
cb3e7f08 | 108 | qobject_unref(*obj); |
d2f95f4d | 109 | } |
3bc97fd5 EB |
110 | } |
111 | ||
2c0ef9f4 | 112 | static void qapi_dealloc_free(Visitor *v) |
d5f3c29c | 113 | { |
2c0ef9f4 | 114 | g_free(container_of(v, QapiDeallocVisitor, visitor)); |
d5f3c29c MR |
115 | } |
116 | ||
2c0ef9f4 | 117 | Visitor *qapi_dealloc_visitor_new(void) |
d5f3c29c MR |
118 | { |
119 | QapiDeallocVisitor *v; | |
120 | ||
7267c094 | 121 | v = g_malloc0(sizeof(*v)); |
d5f3c29c | 122 | |
983f52d4 | 123 | v->visitor.type = VISITOR_DEALLOC; |
d5f3c29c MR |
124 | v->visitor.start_struct = qapi_dealloc_start_struct; |
125 | v->visitor.end_struct = qapi_dealloc_end_struct; | |
dbf11922 EB |
126 | v->visitor.start_alternate = qapi_dealloc_start_alternate; |
127 | v->visitor.end_alternate = qapi_dealloc_end_alternate; | |
d5f3c29c MR |
128 | v->visitor.start_list = qapi_dealloc_start_list; |
129 | v->visitor.next_list = qapi_dealloc_next_list; | |
130 | v->visitor.end_list = qapi_dealloc_end_list; | |
4c40314a | 131 | v->visitor.type_int64 = qapi_dealloc_type_int64; |
f755dea7 | 132 | v->visitor.type_uint64 = qapi_dealloc_type_uint64; |
d5f3c29c MR |
133 | v->visitor.type_bool = qapi_dealloc_type_bool; |
134 | v->visitor.type_str = qapi_dealloc_type_str; | |
135 | v->visitor.type_number = qapi_dealloc_type_number; | |
28770e05 | 136 | v->visitor.type_any = qapi_dealloc_type_anything; |
3bc97fd5 | 137 | v->visitor.type_null = qapi_dealloc_type_null; |
2c0ef9f4 | 138 | v->visitor.free = qapi_dealloc_free; |
d5f3c29c | 139 | |
2c0ef9f4 | 140 | return &v->visitor; |
d5f3c29c | 141 | } |