When we don't have to do any % interpolation in qmp() and friends, there is no point wasting time allocating a QObject from the format string only to then format it back into the string we send over the wire.
This is a temporary measure: it becomes important in the next patch, where test-qga will be refactored to do interpolation in place, and where we must not re-interpolate the string; but will go away when further refactoring makes it easier to directly output a string without going through qmp_fd_sendv(). Signed-off-by: Eric Blake <ebl...@redhat.com> --- tests/libqtest.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index cde737ec5a..0cb439eefa 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -448,7 +448,7 @@ QDict *qtest_qmp_receive(QTestState *s) */ void qmp_fd_sendv(int fd, const char *fmt, va_list ap) { - QObject *qobj; + QObject *qobj = NULL; int log = getenv("QTEST_LOG") != NULL; QString *qstr; const char *str; @@ -462,9 +462,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap) } assert(*fmt); - /* Going through qobject ensures we escape strings properly. */ - qobj = qobject_from_jsonv(fmt, ap); - qstr = qobject_to_json(qobj); + /* + * A round trip through QObject is only needed if % interpolation + * is used. We interpolate through QObject rather than sprintf in + * order to escape strings properly. + */ + if (strchr(fmt, '%')) { + qobj = qobject_from_jsonv(fmt, ap); + qstr = qobject_to_json(qobj); + } else { + qstr = qstring_from_str(fmt); + } /* * BUG: QMP doesn't react to input until it sees a newline, an -- 2.13.3