diff mbox series

[PATCH-for-10.1,4/6] qom: Prefer object_class_implements_type() to check type implementation

Message ID 20250320154722.27349-5-philmd@linaro.org
State New
Headers show
Series qom: Add object_class_implements_type() | expand

Commit Message

Philippe Mathieu-Daudé March 20, 2025, 3:47 p.m. UTC
When we only want to check a type is implemented and
are not interested by the returned class, prefer
object_class_implements_type() over object_class_dynamic_cast().

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 chardev/char.c             | 2 +-
 hw/arm/xlnx-versal-virt.c  | 2 +-
 hw/core/cpu-common.c       | 2 +-
 hw/core/machine.c          | 4 ++--
 hw/i386/xen/xen_platform.c | 2 +-
 hw/pci/pci.c               | 6 +++---
 qom/object.c               | 2 +-
 qom/object_interfaces.c    | 2 +-
 qom/qom-qmp-cmds.c         | 4 ++--
 system/qdev-monitor.c      | 4 ++--
 system/tpm.c               | 2 +-
 target/alpha/cpu.c         | 2 +-
 target/rx/cpu.c            | 2 +-
 13 files changed, 18 insertions(+), 18 deletions(-)
diff mbox series

Patch

diff --git a/chardev/char.c b/chardev/char.c
index 5a9e9762adc..b7125e3aebe 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -528,7 +528,7 @@  static const ChardevClass *char_get_class(const char *driver, Error **errp)
     oc = module_object_class_by_name(typename);
     g_free(typename);
 
-    if (!object_class_dynamic_cast(oc, TYPE_CHARDEV)) {
+    if (!object_class_implements_type(oc, TYPE_CHARDEV)) {
         error_setg(errp, "'%s' is not a valid char driver name", driver);
         return NULL;
     }
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 0c6f0359e3d..9313780a4c2 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -760,7 +760,7 @@  static void versal_virt_init(MachineState *machine)
             flash_klass = object_class_by_name(s->ospi_model);
             if (!flash_klass ||
                 object_class_is_abstract(flash_klass) ||
-                !object_class_dynamic_cast(flash_klass, TYPE_M25P80)) {
+                !object_class_implements_type(flash_klass, TYPE_M25P80)) {
                 error_report("'%s' is either abstract or"
                        " not a subtype of m25p80", s->ospi_model);
                 exit(1);
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index 9064dd24f82..89c2dd53599 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -144,7 +144,7 @@  ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
     assert(cc->class_by_name);
     assert(cpu_model);
     oc = cc->class_by_name(cpu_model);
-    if (object_class_dynamic_cast(oc, typename) &&
+    if (object_class_implements_type(oc, typename) &&
         !object_class_is_abstract(oc)) {
         return oc;
     }
diff --git a/hw/core/machine.c b/hw/core/machine.c
index f52a4f2273b..712d07e1593 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -735,7 +735,7 @@  bool device_type_is_dynamic_sysbus(MachineClass *mc, const char *type)
     for (wl = mc->allowed_dynamic_sysbus_devices;
          !allowed && wl;
          wl = wl->next) {
-        allowed |= !!object_class_dynamic_cast(klass, wl->value);
+        allowed |= object_class_implements_type(klass, wl->value);
     }
 
     return allowed;
@@ -1553,7 +1553,7 @@  static bool is_cpu_type_supported(const MachineState *machine, Error **errp)
     if (mc->valid_cpu_types) {
         assert(mc->valid_cpu_types[0] != NULL);
         for (i = 0; mc->valid_cpu_types[i]; i++) {
-            if (object_class_dynamic_cast(oc, mc->valid_cpu_types[i])) {
+            if (object_class_implements_type(oc, mc->valid_cpu_types[i])) {
                 break;
             }
         }
diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c
index dd648a2ee94..761357657f1 100644
--- a/hw/i386/xen/xen_platform.c
+++ b/hw/i386/xen/xen_platform.c
@@ -144,7 +144,7 @@  static void del_nic_peer(NICState *nic, void *opaque)
     ObjectClass *klass = module_object_class_by_name(nc->model);
 
     /* Only delete peers of PCI NICs that we're about to delete */
-    if (!klass || !object_class_dynamic_cast(klass, TYPE_PCI_DEVICE)) {
+    if (!klass || !object_class_implements_type(klass, TYPE_PCI_DEVICE)) {
         return;
     }
 
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 2844ec55560..ff2373b9876 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2244,12 +2244,12 @@  static void pci_qdev_realize(DeviceState *qdev, Error **errp)
     /* initialize cap_present for pci_is_express() and pci_config_size(),
      * Note that hybrid PCIs are not set automatically and need to manage
      * QEMU_PCI_CAP_EXPRESS manually */
-    if (object_class_dynamic_cast(klass, INTERFACE_PCIE_DEVICE) &&
-       !object_class_dynamic_cast(klass, INTERFACE_CONVENTIONAL_PCI_DEVICE)) {
+    if (object_class_implements_type(klass, INTERFACE_PCIE_DEVICE) &&
+       !object_class_implements_type(klass, INTERFACE_CONVENTIONAL_PCI_DEVICE)) {
         pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
     }
 
-    if (object_class_dynamic_cast(klass, INTERFACE_CXL_DEVICE)) {
+    if (object_class_implements_type(klass, INTERFACE_CXL_DEVICE)) {
         pci_dev->cap_present |= QEMU_PCIE_CAP_CXL;
     }
 
diff --git a/qom/object.c b/qom/object.c
index b9948937935..536308c0553 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -894,7 +894,7 @@  bool object_set_propv(Object *obj,
 
 Object *object_dynamic_cast(Object *obj, const char *typename)
 {
-    if (obj && object_class_dynamic_cast(object_get_class(obj), typename)) {
+    if (obj && object_class_implements_type(object_get_class(obj), typename)) {
         return obj;
     }
 
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 1ffea1a7288..333c5f94e19 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -98,7 +98,7 @@  Object *user_creatable_add_type(const char *type, const char *id,
         return NULL;
     }
 
-    if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE)) {
+    if (!object_class_implements_type(klass, TYPE_USER_CREATABLE)) {
         error_setg(errp, "object type '%s' isn't supported by object-add",
                    type);
         return NULL;
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index e8665476182..1a1f0e1dfd6 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -134,7 +134,7 @@  ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
         return NULL;
     }
 
-    if (!object_class_dynamic_cast(klass, TYPE_DEVICE)
+    if (!object_class_implements_type(klass, TYPE_DEVICE)
         || object_class_is_abstract(klass)) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename",
                    "a non-abstract device type");
@@ -193,7 +193,7 @@  ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
         return NULL;
     }
 
-    if (!object_class_dynamic_cast(klass, TYPE_OBJECT)) {
+    if (!object_class_implements_type(klass, TYPE_OBJECT)) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename",
                    "a QOM type");
         return NULL;
diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 5588ed2047d..7e4cfe0f0e5 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -246,7 +246,7 @@  static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
         }
     }
 
-    if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
+    if (!object_class_implements_type(oc, TYPE_DEVICE)) {
         if (*driver != original_name) {
             error_setg(errp, "'%s' (alias '%s') is not a valid device model"
                        " name", original_name, *driver);
@@ -269,7 +269,7 @@  static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
         return NULL;
     }
 
-    if (object_class_dynamic_cast(oc, TYPE_SYS_BUS_DEVICE)) {
+    if (object_class_implements_type(oc, TYPE_SYS_BUS_DEVICE)) {
         /* sysbus devices need to be allowed by the machine */
         MachineClass *mc = MACHINE_CLASS(object_get_class(qdev_get_machine()));
         if (!device_type_is_dynamic_sysbus(mc, *driver)) {
diff --git a/system/tpm.c b/system/tpm.c
index 8df0f6e72b3..eeb1bd0e27c 100644
--- a/system/tpm.c
+++ b/system/tpm.c
@@ -34,7 +34,7 @@  tpm_be_find_by_type(enum TpmType type)
     oc = object_class_by_name(typename);
     g_free(typename);
 
-    if (!object_class_dynamic_cast(oc, TYPE_TPM_BACKEND)) {
+    if (!object_class_implements_type(oc, TYPE_TPM_BACKEND)) {
         return NULL;
     }
 
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index 584c2aa76bd..f9ba199e794 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -136,7 +136,7 @@  static ObjectClass *alpha_cpu_class_by_name(const char *cpu_model)
     int i;
 
     oc = object_class_by_name(cpu_model);
-    if (oc != NULL && object_class_dynamic_cast(oc, TYPE_ALPHA_CPU) != NULL) {
+    if (oc != NULL && object_class_implements_type(oc, TYPE_ALPHA_CPU)) {
         return oc;
     }
 
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
index 0ba0d55ab5b..2cc4e1df7aa 100644
--- a/target/rx/cpu.c
+++ b/target/rx/cpu.c
@@ -119,7 +119,7 @@  static ObjectClass *rx_cpu_class_by_name(const char *cpu_model)
     char *typename;
 
     oc = object_class_by_name(cpu_model);
-    if (oc != NULL && object_class_dynamic_cast(oc, TYPE_RX_CPU) != NULL) {
+    if (oc != NULL && object_class_implements_type(oc, TYPE_RX_CPU)) {
         return oc;
     }
     typename = g_strdup_printf(RX_CPU_TYPE_NAME("%s"), cpu_model);