qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Max Reitz <mreitz@redhat.com>, qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
	Alberto Garcia <berto@igalia.com>,
	Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v3 3/7] qapi: Replace qobject_to_X(o) by qobject_to(o, X)
Date: Tue, 27 Feb 2018 08:47:20 -0600	[thread overview]
Message-ID: <01bf42f6-971d-1a28-eeb4-61063ae62bd7@redhat.com> (raw)
In-Reply-To: <fb3756be-e002-8b47-921f-80a5ce332721@redhat.com>

On 02/26/2018 06:01 AM, Max Reitz wrote:

>>> +++ b/block.c
>>> @@ -1457,7 +1457,7 @@ static QDict *parse_json_filename(const char
>>> *filename, Error **errp)
>>>            return NULL;
>>>        }
>>>    -    options = qobject_to_qdict(options_obj);
>>> +    options = qobject_to(options_obj, QDict);
>>
>> Bikeshedding - would it read any easier as:
>>
>> options = qobject_to(QDict, options_obj);
>>
>> ?  If so, your Coccinelle script can be touched up, and patch 2/7 swaps
>> argument order around, so it would be tolerable but still slightly
>> busywork to regenerate the series.  But I'm not strongly attached to
>> either order, and so I'm also willing to take this as-is (especially
>> since that's less work), if no one else has a strong opinion that
>> swapping order would aid legibility.
> 
> Well, same for me. :-)
> 
> In a template/generic language, we'd write the type first (e.g.
> qobject_cast<QDict>(options_obj)).  But maybe we'd write the object
> first, too (e.g. options_obj.cast<QDict>()).  And the current order of
> the arguments follows the order in the name ("qobject" options_obj "to"
> QDict).  But maybe it's more natural to read it as "qobject to" QDict
> "applied to" options_obj.
> 
> I don't know either.

Okay, after looking for existing uses of type names in macro calls, I see:

qemu/compiler.h:

#ifndef container_of
#define container_of(ptr, type, member) ({                      \
         const typeof(((type *) 0)->member) *__mptr = (ptr);     \
         (type *) ((char *) __mptr - offsetof(type, member));})
#endif

/* Convert from a base type to a parent type, with compile time 
checking.  */
#ifdef __GNUC__
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
     char __attribute__((unused)) offset_must_be_zero[ \
         -offsetof(type, field)]; \
     container_of(dev, type, field);}))
#else
#define DO_UPCAST(type, field, dev) container_of(dev, type, field)
#endif

#define typeof_field(type, field) typeof(((type *)0)->field)


qapi/clone-visitor.h:

/*
  * Deep-clone QAPI object @src of the given @type, and return the result.
  *
  * Not usable on QAPI scalars (integers, strings, enums), nor on a
  * QAPI object that references the 'any' type.  Safe when @src is NULL.
  */
#define QAPI_CLONE(type, src)                                           \

/*
  * Copy deep clones of @type members from @src to @dst.
  *
  * Not usable on QAPI scalars (integers, strings, enums), nor on a
  * QAPI object that references the 'any' type.
  */
#define QAPI_CLONE_MEMBERS(type, dst, src)                              \


2 out of 3 macros in compiler.h put the type name first, and 
container_of() puts it in the middle of 3.  It's even weirder because 
DO_UPCAST(t, f, d) calls container_of(d, t, f), where the inconsistency 
makes it a mental struggle to figure out how to read the two macros side 
by side, compared to if we had just been consistent.  Meanwhile, all of 
the macros in qapi put the type name first.

So at this point, I'm 70:30 in favor of doing the rename to have 
qobject_to(type, obj) for consistency with majority of other macros that 
take a type name (type names are already unusual as arguments to macros, 
whether or not the macro is named with ALL_CAPS).  (Sorry, I know that 
means more busy work for you, if you agree with my reasoning)

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

  reply	other threads:[~2018-02-27 14:47 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-24 15:40 [Qemu-devel] [PATCH v3 0/7] block: Handle null backing link Max Reitz
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 1/7] compiler: Add QEMU_BUILD_BUG_MSG() macro Max Reitz
2018-02-24 20:08   ` Eric Blake
2018-02-27 13:33   ` Alberto Garcia
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 2/7] qapi: Add qobject_to() Max Reitz
2018-02-24 20:57   ` Eric Blake
2018-02-26 11:58     ` Max Reitz
2018-03-19 19:36       ` Eric Blake
2018-03-19 19:38         ` Max Reitz
2018-02-27 13:45   ` Alberto Garcia
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 3/7] qapi: Replace qobject_to_X(o) by qobject_to(o, X) Max Reitz
2018-02-24 21:04   ` Eric Blake
2018-02-26 12:01     ` Max Reitz
2018-02-27 14:47       ` Eric Blake [this message]
2018-02-28 18:08         ` Max Reitz
2018-03-10 21:48           ` Eric Blake
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 4/7] qapi: Remove qobject_to_X() functions Max Reitz
2018-02-24 21:05   ` Eric Blake
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 5/7] qapi: Make more of qobject_to() Max Reitz
2018-02-24 21:07   ` Eric Blake
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 6/7] block: Handle null backing link Max Reitz
2018-02-24 21:09   ` Eric Blake
2018-02-24 15:40 ` [Qemu-devel] [PATCH v3 7/7] block: Deprecate "backing": "" Max Reitz
2018-02-24 18:02 ` [Qemu-devel] [PATCH v3 0/7] block: Handle null backing link no-reply
2018-02-26 11:50   ` Max Reitz
2018-02-24 19:51 ` no-reply
2018-02-24 20:19 ` no-reply
2018-02-24 20:30 ` no-reply
2018-02-25 23:38 ` no-reply
2018-02-26  6:11 ` no-reply
2018-03-09 20:11 ` Eric Blake
2018-03-10 22:34 ` Eric Blake
2018-03-12 12:22   ` Max Reitz

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=01bf42f6-971d-1a28-eeb4-61063ae62bd7@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berto@igalia.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --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).