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