Eric Blake <ebl...@redhat.com> writes: > 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.
True, but there's also no point in complicating things for efficiency here. > 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(). Okay, let's see how that works out. > 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 { qobj = NULL here would be clearer than the initializer. > + qstr = qstring_from_str(fmt); > + } > > /* > * BUG: QMP doesn't react to input until it sees a newline, an