qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 15/16] qapi: Share gen_err_check()


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v6 15/16] qapi: Share gen_err_check()
Date: Thu, 01 Oct 2015 08:33:56 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Eric Blake <address@hidden> writes:

> On 09/29/2015 08:31 AM, Markus Armbruster wrote:
>> Eric Blake <address@hidden> writes:
>> 
>>> qapi-commands had a nice helper gen_err_check(), but did not
>> 
>> In fact, it still has :)
>> 
>>> use it everywhere. In fact, using it in more places makes it
>>> easier to reduce the lines of code used in appending an error
>> 
>> Suggest "used for generating error checks"
>> 
>>> check in generated code (previously required a multi-line
>>> mcgen(), which didn't add any use of parameterization), which
>>> in turn makes it easier to write the next patch which will
>>> consolidate another common pattern among the generators.
>> 
>> I think we should burn some of the whiches ;)
>
> Yay - a which-hunt.  I'll get the pitchfork.

I think you'll need a pichfork for this ;-)

>> 
>> Drop the paranthesis?
>> 
>>> The diffstat of this patch doesn't quite show as big a
>>> reduction in lines as I had hoped, but that is in part due to
>> 
>> Almost none...
>> 
>>> the duplication of some FIXME comments.
>>>
>>> Signed-off-by: Eric Blake <address@hidden>
>> 
>> Have you diffed the generated code before and after the patch?
>
> Oops, forgot to mention. No change to generated code.

Let's state it in the commit message.

>>> @@ -170,9 +159,10 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s 
>>> ret_in, QObject **ret_out,
>>>
>>>      v = qmp_output_get_visitor(qov);
>>>      visit_type_%(c_name)s(v, &ret_in, "unused", &err);
>>> -    if (err) {
>>> -        goto out;
>>> -    }
>>> +''',
>>> +                c_type=ret_type.c_type(), c_name=ret_type.c_name())
>>> +    ret += gen_err_check()
>>> +    ret += mcgen('''
>>>      *ret_out = qmp_output_get_qobject(qov);
>>>
>>>   out:
>> 
>> Here's a case that becomes more verbose, so it's not just comment
>> duplication.  Also becomes a bit harder to read, I think.
>
> Due to splitting a larger chunk into smaller pieces to inject the error
> in the middle.
>
> I guess we could pick and choose to use the function only where it
> doesn't split an already-existing large block, in order to maximize the
> diffstat ratio rather than in favor of eliminating the common code
> pattern duplication?

Two good reasons for capturing common code in a helper: one, ensuring
consistency and making it easier to change, and two, readability.

I don't think our "if (err) goto out" idiom is likely to change.  That
leaves just readability, I think.  A case-by-case approach makes sense
then.

>> I don't know.  Could be worthwhile if it really makes further work
>> easier.
>> 
>> To really cut the verbosity, I figure we'd have to do something more
>> radical, like having cgen() recognize a (short!) pattern and replace it
>> with a full-blown error check.  Not sure that's actually a good idea,
>> though :)
>
> In v5, it was only used by the shared gen_visit_fields(), until I added
> uses of it later in the series to make anonymous base classes of a flat
> union easier to implement.
>
> I guess the conservative thing is to scale this patch back a bit (move
> the function to the common location, and use it where it makes an
> obvious difference to the diffstat, but leaving other places alone for
> now).  Should I try that for v7?

Yes, please.  Except let yourself be guided by your eye, not by
diffstat.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]