On 11/22/2016 04:06 AM, Markus Armbruster wrote:
> Eric Blake <ebl...@redhat.com> writes:
> 
>> On 11/21/2016 02:36 PM, Eric Blake wrote:
>>> The source of your problem is that your platform defines PRId64 as 'qd',
>>> but the qemu JSON parser only recognizes lld (POSIX) or I64d (mingw) for
>>> parsing 64-bit numbers.  We could enhance the JSON parser to recognize
>>> the non-standard qd in addition to the hack we already have for mingw,
> 
> Yes...
> 
>>> but I'd argue that using qobject_from_jsonf() is already less-than-useful.
>>
>> In fact, we are down to only a handful of users of our modified 'jsonf'
>> format (that is, strings that mix JSON with % modifiers):
>>
>> hw/pci/pcie_aer.c: build a 5-element QDict
>> monitor.c: build a 1-element QDict which contains a 2-element QDict
>> qapi/qmp-dispatch.c: build a 2-element QDict
>> qapi/qmp-event.c: Build a 2-element QDict
>>
>> plus the testsuite (check-qjson.c).
> 
> How did you find them?

git grep qobject_from_jsonf

I forgot about qobject_from_jsonv(), which is a bit more pervasive in
the testsuite, but even there, I only found a few additional uses of %
(that time, found by adding an assert(!strchr(format, '%')), then seeing
where it triggered during 'make check').  I should have the cleanup
series later today.  Technically, avoiding PRId64 in qmp-event.c is
worth having in 2.8 (it's a bug fix for Mac OS); but the rest of the
series is 2.9 material.  Note that at least one of the testsuite
conversions I'm making also used PRId64 - is the original poster even
running 'make check', as at least check-qga would be evidence of the
JSON parser failing to understand Mac's %qd.

> 
>>>   It's hard to argue that the
>>> complexity of maintaining our pseudo-printf JSON parser for constructing
>>> a QObject with one line is worth the effort compared to the three or
>>> four lines to construct the same QObject by hand.
>>
>> I'm severely tempted to just rip out all of the poorly-underdocumented %
>> parsing from the JSON parser, as it will simplify our code, without much
>> pain in converting the four real users to just manually build up the
>> same objects.
> 
> I kind of like the %-escapes, because they provide a compact and legible
> way to build QObjects.  But with so little use, they're hardly earning
> their keep.

What drives me most insane about them is that they are NOT the same
escapes as printf(), so the compiler can't help us with type safety, and
things like PRId64 don't always do what we want.  And except for %p for
injecting nested objects, most of our escapes are just as easy to
perform with g_strdup_printf() (injecting a string, integer, or
boolean), or by manual creation of the QDict.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to