diff --git a/configure b/configure index 9439f1c727661df47bcd8a77370ddc85d5178c81..cab6332991a20728946d3bf4d963e1b51324b4b3 100755 --- a/configure +++ b/configure @@ -220,6 +220,7 @@ blobs="yes" pkgversion="" pie="" zero_malloc="" +qom_cast_debug="yes" trace_backend="nop" trace_file="trace" spice="" @@ -688,6 +689,10 @@ for opt do ;; --enable-sdl) sdl="yes" ;; + --disable-qom-cast-debug) qom_cast_debug="no" + ;; + --enable-qom-cast-debug) qom_cast_debug="yes" + ;; --disable-virtfs) virtfs="no" ;; --enable-virtfs) virtfs="yes" @@ -3575,6 +3580,7 @@ echo "gcov enabled $gcov" echo "TPM support $tpm" echo "libssh2 support $libssh2" echo "TPM passthrough $tpm_passthrough" +echo "QOM debugging $qom_cast_debug" if test "$sdl_too_old" = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -3909,6 +3915,9 @@ echo "CONFIG_UNAME_RELEASE=\"$uname_release\"" >> $config_host_mak if test "$zero_malloc" = "yes" ; then echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak fi +if test "$qom_cast_debug" = "yes" ; then + echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak +fi if test "$rbd" = "yes" ; then echo "CONFIG_RBD=y" >> $config_host_mak fi diff --git a/include/qom/object.h b/include/qom/object.h index 38f674f0ca22814bf9543ad6ea749b17b0e7ea18..63e2a404dab5c76d32713bfec04123f2d83a124b 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -615,8 +615,9 @@ Object *object_dynamic_cast(Object *obj, const char *typename); * * See object_dynamic_cast() for a description of the parameters of this * function. The only difference in behavior is that this function asserts - * instead of returning #NULL on failure. This function is not meant to be - * called directly, but only through the wrapper macro OBJECT_CHECK. + * instead of returning #NULL on failure if QOM cast debugging is enabled. + * This function is not meant to be called directly, but only through + * the wrapper macro OBJECT_CHECK. */ Object *object_dynamic_cast_assert(Object *obj, const char *typename, const char *file, int line, const char *func); @@ -666,9 +667,9 @@ Type type_register(const TypeInfo *info); * * See object_class_dynamic_cast() for a description of the parameters * of this function. The only difference in behavior is that this function - * asserts instead of returning #NULL on failure. This function is not - * meant to be called directly, but only through the wrapper macros - * OBJECT_CLASS_CHECK and INTERFACE_CHECK. + * asserts instead of returning #NULL on failure if QOM cast debugging is + * enabled. This function is not meant to be called directly, but only through + * the wrapper macros OBJECT_CLASS_CHECK and INTERFACE_CHECK. */ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *klass, const char *typename, diff --git a/qom/object.c b/qom/object.c index 1b9c5ce4f88a3aea972a25faad91bc6517293538..f5f416bc813a04de33c7b60d6d19aac70170d5cc 100644 --- a/qom/object.c +++ b/qom/object.c @@ -435,12 +435,11 @@ Object *object_dynamic_cast(Object *obj, const char *typename) Object *object_dynamic_cast_assert(Object *obj, const char *typename, const char *file, int line, const char *func) { - Object *inst; - trace_object_dynamic_cast_assert(obj ? obj->class->type->name : "(null)", typename, file, line, func); - inst = object_dynamic_cast(obj, typename); +#ifdef CONFIG_QOM_CAST_DEBUG + Object *inst = object_dynamic_cast(obj, typename); if (!inst && obj) { fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n", @@ -448,7 +447,9 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename, abort(); } - return inst; + assert(obj == inst); +#endif + return obj; } ObjectClass *object_class_dynamic_cast(ObjectClass *class, @@ -509,6 +510,12 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class, trace_object_class_dynamic_cast_assert(class ? class->type->name : "(null)", typename, file, line, func); +#ifndef CONFIG_QOM_CAST_DEBUG + if (!class->interfaces) { + return class; + } +#endif + ret = object_class_dynamic_cast(class, typename); if (!ret && class) { fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n",