Revision d195325b scripts/qapi-visit.py

b/scripts/qapi-visit.py
17 17
import getopt
18 18
import errno
19 19

  
20
def generate_visit_struct_body(field_prefix, members):
21
    ret = ""
20
def generate_visit_struct_body(field_prefix, name, members):
21
    ret = mcgen('''
22
if (!error_is_set(errp)) {
23
''')
24
    push_indent()
25

  
22 26
    if len(field_prefix):
23 27
        field_prefix = field_prefix + "."
28
        ret += mcgen('''
29
Error **errp = &err; /* from outer scope */
30
Error *err = NULL;
31
visit_start_struct(m, NULL, "", "%(name)s", 0, &err);
32
''',
33
                name=name)
34
    else:
35
        ret += mcgen('''
36
Error *err = NULL;
37
visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err);
38
''',
39
                name=name)
40

  
41
    ret += mcgen('''
42
if (!err) {
43
    if (!obj || *obj) {
44
''')
45

  
46
    push_indent()
47
    push_indent()
24 48
    for argname, argentry, optional, structured in parse_args(members):
25 49
        if optional:
26 50
            ret += mcgen('''
27
visit_start_optional(m, (obj && *obj) ? &(*obj)->%(c_prefix)shas_%(c_name)s : NULL, "%(name)s", errp);
28
if ((*obj)->%(prefix)shas_%(c_name)s) {
51
visit_start_optional(m, obj ? &(*obj)->%(c_prefix)shas_%(c_name)s : NULL, "%(name)s", &err);
52
if (obj && (*obj)->%(prefix)shas_%(c_name)s) {
29 53
''',
30 54
                         c_prefix=c_var(field_prefix), prefix=field_prefix,
31 55
                         c_name=c_var(argname), name=argname)
32 56
            push_indent()
33 57

  
34 58
        if structured:
35
            ret += mcgen('''
36
visit_start_struct(m, NULL, "", "%(name)s", 0, errp);
37
''',
38
                         name=argname)
39
            ret += generate_visit_struct_body(field_prefix + argname, argentry)
40
            ret += mcgen('''
41
visit_end_struct(m, errp);
42
''')
59
            ret += generate_visit_struct_body(field_prefix + argname, argname, argentry)
43 60
        else:
44 61
            ret += mcgen('''
45
visit_type_%(type)s(m, (obj && *obj) ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, "%(name)s", errp);
62
visit_type_%(type)s(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, "%(name)s", &err);
46 63
''',
47 64
                         c_prefix=c_var(field_prefix), prefix=field_prefix,
48 65
                         type=type_name(argentry), c_name=c_var(argname),
......
52 69
            pop_indent()
53 70
            ret += mcgen('''
54 71
}
55
visit_end_optional(m, errp);
72
visit_end_optional(m, &err);
73
''')
74

  
75
    pop_indent()
76
    ret += mcgen('''
77

  
78
    error_propagate(errp, err);
79
    err = NULL;
80
}
81
''')
82

  
83
    pop_indent()
84
    pop_indent()
85
    ret += mcgen('''
86
        /* Always call end_struct if start_struct succeeded.  */
87
        visit_end_struct(m, &err);
88
    }
89
    error_propagate(errp, err);
90
}
56 91
''')
57 92
    return ret
58 93

  
......
61 96

  
62 97
void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **errp)
63 98
{
64
    if (error_is_set(errp)) {
65
        return;
66
    }
67
    visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), errp);
68
    if (obj && !*obj) {
69
        goto end;
70
    }
71 99
''',
72 100
                name=name)
101

  
73 102
    push_indent()
74
    ret += generate_visit_struct_body("", members)
103
    ret += generate_visit_struct_body("", name, members)
75 104
    pop_indent()
76 105

  
77 106
    ret += mcgen('''
78
end:
79
    visit_end_struct(m, errp);
80 107
}
81 108
''')
82 109
    return ret
......
87 114
void visit_type_%(name)sList(Visitor *m, %(name)sList ** obj, const char *name, Error **errp)
88 115
{
89 116
    GenericList *i, **prev = (GenericList **)obj;
117
    Error *err = NULL;
90 118

  
91
    if (error_is_set(errp)) {
92
        return;
93
    }
94
    visit_start_list(m, name, errp);
95

  
96
    for (; (i = visit_next_list(m, prev, errp)) != NULL; prev = &i) {
97
        %(name)sList *native_i = (%(name)sList *)i;
98
        visit_type_%(name)s(m, &native_i->value, NULL, errp);
119
    if (!error_is_set(errp)) {
120
        visit_start_list(m, name, &err);
121
        if (!err) {
122
            for (; (i = visit_next_list(m, prev, &err)) != NULL; prev = &i) {
123
                %(name)sList *native_i = (%(name)sList *)i;
124
                visit_type_%(name)s(m, &native_i->value, NULL, &err);
125
            }
126
            error_propagate(errp, err);
127
            err = NULL;
128

  
129
            /* Always call end_list if start_list succeeded.  */
130
            visit_end_list(m, &err);
131
        }
132
        error_propagate(errp, err);
99 133
    }
100

  
101
    visit_end_list(m, errp);
102 134
}
103 135
''',
104 136
                name=name)
......
122 154
{
123 155
    Error *err = NULL;
124 156

  
125
    if (error_is_set(errp)) {
126
        return;
127
    }
128
    visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err);
129
    if (obj && !*obj) {
130
        goto end;
131
    }
132
    visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err);
133
    if (err) {
134
        error_propagate(errp, err);
135
        goto end;
136
    }
137
    switch ((*obj)->kind) {
157
    if (!error_is_set(errp)) {
158
        visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err);
159
        if (!err) {
160
            if (!obj || *obj) {
161
                visit_type_%(name)sKind(m, &(*obj)->kind, "type", &err);
162
                if (!err) {
163
                    switch ((*obj)->kind) {
138 164
''',
139 165
                 name=name)
140 166

  
167
    push_indent()
168
    push_indent()
141 169
    for key in members:
142 170
        ret += mcgen('''
143
    case %(abbrev)s_KIND_%(enum)s:
144
        visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, "data", errp);
145
        break;
171
            case %(abbrev)s_KIND_%(enum)s:
172
                visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, "data", &err);
173
                break;
146 174
''',
147 175
                abbrev = de_camel_case(name).upper(),
148 176
                enum = c_fun(de_camel_case(key)).upper(),
......
150 178
                c_name=c_fun(key))
151 179

  
152 180
    ret += mcgen('''
153
    default:
154
        abort();
181
            default:
182
                abort();
183
            }
184
        }
185
        error_propagate(errp, err);
186
        err = NULL;
187
    }
188
''')
189
    pop_indent()
190
    ret += mcgen('''
191
        /* Always call end_struct if start_struct succeeded.  */
192
        visit_end_struct(m, &err);
155 193
    }
156
end:
157
    visit_end_struct(m, errp);
194
    error_propagate(errp, err);
195
}
196
''')
197

  
198
    pop_indent();
199
    ret += mcgen('''
158 200
}
159 201
''')
160 202

  

Also available in: Unified diff