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

> Slightly rearrange the code in gen_event_send() for less generated
> output, by initializing 'emit' sooner, deferring an assertion
> to qdict_put_obj, and dropping a now-unused 'obj' local variable.
>
> While at it, document a FIXME related to the potential for a
> compiler naming collision - if the user ever creates a QAPI event
> whose name matches 'errp' or one of our local variables (like
> 'emit'), we'll have to revisit how we generate functions to
> avoid the problem.
>
> |@@ -25,16 +25,13 @@ void qapi_event_send_acpi_device_ost(ACP
> | {
> |     QDict *qmp;
> |     Error *err = NULL;
> |-    QMPEventFuncEmit emit;
> |+    QMPEventFuncEmit emit = qmp_event_get_func_emit();
> |     QmpOutputVisitor *qov;
> |     Visitor *v;
> |-    QObject *obj;
> |
> |-    emit = qmp_event_get_func_emit();
> |     if (!emit) {
> |         return;
> |     }
> |-
> |     qmp = qmp_event_build_dict("ACPI_DEVICE_OST");
> |
> |     qov = qmp_output_visitor_new();
> |@@ -53,11 +50,7 @@ out_obj:
> |     if (err) {
> |         goto out;
> |     }
> |-
> |-    obj = qmp_output_get_qobject(qov);
> |-    g_assert(obj);

We're not "deferring an assertion to qdict_put_obj()", we're dropping a
dead one: qmp_output_get_qobject() never returns null.

I figure the assertion dates back to the time when it still did.  Back
then, getting null here meant we screwed up.

I just searched the code for similarly dead assertions.  Found one in
qapi_clone_InputEvent(), and serveral more in test-qmp-output-visitor.c.

There's also an error return in qapi_copy_SocketAddress().  Useless?
Should check for qnull instead?

> |-
> |-    qdict_put_obj(qmp, "data", obj);
> |+    qdict_put_obj(qmp, "data", qmp_output_get_qobject(qov));
> |     emit(QAPI_EVENT_ACPI_DEVICE_OST, qmp, &err);
> |
> | out:
>
> Signed-off-by: Eric Blake <ebl...@redhat.com>
>
> ---
> v5: new patch
> ---
>  scripts/qapi-event.py | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
> index c03cb78..02c9556 100644
> --- a/scripts/qapi-event.py
> +++ b/scripts/qapi-event.py
> @@ -29,13 +29,19 @@ def gen_event_send_decl(name, arg_type):
>
>
>  def gen_event_send(name, arg_type):
> +    # FIXME: Our declaration of local variables (and of 'errp' in the
> +    # parameter list) can collide with exploded members of the event's
> +    # data type passed in as parameters.  If this collision ever hits in
> +    # practice, we can rename our local variables with a leading _ prefix,
> +    # or split the code into a wrapper function that creates a boxed
> +    # 'param' object then calls another to do the real work.
>      ret = mcgen('''
>
>  %(proto)s
>  {
>      QDict *qmp;
>      Error *err = NULL;
> -    QMPEventFuncEmit emit;
> +    QMPEventFuncEmit emit = qmp_event_get_func_emit();
>  ''',
>                  proto=gen_event_send_proto(name, arg_type))
>
> @@ -43,16 +49,13 @@ def gen_event_send(name, arg_type):
>          ret += mcgen('''
>      QmpOutputVisitor *qov;
>      Visitor *v;
> -    QObject *obj;
> -

Please keep the blank line here...

>  ''')
>
>      ret += mcgen('''
> -    emit = qmp_event_get_func_emit();
> +

... instead of adding it here.

>      if (!emit) {
>          return;
>      }
> -

Let's keep this one.

>      qmp = qmp_event_build_dict("%(name)s");
>
>  ''',
> @@ -76,11 +79,7 @@ out_obj:
>      if (err) {
>          goto out;
>      }
> -
> -    obj = qmp_output_get_qobject(qov);
> -    g_assert(obj);
> -
> -    qdict_put_obj(qmp, "data", obj);
> +    qdict_put_obj(qmp, "data", qmp_output_get_qobject(qov));
>  ''')
>
>      ret += mcgen('''

Small improvements are welcome, too :)

Reply via email to