From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58290) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJq3D-0002RQ-Hc for qemu-devel@nongnu.org; Mon, 27 Jul 2015 17:35:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZJq3A-0005IC-BE for qemu-devel@nongnu.org; Mon, 27 Jul 2015 17:35:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56043) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZJq3A-0005Hp-4m for qemu-devel@nongnu.org; Mon, 27 Jul 2015 17:35:08 -0400 References: <1435782155-31412-1-git-send-email-armbru@redhat.com> <1435782155-31412-28-git-send-email-armbru@redhat.com> From: Eric Blake Message-ID: <55B6A40A.8070400@redhat.com> Date: Mon, 27 Jul 2015 15:35:06 -0600 MIME-Version: 1.0 In-Reply-To: <1435782155-31412-28-git-send-email-armbru@redhat.com> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="CwuKUUnkeeji4IrWQ8MvuPpp4ibIAOTQh" Subject: Re: [Qemu-devel] [PATCH RFC v2 27/47] qapi-visit: Convert to QAPISchemaVisitor, fixing bugs List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Markus Armbruster , qemu-devel@nongnu.org Cc: kwolf@redhat.com, berto@igalia.com, mdroth@linux.vnet.ibm.com This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --CwuKUUnkeeji4IrWQ8MvuPpp4ibIAOTQh Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 07/01/2015 02:22 PM, Markus Armbruster wrote: > Fixes flat unions to visit the base's base members (the previous > commit merely added them to the struct). Same test case. >=20 > Patch's effect on visit_type_UserDefFlatUnion(): >=20 > static void visit_type_UserDefFlatUnion_fields(Visitor *m, UserDef= FlatUnion **obj, Error **errp) > { > Error *err =3D NULL; >=20 > + visit_type_int(m, &(*obj)->integer, "integer", &err); > + if (err) { > + goto out; > + } > visit_type_str(m, &(*obj)->string, "string", &err); > if (err) { > goto out; >=20 > +def gen_visit_union(name, base, variants): > + ret =3D '' > =20 > if base: > - assert discriminator > - base_fields =3D find_struct(base)['data'].copy() > - del base_fields[discriminator] > - ret +=3D generate_visit_struct_fields(name, base_fields) > + members =3D [m for m in base.members if m !=3D variants.tag_me= mber] > + ret +=3D generate_visit_struct_fields(name, members) Ouch. This hurts. If the same class is used as both the base class of a flat union, and the base class of an ordinary struct, then the struct tries to visit the base class, but no longer parses the field that the union was using as its discriminator. We don't have any code that demonstrates this, but probably should. I ran into it while working up my POC of what it would take to unbox inherited structs (http://thread.gmane.org/gmane.comp.emulators.qemu/3532= 04) We want visit_FOO_fields to visit _all_ fields of the struct, no matter who called generate_visit_struct_fields(). So what you must instead do here is use the fact that we've already visited the discriminator... > =20 > - if discriminator: > - for key in members: > - ret +=3D generate_visit_implicit_struct(members[key]) > + for var in variants.variants: > + if var.flat: > + ret +=3D generate_visit_implicit_struct(var.type) > =20 > ret +=3D mcgen(''' > =20 > @@ -300,41 +268,39 @@ void visit_type_%(c_name)s(Visitor *m, %(c_name)s= **obj, const char *name, Error > ''', > name=3Dc_name(name)) > =20 > - if not discriminator: > - tag =3D 'kind' > - disc_key =3D "type" > - else: > - tag =3D discriminator > - disc_key =3D discriminator > + disc_key =3D variants.tag_member.name > + if not variants.tag_name: > + # we pointlessly use a different key for simple unions > + disc_key =3D 'type' > ret +=3D mcgen(''' > - visit_type_%(disc_type)s(m, &(*obj)->%(c_tag)s, "%(disc_key)s"= , &err); > + visit_type_%(disc_type)s(m, &(*obj)->%(c_name)s, "%(disc_key)s= ", &err); =2E..and omit this call if the flat union's base class already took care of it. --=20 Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org --CwuKUUnkeeji4IrWQ8MvuPpp4ibIAOTQh Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Public key at http://people.redhat.com/eblake/eblake.gpg Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCAAGBQJVtqQKAAoJEKeha0olJ0Nq2asH/2dS5xegLV6lTvjX+DTkwm0C 3FT47md0Qqs3mNaIVlUQ/Cm4X7Be9eVCl8NV2XTwKDaZPNoNiLCiz/1cMC9Kw1UK UKSQRWlENSxoY/SNh99sQ1KWjTXlv34soMIBE1k0OF1WP9KSycrQuDQ1bGqGq18Y 5kA/nehz9YL2aIT2rSMp0PKL23bfvPaJ6veVy8iJm3y6SvqDFzrWC8aFZAxp7ptd tq2vYeXZ84yTokJftqx/79t74jsWr9lqBtsYe0o4dFAP7MI0bMYSCY4SFx0X6WNu eRiR1BfzaICCR9sLYID+8B42s01CL4CX3B8XhxN6ElBBNbauCNXs0x+Ogfw2iRA= =WsxJ -----END PGP SIGNATURE----- --CwuKUUnkeeji4IrWQ8MvuPpp4ibIAOTQh--