Revision 776574d6 scripts/qapi-commands.py
b/scripts/qapi-commands.py | ||
---|---|---|
167 | 167 |
pop_indent() |
168 | 168 |
return ret.rstrip() |
169 | 169 |
|
170 |
def gen_marshal_output(name, args, ret_type): |
|
170 |
def gen_marshal_output(name, args, ret_type, middle_mode):
|
|
171 | 171 |
if not ret_type: |
172 | 172 |
return "" |
173 |
|
|
173 | 174 |
ret = mcgen(''' |
174 | 175 |
static void qmp_marshal_output_%(c_name)s(%(c_ret_type)s ret_in, QObject **ret_out, Error **errp) |
175 | 176 |
{ |
... | ... | |
188 | 189 |
qapi_dealloc_visitor_cleanup(md); |
189 | 190 |
} |
190 | 191 |
''', |
191 |
c_ret_type=c_type(ret_type), c_name=c_var(name), ret_type=ret_type) |
|
192 |
c_ret_type=c_type(ret_type), c_name=c_var(name), |
|
193 |
ret_type=ret_type) |
|
192 | 194 |
|
193 | 195 |
return ret |
194 | 196 |
|
195 |
def gen_marshal_input(name, args, ret_type): |
|
197 |
def gen_marshal_input_decl(name, args, ret_type, middle_mode): |
|
198 |
if middle_mode: |
|
199 |
return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_var(name) |
|
200 |
else: |
|
201 |
return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_var(name) |
|
202 |
|
|
203 |
|
|
204 |
|
|
205 |
def gen_marshal_input(name, args, ret_type, middle_mode): |
|
206 |
hdr = gen_marshal_input_decl(name, args, ret_type, middle_mode) |
|
207 |
|
|
196 | 208 |
ret = mcgen(''' |
197 |
static void qmp_marshal_input_%(c_name)s(QDict *args, QObject **ret, Error **errp)
|
|
209 |
%(header)s
|
|
198 | 210 |
{ |
199 | 211 |
''', |
200 |
c_name=c_var(name)) |
|
212 |
header=hdr) |
|
213 |
|
|
214 |
if middle_mode: |
|
215 |
ret += mcgen(''' |
|
216 |
Error *local_err = NULL; |
|
217 |
Error **errp = &local_err; |
|
218 |
QDict *args = (QDict *)qdict; |
|
219 |
''') |
|
201 | 220 |
|
202 | 221 |
if ret_type: |
203 | 222 |
if c_type(ret_type).endswith("*"): |
... | ... | |
220 | 239 |
visitor_input_containers_decl=gen_visitor_input_containers_decl(args), |
221 | 240 |
visitor_input_vars_decl=gen_visitor_input_vars_decl(args), |
222 | 241 |
visitor_input_block=gen_visitor_input_block(args, "QOBJECT(args)")) |
242 |
else: |
|
243 |
ret += mcgen(''' |
|
244 |
(void)args; |
|
245 |
''') |
|
223 | 246 |
|
224 | 247 |
ret += mcgen(''' |
225 | 248 |
if (error_is_set(errp)) { |
... | ... | |
234 | 257 |
''') |
235 | 258 |
ret += mcgen(''' |
236 | 259 |
%(visitor_input_block_cleanup)s |
260 |
''', |
|
261 |
visitor_input_block_cleanup=gen_visitor_input_block(args, None, |
|
262 |
dealloc=True)) |
|
263 |
|
|
264 |
if middle_mode: |
|
265 |
ret += mcgen(''' |
|
266 |
|
|
267 |
if (local_err) { |
|
268 |
qerror_report_err(local_err); |
|
269 |
error_free(local_err); |
|
270 |
return -1; |
|
271 |
} |
|
272 |
return 0; |
|
273 |
''') |
|
274 |
else: |
|
275 |
ret += mcgen(''' |
|
237 | 276 |
return; |
277 |
''') |
|
278 |
|
|
279 |
ret += mcgen(''' |
|
238 | 280 |
} |
239 |
''',
|
|
240 |
visitor_input_block_cleanup=gen_visitor_input_block(args, None, dealloc=True)) |
|
281 |
''')
|
|
282 |
|
|
241 | 283 |
return ret |
242 | 284 |
|
243 | 285 |
def gen_registry(commands): |
... | ... | |
284 | 326 |
#include "error.h" |
285 | 327 |
|
286 | 328 |
''', |
287 |
header=basename(h_file), guard=guardname(h_file), prefix=prefix)
|
|
329 |
header=basename(header), guard=guardname(header), prefix=prefix)
|
|
288 | 330 |
return ret |
289 | 331 |
|
290 | 332 |
def gen_command_def_prologue(prefix="", proxy=False): |
... | ... | |
317 | 359 |
prefix=prefix) |
318 | 360 |
if not proxy: |
319 | 361 |
ret += '#include "%sqmp-commands.h"' % prefix |
320 |
return ret + "\n" |
|
362 |
return ret + "\n\n"
|
|
321 | 363 |
|
322 | 364 |
|
323 | 365 |
try: |
324 |
opts, args = getopt.gnu_getopt(sys.argv[1:], "p:o:", ["prefix=", "output-dir=", "type="])
|
|
366 |
opts, args = getopt.gnu_getopt(sys.argv[1:], "p:o:m", ["prefix=", "output-dir=", "type=", "middle"])
|
|
325 | 367 |
except getopt.GetoptError, err: |
326 | 368 |
print str(err) |
327 | 369 |
sys.exit(1) |
... | ... | |
331 | 373 |
dispatch_type = "sync" |
332 | 374 |
c_file = 'qmp-marshal.c' |
333 | 375 |
h_file = 'qmp-commands.h' |
376 |
middle_mode = False |
|
334 | 377 |
|
335 | 378 |
for o, a in opts: |
336 | 379 |
if o in ("-p", "--prefix"): |
... | ... | |
339 | 382 |
output_dir = a + "/" |
340 | 383 |
elif o in ("-t", "--type"): |
341 | 384 |
dispatch_type = a |
385 |
elif o in ("-m", "--middle"): |
|
386 |
middle_mode = True |
|
342 | 387 |
|
343 | 388 |
c_file = output_dir + prefix + c_file |
344 | 389 |
h_file = output_dir + prefix + h_file |
... | ... | |
370 | 415 |
ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n" |
371 | 416 |
fdecl.write(ret) |
372 | 417 |
if ret_type: |
373 |
ret = gen_marshal_output(cmd['command'], arglist, ret_type) + "\n" |
|
418 |
ret = gen_marshal_output(cmd['command'], arglist, ret_type, middle_mode) + "\n"
|
|
374 | 419 |
fdef.write(ret) |
375 |
ret = gen_marshal_input(cmd['command'], arglist, ret_type) + "\n" |
|
420 |
|
|
421 |
if middle_mode: |
|
422 |
fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], arglist, ret_type, middle_mode)) |
|
423 |
|
|
424 |
ret = gen_marshal_input(cmd['command'], arglist, ret_type, middle_mode) + "\n" |
|
376 | 425 |
fdef.write(ret) |
377 | 426 |
|
378 | 427 |
fdecl.write("\n#endif\n"); |
379 |
ret = gen_registry(commands) |
|
380 |
fdef.write(ret) |
|
428 |
|
|
429 |
if not middle_mode: |
|
430 |
ret = gen_registry(commands) |
|
431 |
fdef.write(ret) |
|
381 | 432 |
|
382 | 433 |
fdef.flush() |
383 | 434 |
fdef.close() |
Also available in: Unified diff