[libvirt] [PATCH] esx: Improve dynamic cast detection in the generator

Matthias Bolte matthias.bolte at googlemail.com
Sun May 1 19:57:38 UTC 2011


Detect it based on usage as parameter, return type and member of other
object types.
---
 src/esx/esx_vi_generator.py |   32 ++++++++++++++++++--------------
 1 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index 70cf2ee..0d1c3bd 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -449,6 +449,7 @@ class Object(Base):
         self.features = features
         self.properties = properties
         self.extended_by = extended_by
+        self.candidate_for_dynamic_cast = False
 
         if self.extended_by is not None:
             self.extended_by.sort()
@@ -1406,13 +1407,6 @@ def open_and_print(filename):
 
 
 
-
-
-
-
-
-
-
 predefined_enums = ["Boolean"]
 
 predefined_objects = ["AnyType",
@@ -1431,22 +1425,16 @@ additional_object_features = { "AutoStartDefaults"          : Object.FEATURE__AN
                                "AutoStartPowerInfo"         : Object.FEATURE__ANY_TYPE,
                                "DatastoreHostMount"         : Object.FEATURE__DEEP_COPY | Object.FEATURE__LIST | Object.FEATURE__ANY_TYPE,
                                "DatastoreInfo"              : Object.FEATURE__ANY_TYPE | Object.FEATURE__DYNAMIC_CAST,
-                               "FileInfo"                   : Object.FEATURE__DYNAMIC_CAST,
-                               "FileQuery"                  : Object.FEATURE__DYNAMIC_CAST,
                                "HostConfigManager"          : Object.FEATURE__ANY_TYPE,
                                "HostCpuIdInfo"              : Object.FEATURE__ANY_TYPE | Object.FEATURE__LIST,
                                "HostDatastoreBrowserSearchResults" : Object.FEATURE__LIST | Object.FEATURE__ANY_TYPE,
                                "ManagedObjectReference"     : Object.FEATURE__ANY_TYPE,
                                "ObjectContent"              : Object.FEATURE__DEEP_COPY,
-                               "PerfEntityMetric"           : Object.FEATURE__DYNAMIC_CAST,
-                               "PerfMetricIntSeries"        : Object.FEATURE__DYNAMIC_CAST,
                                "ResourcePoolResourceUsage"  : Object.FEATURE__ANY_TYPE,
-                               "SelectionSpec"              : Object.FEATURE__DYNAMIC_CAST,
                                "ServiceContent"             : Object.FEATURE__DESERIALIZE,
                                "SharesInfo"                 : Object.FEATURE__ANY_TYPE,
                                "TaskInfo"                   : Object.FEATURE__ANY_TYPE | Object.FEATURE__LIST,
                                "UserSession"                : Object.FEATURE__ANY_TYPE,
-                               "VirtualDiskSpec"            : Object.FEATURE__DYNAMIC_CAST,
                                "VirtualMachineQuestionInfo" : Object.FEATURE__ANY_TYPE,
                                "VirtualMachineSnapshotTree" : Object.FEATURE__DEEP_COPY | Object.FEATURE__ANY_TYPE,
                                "VmEventArgument"            : Object.FEATURE__DESERIALIZE }
@@ -1537,6 +1525,7 @@ for method in methods_by_name.values():
             enums_by_name[parameter.type].features |= Enum.FEATURE__SERIALIZE
         else:
             objects_by_name[parameter.type].features |= Object.FEATURE__SERIALIZE
+            objects_by_name[parameter.type].candidate_for_dynamic_cast = True
 
         # detect list usage
         if parameter.occurrence == OCCURRENCE__REQUIRED_LIST or \
@@ -1553,6 +1542,7 @@ for method in methods_by_name.values():
             enums_by_name[method.returns.type].features |= Enum.FEATURE__DESERIALIZE
         else:
             objects_by_name[method.returns.type].features |= Object.FEATURE__DESERIALIZE
+            objects_by_name[method.returns.type].candidate_for_dynamic_cast = True
 
         # detect list usage
         if method.returns.occurrence == OCCURRENCE__REQUIRED_LIST or \
@@ -1585,11 +1575,16 @@ for obj in objects_by_name.values():
         if not is_known_type(obj.extends):
             report_error("object '%s' extends unknown object '%s'" % (obj.name, obj.extends))
 
-    # detect list usage
     for property in obj.properties:
         if not property.is_type_generated():
             continue
 
+        if property.is_enum():
+            enums_by_name[property.type].candidate_for_dynamic_cast = True
+        else:
+            objects_by_name[property.type].candidate_for_dynamic_cast = True
+
+        # detect list usage
         if property.occurrence == OCCURRENCE__REQUIRED_LIST or \
            property.occurrence == OCCURRENCE__OPTIONAL_LIST:
             if property.is_enum():
@@ -1620,6 +1615,15 @@ for obj in objects_by_name.values():
 
 
 
+for obj in objects_by_name.values():
+    # if an object is a candidate (it is used directly as parameter or return
+    # type or is a member of another object) and it is extended by another
+    # object then this type needs the dynamic cast feature
+    if obj.candidate_for_dynamic_cast and obj.extended_by:
+        obj.features |= Object.FEATURE__DYNAMIC_CAST
+
+
+
 def propagate_feature(obj, feature):
     global features_have_changed
 
-- 
1.7.0.4




More information about the libvir-list mailing list