qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v1 3/3] qom: Converged dynamic cast for interfac


From: Peter Crosthwaite
Subject: Re: [Qemu-devel] [PATCH v1 3/3] qom: Converged dynamic cast for interfaces & objs
Date: Mon, 18 Jun 2012 14:25:11 +1000

On Sat, Jun 16, 2012 at 8:39 PM, Peter A. G. Crosthwaite
<address@hidden> wrote:
> Interfaces and Object for some reason have seperate code paths for dynamic
> casting. AFAICT, Anthonys new interface specific cast is a functional superset
> of the object cast, so this patch renames the interface cast to object cast 
> and
> blows away the original object cast.
>
> Anyone want to shed any light on why the casts need to be different?
>
> The problem (and the reason for this patch) is its not always possible for
> user of interface to control how their object are going to be casted. Where 
> this
> broke down big-time is with links. The link setter code path explictly uses
> object_dynamic_cast(), when link are set, which pretty much makes linking to
> interfaces impossible. So either:
>
> 1: This patch
> 2: Explictly test objects/classes for interfacage in the link setting code
> 3: Ban linking to interfaces
>
> Signed-off-by: Peter A. G. Crosthwaite <address@hidden>
> ---
>  include/qemu/object.h |   20 +-------------------
>  qom/object.c          |   49 
> +++++++++----------------------------------------
>  2 files changed, 10 insertions(+), 59 deletions(-)
>
> diff --git a/include/qemu/object.h b/include/qemu/object.h
> index 72cb290..a8916ce 100644
> --- a/include/qemu/object.h
> +++ b/include/qemu/object.h
> @@ -425,7 +425,7 @@ struct InterfaceClass
>  * Returns: @obj casted to @interface if cast is valid, otherwise raise error.
>  */
>  #define INTERFACE_CHECK(interface, obj, name) \
> -    ((interface *)interface_dynamic_cast_assert(OBJECT((obj)), (name)))
> +    ((interface *)object_dynamic_cast_assert(OBJECT((obj)), (name)))
>
>  /**
>  * object_new:
> @@ -564,24 +564,6 @@ ObjectClass *object_class_dynamic_cast(ObjectClass 
> *klass,
>                                        const char *typename);
>
>  /**
> - * interface_dynamic_cast_assert:
> - * @obj: the object to cast to an interface type
> - * @typename: the type name of the interface
> - *
> - * Returns: @obj if @obj implements @typename, otherwise raise an error
> - */
> -Object *interface_dynamic_cast_assert(Object *obj, const char *typename);
> -
> -/**
> - * interface_dynamic_cast_assert:
> - * @obj: the object to cast to an interface type
> - * @typename: the type name of the interface
> - *
> - * Returns: @obj if @obj implements @typename, otherwise %NULL
> - */
> -Object *interface_dynamic_cast(Object *obj, const char *typename);
> -
> -/**
>  * object_class_get_name:
>  * @klass: The class to obtain the QOM typename for.
>  *
> diff --git a/qom/object.c b/qom/object.c
> index aa26693..7574666 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -405,24 +405,6 @@ static bool object_is_type(Object *obj, TypeImpl 
> *target_type)
>     return !target_type || type_is_ancestor(obj->class->type, target_type);
>  }
>

@@ -400,29 +400,6 @@ void object_delete(Object *obj)
     g_free(obj);
 }

Missing a hunk (that I found in my dirty tree) that belongs in this commit:

-static bool object_is_type(Object *obj, TypeImpl *target_type)
-{
-    return !target_type || type_is_ancestor(obj->class->type, target_type);
-}
-

Will remake (after review).

Regards,
Peter

> -Object *object_dynamic_cast(Object *obj, const char *typename)
> -{
> -    TypeImpl *target_type = type_get_by_name(typename);
> -
> -    /* Check if typename is a direct ancestor.  Special-case TYPE_OBJECT,
> -     * we want to go back from interfaces to the parent.
> -    */
> -    if (target_type && object_is_type(obj, target_type)) {
> -        return obj;
> -    }
> -
> -    if (!target_type) {
> -        return obj;
> -    }
> -
> -    return NULL;
> -}
> -
>  static void register_types(void)
>  {
>     static TypeInfo interface_info = {
> @@ -436,6 +418,15 @@ static void register_types(void)
>
>  type_init(register_types)
>
> +Object *object_dynamic_cast(Object *obj, const char *typename)
> +{
> +    if (object_class_dynamic_cast(object_get_class(obj), typename)) {
> +        return obj;
> +    }
> +
> +    return NULL;
> +}
> +
>  Object *object_dynamic_cast_assert(Object *obj, const char *typename)
>  {
>     Object *inst;
> @@ -496,28 +487,6 @@ ObjectClass 
> *object_class_dynamic_cast_assert(ObjectClass *class,
>     return ret;
>  }
>
> -Object *interface_dynamic_cast(Object *obj, const char *typename)
> -{
> -    if (object_class_dynamic_cast(object_get_class(obj), typename)) {
> -        return obj;
> -    }
> -
> -    return NULL;
> -}
> -
> -Object *interface_dynamic_cast_assert(Object *obj, const char *typename)
> -{
> -    Object *ret = interface_dynamic_cast(obj, typename);
> -
> -    if (!ret) {
> -        fprintf(stderr, "Object %p is not an instance of type %s\n",
> -                obj, typename);
> -        abort();
> -    }
> -
> -    return ret;
> -}
> -
>  const char *object_get_typename(Object *obj)
>  {
>     return obj->class->type->name;
> --
> 1.7.3.2
>



reply via email to

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