From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 00/16] introduce OptsVisitor, rebase -net/-netdev parsing
Date: Thu, 7 Jun 2012 10:29:28 -0500 [thread overview]
Message-ID: <20120607152928.GU2916@illuin> (raw)
In-Reply-To: <4FD090B2.4090305@redhat.com>
On Thu, Jun 07, 2012 at 01:29:54PM +0200, Laszlo Ersek wrote:
> On 06/06/12 22:09, Michael Roth wrote:
> > On Wed, Jun 06, 2012 at 06:49:19PM +0200, Laszlo Ersek wrote:
>
> >> The fallback (*v->type_int)() call stores an int64_t, according to its
> >> prototype ("interface contract"). IMHO it shouldn't try to communicate a
> >> mathematical value outside of [INT64_MIN, INT64_MAX]; it should report
> >
> > But the contract with visit_type_int() is maintained: it's just that
> > visit_type_uint64() is casting it's uint64_t value to int64_t (and
> > back) to make use of the fallback. It's slightly dirty, but fairly common
> > throughout the tree.
>
> (I'm going theoretical :))
>
> Sorry, I didn't mean what happens "around" the type_int method; I meant
> what happens inside it.
>
> A visitor type takes some "external type" (a bag of data, structured or
> unstructured) and provides functions with scalar target types (among
> other things). One defines a native C struct in the JSON (... I'm making
> some leaps here), the generated code traverses that C type, and probes
> the "bag of data" with the corresponding visitor. A type_int call made
> to the visitor says "hey I need an int64_t for this node of the target C
> struct, with this 'path' and 'name' locator inside the external object".
> If the 'path' (= eg. visitor stack) and 'name' identify a piece of info
> in the external object that can't be represented in the requested target
> type, the visitor should report an error. I don't see much difference
> between the decimal representation of 2^63 and the string "donkey" in
> this regard if the target C "node" is an int64_t.
>
> (Musing block ends :))
Yes, that's a good point, care must be taken when implementing a visitor to not
rely on on the fallback unless the serialized representation is compatible with
the original type. Otherwise an explicit interface for that type should
be implemented.
For QEMU <-> QEMU serialization/deserialization, there are actually unit
tests in qom-next that'll fail if this condition does not hold.
For QEMU <-> X serialization/deserialization, such as a visitor which
implements a wire encoding (QMP being the only example currently), we need to
take care that the wire encoding is compatible with the representation
expected by the other end (according to the QAPI schema or whatever other
means we use to document it). This holds for QMP/JSON, and we'll need to take
care that it holds for anything that's added in the future.
But in that case, the restriction is not a matter of whether a value
passed to visit_type_int() is within a certain range, but rather that
the encoding itself is compatible with the documented type, so enforcing
this constraint is a broader matter that cannot be checked generically, and
must be handled instead by unit tests which employ intimate knowledge of
the Visitor that's being tested, such as with tests/test-qmp-output-visitor.c.
>
> Of course I'm fine with dropping the fourth hunk.
>
> Thanks,
> Laszlo
>
next prev parent reply other threads:[~2012-06-07 15:29 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-22 10:45 [Qemu-devel] [PATCH 00/16] introduce OptsVisitor, rebase -net/-netdev parsing Laszlo Ersek
2012-05-22 10:45 ` [Qemu-devel] [PATCH 01/16] qapi: fix error propagation Laszlo Ersek
2012-05-22 10:45 ` [Qemu-devel] [PATCH 02/16] qapi: introduce "size" type Laszlo Ersek
2012-06-05 20:39 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 03/16] expose QemuOpt and QemuOpts struct definitions to interested parties Laszlo Ersek
2012-06-05 20:40 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 04/16] qapi: introduce OptsVisitor Laszlo Ersek
2012-06-05 21:12 ` Paolo Bonzini
2012-06-06 11:12 ` Laszlo Ersek
2012-06-06 12:02 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 05/16] qapi schema: remove trailing whitespace Laszlo Ersek
2012-06-05 20:40 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 06/16] qapi schema: add Netdev types Laszlo Ersek
2012-06-05 21:08 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 07/16] hw, net: "net_client_type" -> "NetClientOptionsKind" (qapi-generated) Laszlo Ersek
2012-06-05 20:41 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 08/16] convert net_client_init() to OptsVisitor Laszlo Ersek
2012-06-05 20:46 ` Paolo Bonzini
2012-06-05 21:07 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 09/16] convert net_init_nic() to NetClientOptions Laszlo Ersek
2012-06-05 20:50 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 10/16] convert net_init_dump() " Laszlo Ersek
2012-06-05 20:51 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 11/16] convert net_init_slirp() " Laszlo Ersek
2012-06-05 20:53 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 12/16] convert net_init_socket() " Laszlo Ersek
2012-06-05 21:02 ` Paolo Bonzini
2012-06-05 21:14 ` Eric Blake
2012-06-05 21:27 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 13/16] convert net_init_vde() " Laszlo Ersek
2012-06-05 21:04 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 14/16] convert net_init_tap() " Laszlo Ersek
2012-05-22 10:45 ` [Qemu-devel] [PATCH 15/16] convert net_init_bridge() " Laszlo Ersek
2012-06-05 21:05 ` Paolo Bonzini
2012-06-06 12:16 ` Laszlo Ersek
2012-06-06 14:13 ` Paolo Bonzini
2012-05-22 10:45 ` [Qemu-devel] [PATCH 16/16] remove unused QemuOpts parameter from net init functions Laszlo Ersek
2012-06-05 21:06 ` Paolo Bonzini
2012-06-05 21:13 ` [Qemu-devel] [PATCH 00/16] introduce OptsVisitor, rebase -net/-netdev parsing Paolo Bonzini
2012-06-06 13:03 ` Laszlo Ersek
2012-06-06 13:31 ` Andreas Färber
2012-06-06 14:10 ` Paolo Bonzini
2012-06-06 14:34 ` Andreas Färber
2012-06-06 14:43 ` Paolo Bonzini
2012-06-06 15:16 ` Michael Roth
2012-06-06 15:30 ` Laszlo Ersek
2012-06-06 15:58 ` Michael Roth
2012-06-06 16:14 ` Michael Roth
2012-06-06 16:47 ` Paolo Bonzini
2012-06-06 16:49 ` Laszlo Ersek
2012-06-06 17:05 ` Laszlo Ersek
2012-06-06 20:09 ` Michael Roth
2012-06-06 20:59 ` Andreas Färber
2012-06-07 11:32 ` Laszlo Ersek
2012-06-07 12:17 ` Andreas Färber
2012-06-07 11:29 ` Laszlo Ersek
2012-06-07 15:29 ` Michael Roth [this message]
2012-06-07 15:46 ` Paolo Bonzini
2012-06-09 11:21 ` Laszlo Ersek
2012-06-06 15:31 ` Michael Roth
2012-06-06 14:09 ` Paolo Bonzini
2012-06-09 15:30 ` Laszlo Ersek
2012-06-11 7:06 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120607152928.GU2916@illuin \
--to=mdroth@linux.vnet.ibm.com \
--cc=afaerber@suse.de \
--cc=lersek@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).