[libvirt] [PATCH] esx: Improve list usage detection in the generator

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


Detect it based on usage as parameter and return type too.
---
 src/esx/esx_vi_generator.py |   41 +++++++++++++++++++++++++++++++----------
 1 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index 8ac1249..70cf2ee 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -1428,7 +1428,7 @@ additional_enum_features = { "ManagedEntityStatus"      : Enum.FEATURE__ANY_TYPE
                              "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE }
 
 additional_object_features = { "AutoStartDefaults"          : Object.FEATURE__ANY_TYPE,
-                               "AutoStartPowerInfo"         : Object.FEATURE__ANY_TYPE | Object.FEATURE__LIST,
+                               "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,
@@ -1437,12 +1437,9 @@ additional_object_features = { "AutoStartDefaults"          : Object.FEATURE__AN
                                "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 | Object.FEATURE__LIST,
-                               "PerfCounterInfo"            : Object.FEATURE__LIST,
-                               "PerfEntityMetric"           : Object.FEATURE__LIST | Object.FEATURE__DYNAMIC_CAST,
-                               "PerfQuerySpec"              : Object.FEATURE__LIST,
+                               "ObjectContent"              : Object.FEATURE__DEEP_COPY,
+                               "PerfEntityMetric"           : Object.FEATURE__DYNAMIC_CAST,
                                "PerfMetricIntSeries"        : Object.FEATURE__DYNAMIC_CAST,
-                               "PropertyFilterSpec"         : Object.FEATURE__LIST,
                                "ResourcePoolResourceUsage"  : Object.FEATURE__ANY_TYPE,
                                "SelectionSpec"              : Object.FEATURE__DYNAMIC_CAST,
                                "ServiceContent"             : Object.FEATURE__DESERIALIZE,
@@ -1541,6 +1538,15 @@ for method in methods_by_name.values():
         else:
             objects_by_name[parameter.type].features |= Object.FEATURE__SERIALIZE
 
+        # detect list usage
+        if parameter.occurrence == OCCURRENCE__REQUIRED_LIST or \
+           parameter.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            if parameter.is_enum():
+                report_error("unsupported usage of enum '%s' as list in '%s'"
+                             % (parameter.type, method.name))
+            else:
+                objects_by_name[parameter.type].features |= Object.FEATURE__LIST
+
     # method return types must be deserializable
     if method.returns and method.returns.is_type_generated():
         if method.returns.is_enum():
@@ -1548,6 +1554,15 @@ for method in methods_by_name.values():
         else:
             objects_by_name[method.returns.type].features |= Object.FEATURE__DESERIALIZE
 
+        # detect list usage
+        if method.returns.occurrence == OCCURRENCE__REQUIRED_LIST or \
+           method.returns.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            if method.returns.is_enum():
+                report_error("unsupported usage of enum '%s' as list in '%s'"
+                             % (method.returns.type, method.name))
+            else:
+                objects_by_name[method.returns.type].features |= Object.FEATURE__LIST
+
 
 
 for enum in enums_by_name.values():
@@ -1572,10 +1587,16 @@ for obj in objects_by_name.values():
 
     # detect list usage
     for property in obj.properties:
-        if (property.occurrence == OCCURRENCE__REQUIRED_LIST or \
-            property.occurrence == OCCURRENCE__OPTIONAL_LIST) and \
-           property.type not in predefined_objects:
-            objects_by_name[property.type].features |= Object.FEATURE__LIST
+        if not property.is_type_generated():
+            continue
+
+        if property.occurrence == OCCURRENCE__REQUIRED_LIST or \
+           property.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            if property.is_enum():
+                report_error("unsupported usage of enum '%s' as list in '%s'"
+                             % (property.type, obj.type))
+            else:
+                objects_by_name[property.type].features |= Object.FEATURE__LIST
 
     # apply/remove additional features
     if obj.name in additional_object_features:
-- 
1.7.0.4




More information about the libvir-list mailing list