[prev in list] [next in list] [prev in thread] [next in thread] 

List:       qemu-ppc
Subject:    Re: [Qemu-ppc] [Qemu-devel] [PATCH v2 2/9] qom: macroify integer property helpers
From:       Peter Crosthwaite <peter.crosthwaite () xilinx ! com>
Date:       2014-07-31 13:44:49
Message-ID: CAEgOgz7y1B1F9ZwAgVMHvnA+xTL01qA4mAVCkNiOb4x_c3hEWA () mail ! gmail ! com
[Download RAW message or body]

On Thu, Jul 3, 2014 at 4:01 AM, Alexander Graf <agraf@suse.de> wrote:
> We have a bunch of nice helpers that allow us to easily register an integer
> field as QOM property. However, we have those duplicated for every integer
> size available.
>
> This is very cumbersome (and prone to bugs) to work with and extend, so let's
> strip out the only difference there is (the size) and generate the actual
> functions via a macro.
>
> Signed-off-by: Alexander Graf <agraf@suse.de>
>

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

> ---
>
> v1 -> v2:
>
>   - Rename DECLARE_INTEGER_VISITOR to DECLARE_PROP_SET_GET
>   - Make macro take name and type arguments, enabling generation of "bool"
>     types later
> ---
>  qom/property.c | 82 +++++++++++++++++-----------------------------------------
>  1 file changed, 24 insertions(+), 58 deletions(-)
>
> diff --git a/qom/property.c b/qom/property.c
> index 9e7c92a..944daff 100644
> --- a/qom/property.c
> +++ b/qom/property.c
> @@ -151,62 +151,28 @@ void object_property_add_bool(Object *obj, const char *name,
>      }
>  }
>
> -static void property_get_uint8_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint8_t value = *(uint8_t *)opaque;
> -    visit_type_uint8(v, &value, name, errp);
> -}
> -
> -static void property_get_uint16_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint16_t value = *(uint16_t *)opaque;
> -    visit_type_uint16(v, &value, name, errp);
> -}
> -
> -static void property_get_uint32_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint32_t value = *(uint32_t *)opaque;
> -    visit_type_uint32(v, &value, name, errp);
> -}
> -
> -static void property_get_uint64_ptr(Object *obj, Visitor *v,
> -                                   void *opaque, const char *name,
> -                                   Error **errp)
> -{
> -    uint64_t value = *(uint64_t *)opaque;
> -    visit_type_uint64(v, &value, name, errp);
> -}
> +#define DECLARE_PROP_SET_GET(name, valtype)                                    \
> +                                                                               \
> +static void glue(glue(property_get_,name),_ptr)(Object *obj, Visitor *v,       \
> +                                                void *opaque,                  \
> +                                                const char *name,              \
> +                                                Error **errp)                  \
> +{                                                                              \
> +    valtype value = *(valtype *)opaque;                                        \
> +    glue(visit_type_,name)(v, &value, name, errp);                             \
> +}                                                                              \
> +                                                                               \
> +void glue(glue(object_property_add_,name),_ptr)(Object *obj, const char *name, \
> +                                                const valtype *v,              \
> +                                                Error **errp)                  \
> +{                                                                              \
> +    ObjectPropertyAccessor *get = glue(glue(property_get_,name),_ptr);         \
> +    object_property_add(obj, name, stringify(name), get, NULL, NULL, (void *)v,\
> +                        errp);                                                 \
> +}                                                                              \
> +
> +DECLARE_PROP_SET_GET(uint8, uint8_t)
> +DECLARE_PROP_SET_GET(uint16, uint16_t)
> +DECLARE_PROP_SET_GET(uint32, uint32_t)
> +DECLARE_PROP_SET_GET(uint64, uint64_t)
>
> -void object_property_add_uint8_ptr(Object *obj, const char *name,
> -                                   const uint8_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint8", property_get_uint8_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint16_ptr(Object *obj, const char *name,
> -                                    const uint16_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint16", property_get_uint16_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint32_ptr(Object *obj, const char *name,
> -                                    const uint32_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint32", property_get_uint32_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> -
> -void object_property_add_uint64_ptr(Object *obj, const char *name,
> -                                    const uint64_t *v, Error **errp)
> -{
> -    object_property_add(obj, name, "uint64", property_get_uint64_ptr,
> -                        NULL, NULL, (void *)v, errp);
> -}
> --
> 1.8.1.4
>
>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic