qemu/tests
Eric Blake becceedc4d qapi: Don't box struct branch of alternate
There's no reason to do two malloc's for an alternate type visiting
a QAPI struct; let's just inline the struct directly as the C union
branch of the struct.

Surprisingly, no clients were actually using the struct member prior
to this patch outside of the testsuite; an earlier patch in the series
added some testsuite coverage to make the effect of this patch more
obvious.

In qapi.py, c_type() gains a new is_unboxed flag to control when we
are emitting a C struct unboxed within the context of an outer
struct (different from our other two modes of usage with no flags
for normal local variable declarations, and with is_param for adding
'const' in a parameter list).  I don't know if there is any more
pythonic way of collapsing the two flags into a single parameter,
as we never have a caller setting both flags at once.

Ultimately, we want to also unbox branches for QAPI unions, but as
that touches a lot more client code, it is better as separate
patches.  But since unions and alternates share gen_variants(), I
had to hack in a way to test if we are visiting an alternate type
for setting the is_unboxed flag: look for a non-object branch.
This works because alternates have at least two branches, with at
most one object branch, while unions have only object branches.
The hack will go away in a later patch.

The generated code difference to qapi-types.h is relatively small:

| struct BlockdevRef {
|     QType type;
|     union { /* union tag is @type */
|         void *data;
|-        BlockdevOptions *definition;
|+        BlockdevOptions definition;
|         char *reference;
|     } u;
| };

The corresponding spot in qapi-visit.c calls visit_type_FOO(), which
first calls visit_start_struct() to allocate or deallocate the member
and handle a layer of {} from the JSON stream, then visits the
members.  To peel off the indirection and the memory management that
comes with it, we inline this call, then suppress allocation /
deallocation by passing NULL to visit_start_struct(), and adjust the
member visit:

|     switch ((*obj)->type) {
|     case QTYPE_QDICT:
|-        visit_type_BlockdevOptions(v, name, &(*obj)->u.definition, &err);
|+        visit_start_struct(v, name, NULL, 0, &err);
|+        if (err) {
|+            break;
|+        }
|+        visit_type_BlockdevOptions_fields(v, &(*obj)->u.definition, &err);
|+        error_propagate(errp, err);
|+        err = NULL;
|+        visit_end_struct(v, &err);
|         break;
|     case QTYPE_QSTRING:
|         visit_type_str(v, name, &(*obj)->u.reference, &err);

The visit of non-object fields is unchanged.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1455778109-6278-13-git-send-email-eblake@redhat.com>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2016-02-19 11:08:57 +01:00
..
acpi-test-data tests: pc: acpi: add expected DSDT.bridge blobs and update DSDT blobs 2016-02-04 19:53:02 +02:00
guest-debug tests/guest-debug: introduce basic gdbstub tests 2015-12-17 13:37:15 +00:00
image-fuzzer tests: Use Python 2.6 "except E as ..." syntax 2016-02-08 17:29:54 +01:00
libqos tests: Clean up includes 2016-02-16 14:29:27 +00:00
multiboot tests/multiboot: Add test for modules 2015-01-26 12:22:44 +01:00
qapi-schema qapi: Add tests of complex objects within alternate 2016-02-19 11:08:57 +01:00
qemu-iotests * Coverity fixes for IPMI and mptsas 2016-02-16 17:31:56 +00:00
rocker rocker: tests: don't need to specify master/self when setting vlans 2015-07-07 13:13:22 +01:00
tcg maint: remove unused include for signal.h 2015-09-11 10:21:38 +03:00
vmstate-static-checker-data tests: vmstate static checker: add size mismatch inside substructure 2014-06-23 19:14:52 +02:00
.gitignore crypto: add QCryptoSecret object class for password/key handling 2015-12-18 16:25:08 +00:00
ac97-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ahci-test.c ide: Clean up includes 2016-01-29 15:07:23 +00:00
bios-tables-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
boot-order-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-block.sh qemu-iotests: make check-block.sh work on out-of-tree builds 2016-01-07 21:30:16 +01:00
check-qdict.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qfloat.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qint.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qjson.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qlist.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qom-interface.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qom-proplist.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
check-qstring.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
crypto-tls-x509-helpers.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
crypto-tls-x509-helpers.h crypto: add sanity checking of TLS x509 credentials 2015-09-15 15:05:09 +01:00
device-introspect-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
display-vga-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
drive_del-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ds1338-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
e1000-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
eepro100-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
endianness-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
es1370-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
fdc-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
fw_cfg-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
hd-geo-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
i440fx-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
i82801b11-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ide-test.c ide: Clean up includes 2016-01-29 15:07:23 +00:00
intel-hda-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
io-channel-helpers.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
io-channel-helpers.h io: add QIOChannelSocket class 2015-12-18 12:18:31 +00:00
ioh3420-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ipmi-bt-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ipmi-kcs-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ipoctal232-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
ivshmem-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
libqtest.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
libqtest.h tests: Use proper functions types instead of void (*fn) 2015-12-04 18:25:42 +01:00
m48t59-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
Makefile qapi: Forbid 'any' inside an alternate 2016-02-19 11:08:56 +01:00
ne2000-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
nvme-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
pc-cpu-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
pcnet-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
pkix_asn1_tab.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
pvpanic-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
q35-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
qemu-iotests-quick.sh qemu-iotests: Speed up make check-block 2015-01-13 11:47:55 +00:00
qom-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
rcutorture.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
rtc-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
rtl8139-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
spapr-phb-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
tco-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-aio.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-base64.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-bitops.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-blockjob-txn.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-coroutine.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-crypto-cipher.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-crypto-hash.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-crypto-secret.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-crypto-tlscredsx509.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-crypto-tlssession.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-cutils.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-hbitmap.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-int128.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-io-channel-buffer.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-io-channel-command.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-io-channel-file.c Merge I/O fixes 2016/02/16 v1 2016-02-16 15:47:35 +00:00
test-io-channel-socket.c Merge I/O fixes 2016/02/16 v1 2016-02-16 15:47:35 +00:00
test-io-channel-tls.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-io-task.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-iov.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-mul64.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-netfilter.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-opts-visitor.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qdev-global-props.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qemu-opts.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qga.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qmp-commands.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qmp-event.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qmp-input-strict.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-qmp-input-visitor.c qapi: Don't box struct branch of alternate 2016-02-19 11:08:57 +01:00
test-qmp-output-visitor.c qapi: Don't box struct branch of alternate 2016-02-19 11:08:57 +01:00
test-rcu-list.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-rfifolock.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-string-input-visitor.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-string-output-visitor.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-thread-pool.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-throttle.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-timed-average.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-visitor-serialization.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-vmstate.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-write-threshold.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-x86-cpuid.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
test-xbzrle.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
tmp105-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
tpci200-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
usb-hcd-ehci-test.c usb: Clean up includes 2016-01-29 15:07:23 +00:00
usb-hcd-ohci-test.c usb: Clean up includes 2016-01-29 15:07:23 +00:00
usb-hcd-uhci-test.c usb: Clean up includes 2016-01-29 15:07:23 +00:00
usb-hcd-xhci-test.c usb: Clean up includes 2016-01-29 15:07:23 +00:00
vhost-user-bridge.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
vhost-user-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-9p-test.c 9pfs: Clean up includes 2016-01-29 15:07:23 +00:00
virtio-balloon-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-blk-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-console-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-net-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-rng-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-scsi-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
virtio-serial-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
vmxnet3-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00
wdt_ib700-test.c tests: Clean up includes 2016-02-16 14:29:27 +00:00