Eric Blake <ebl...@redhat.com> writes:

> On 01/22/2016 05:18 AM, Markus Armbruster wrote:
[...]
>> Crazy thought: unboxing the implicit struct should make this interface
>> wart go away.  If we commit to do that later, we can "solve" our
>> documentation problem the same way as for visit_start_union(): FIXME
>> should not be needed.
>
> I _want_ to get rid of the boxing.  But as it is not in my current queue
> of pending patches, it will have to wait until the current queue is
> flushed; so I'm going for documenting it with FIXMEs for now.
>
> Basically, our current flat union representation is:
>
> struct Union {
>     Type tag;
>     union {
>         Subtype1 *one;
>         Subtype2 *two;
>     } u;
> };
>
> which requires two malloc's to completely populate the struct, and where
> we access union->u.one->member, or pass union->u.one to a function
> taking Subtype1*.  But it _should_ be:
>
> struct Union {
>     Type tag;
>     union {
>         Subtype1 one;
>         Subtype2 two;
>     } u;
> };
>
> where a single malloc is sufficient, and where we access
> union->u.one.member, or pass &union->u.one to a function taking Subtype1*.
>
> It's a tree-wide conversion; and may be easier if done in stages (fix
> the generator to take a temporary boolean flag on whether a particular
> structure uses inline or boxing, then a series of patches adding that
> flag to a few QMP commands at a time, then a final patch to clear out
> the temporary flag support) rather than all at once.  I'm not sure how
> much Coccinelle will help, because I specifically haven't started the
> conversion work until after we can get the current backlog flushed.

I hope the use of unions in C code is localized enough to do it in one
step.

Reply via email to