--- src/esx/esx_vi_generator.py | 430 ++++++++++++------------------------------- 1 file changed, 118 insertions(+), 312 deletions(-) diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py index 7130624..547eef6 100755 --- a/src/esx/esx_vi_generator.py +++ b/src/esx/esx_vi_generator.py @@ -440,8 +440,7 @@ class Type: return string - -class Object(Type): +class GenericObject(Type): FEATURE__DYNAMIC_CAST = (1 << 1) FEATURE__LIST = (1 << 2) FEATURE__DEEP_COPY = (1 << 3) @@ -450,16 +449,36 @@ class Object(Type): FEATURE__DESERIALIZE = (1 << 6) - def __init__(self, name, extends, properties, features=0, extended_by=None): + def __init__(self, name, category, managed, generic_objects_by_name): Type.__init__(self, "struct", name) - self.extends = extends - self.features = features - self.properties = properties - self.extended_by = extended_by - self.candidate_for_dynamic_cast = False + self.category = category + self.managed = managed + self.generic_objects_by_name = generic_objects_by_name + + + def generate_comment(self): + comment = separator + comment += " * %s: %s\n" % (self.category, self.name) + + if self.extends is not None: + comment += " * %s extends %s\n" \ + % (' ' * len(self.category), self.extends) + + first = True if self.extended_by is not None: - self.extended_by.sort() + for extended_by in self.extended_by: + if first: + comment += " * %s extended by %s\n" \ + % (' ' * len(self.category), extended_by) + first = False + else: + comment += " * %s %s\n" \ + % (' ' * len(self.category), extended_by) + + comment += " */\n\n" + + return comment def generate_struct_members(self, add_banner=False, struct_gap=False): @@ -469,7 +488,7 @@ class Object(Type): members += "\n" if self.extends is not None: - members += objects_by_name[self.extends] \ + members += self.generic_objects_by_name[self.extends] \ .generate_struct_members(add_banner=True, struct_gap=False) + "\n" @@ -499,7 +518,7 @@ class Object(Type): % (suffix, extended_by) for extended_by in self.extended_by: - source += objects_by_name[extended_by] \ + source += self.generic_objects_by_name[extended_by] \ .generate_dispatch(suffix, False) return source @@ -509,7 +528,7 @@ class Object(Type): source = "" if self.extends is not None: - source += objects_by_name[self.extends] \ + source += self.generic_objects_by_name[self.extends] \ .generate_free_code(add_banner=True) + "\n" if self.extends is not None or add_banner: @@ -535,7 +554,7 @@ class Object(Type): source = "" if self.extends is not None: - source += objects_by_name[self.extends] \ + source += self.generic_objects_by_name[self.extends] \ .generate_validate_code(add_banner=True) + "\n" if self.extends is not None or add_banner: @@ -547,7 +566,7 @@ class Object(Type): string = "" for property in self.properties: - string += property.generate_validate_code() + string += property.generate_validate_code(self.managed) if len(string) < 1: source += " /* no required properties */\n" @@ -557,6 +576,20 @@ class Object(Type): return source + +class Object(GenericObject): + def __init__(self, name, extends, properties, features=0, extended_by=None): + GenericObject.__init__(self, name, 'VI Object', False, objects_by_name) + self.extends = extends + 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() + + def generate_dynamic_cast_code(self, is_first=True): source = "" @@ -642,23 +675,7 @@ class Object(Type): def generate_header(self): - header = separator - header += " * VI Object: %s\n" % self.name - - if self.extends is not None: - header += " * extends %s\n" % self.extends - - first = True - - if self.extended_by is not None: - for extended_by in self.extended_by: - if first: - header += " * extended by %s\n" % extended_by - first = False - else: - header += " * %s\n" % extended_by - - header += " */\n\n" + header = self.generate_comment() # struct header += "struct _esxVI_%s {\n" % self.name @@ -762,57 +779,37 @@ class Object(Type): source += "ESX_VI__TEMPLATE__ALLOC(%s)\n\n" % self.name # free + source += "/* esxVI_%s_Free */\n" % self.name + if self.extended_by is None: - source += "/* esxVI_%s_Free */\n" % self.name source += "ESX_VI__TEMPLATE__FREE(%s,\n" % self.name - source += "{\n" - - if self.features & Object.FEATURE__LIST: - if self.extends is not None: - # avoid "dereferencing type-punned pointer will break - # strict-aliasing rules" warnings - source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ - % (self.extends, self.extends) - source += " esxVI_%s_Free(&next);\n" % self.extends - source += " item->_next = (esxVI_%s *)next;\n\n" % self.name - else: - source += " esxVI_%s_Free(&item->_next);\n\n" % self.name - - source += self.generate_free_code() - - source += "})\n\n" else: - source += "/* esxVI_%s_Free */\n" % self.name source += "ESX_VI__TEMPLATE__DYNAMIC_FREE(%s,\n" % self.name source += "{\n" - source += self.generate_dispatch('FREE') - source += "},\n" - source += "{\n" - if self.features & Object.FEATURE__LIST: - if self.extends is not None: - # avoid "dereferencing type-punned pointer will break - # strict-aliasing rules" warnings - source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ - % (self.extends, self.extends) - source += " esxVI_%s_Free(&next);\n" % self.extends - source += " item->_next = (esxVI_%s *)next;\n\n" % self.name - else: - source += " esxVI_%s_Free(&item->_next);\n\n" % self.name + source += "{\n" - source += self.generate_free_code() + if self.features & Object.FEATURE__LIST: + if self.extends is not None: + # avoid "dereferencing type-punned pointer will break + # strict-aliasing rules" warnings + source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ + % (self.extends, self.extends) + source += " esxVI_%s_Free(&next);\n" % self.extends + source += " item->_next = (esxVI_%s *)next;\n\n" % self.name + else: + source += " esxVI_%s_Free(&item->_next);\n\n" % self.name - source += "})\n\n" + source += self.generate_free_code() + source += "})\n\n" # validate source += "/* esxVI_%s_Validate */\n" % self.name source += "ESX_VI__TEMPLATE__VALIDATE(%s,\n" % self.name source += "{\n" - source += self.generate_validate_code() - source += "})\n\n" # dynamic cast @@ -821,9 +818,7 @@ class Object(Type): source += "/* esxVI_%s_DynamicCast */\n" % self.name source += "ESX_VI__TEMPLATE__DYNAMIC_CAST(%s,\n" % self.name source += "{\n" - source += self.generate_dynamic_cast_code() - source += "})\n\n" else: report_error("cannot add dynamic cast support for an untyped object") @@ -834,39 +829,25 @@ class Object(Type): source += "ESX_VI__TEMPLATE__LIST__APPEND(%s)\n\n" % self.name # deep copy - if self.extended_by is None: - if self.features & Object.FEATURE__DEEP_COPY: - source += "/* esxVI_%s_DeepCopy */\n" % self.name - source += "ESX_VI__TEMPLATE__DEEP_COPY(%s,\n" % self.name - source += "{\n" - - source += self.generate_deep_copy_code() - - source += "})\n\n" + if self.features & Object.FEATURE__DEEP_COPY: + source += "/* esxVI_%s_DeepCopy */\n" % self.name - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_DeepCopyList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__DEEP_COPY(%s)\n\n" \ - % self.name - else: - if self.features & Object.FEATURE__DEEP_COPY: - source += "/* esxVI_%s_DeepCopy */\n" % self.name + if self.extended_by is None: + source += "ESX_VI__TEMPLATE__DEEP_COPY(%s,\n" % self.name + else: source += "ESX_VI__TEMPLATE__DYNAMIC_DEEP_COPY(%s,\n" % self.name source += "{\n" - source += self.generate_dispatch('DEEP_COPY') - source += "},\n" - source += "{\n" - - source += self.generate_deep_copy_code() - source += "})\n\n" + source += "{\n" + source += self.generate_deep_copy_code() + source += "})\n\n" - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_DeepCopyList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__DEEP_COPY(%s)\n\n" \ - % self.name + if self.features & Object.FEATURE__LIST: + source += "/* esxVI_%s_DeepCopyList */\n" % self.name + source += "ESX_VI__TEMPLATE__LIST__DEEP_COPY(%s)\n\n" \ + % self.name # cast from any type if self.features & Object.FEATURE__ANY_TYPE: @@ -879,9 +860,7 @@ class Object(Type): source += "ESX_VI__TEMPLATE__DYNAMIC_CAST_FROM_ANY_TYPE(%s,\n" \ % self.name source += "{\n" - source += self.generate_dispatch('CAST_FROM_ANY_TYPE') - source += "})\n\n" if self.features & Object.FEATURE__LIST: @@ -890,75 +869,47 @@ class Object(Type): % self.name # serialize - if self.extended_by is None: - if self.features & Object.FEATURE__SERIALIZE: - source += "/* esxVI_%s_Serialize */\n" % self.name - source += "ESX_VI__TEMPLATE__SERIALIZE(%s,\n" % self.name - source += "{\n" - - source += self.generate_serialize_code() - - source += "})\n\n" + if self.features & Object.FEATURE__SERIALIZE: + source += "/* esxVI_%s_Serialize */\n" % self.name - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_SerializeList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__SERIALIZE(%s)\n\n" \ - % self.name - else: - if self.features & Object.FEATURE__SERIALIZE: - source += "/* esxVI_%s_Serialize */\n" % self.name + if self.extended_by is None: + source += "ESX_VI__TEMPLATE__SERIALIZE(%s,\n" % self.name + else: source += "ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(%s,\n" % self.name source += "{\n" - source += self.generate_dispatch('SERIALIZE') - source += "},\n" - source += "{\n" - - source += self.generate_serialize_code() - source += "})\n\n" + source += "{\n" + source += self.generate_serialize_code() + source += "})\n\n" - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_SerializeList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__SERIALIZE(%s)\n\n" \ - % self.name + if self.features & Object.FEATURE__LIST: + source += "/* esxVI_%s_SerializeList */\n" % self.name + source += "ESX_VI__TEMPLATE__LIST__SERIALIZE(%s)\n\n" \ + % self.name # deserialize - if self.extended_by is None: - if self.features & Object.FEATURE__DESERIALIZE: - source += "/* esxVI_%s_Deserialize */\n" % self.name - source += "ESX_VI__TEMPLATE__DESERIALIZE(%s,\n" % self.name - source += "{\n" - - source += self.generate_deserialize_code() - - source += "})\n\n" + if self.features & Object.FEATURE__DESERIALIZE: + source += "/* esxVI_%s_Deserialize */\n" % self.name - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_DeserializeList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__DESERIALIZE(%s)\n\n" \ - % self.name - else: - if self.features & Object.FEATURE__DESERIALIZE: - source += "/* esxVI_%s_Deserialize */\n" % self.name + if self.extended_by is None: + source += "ESX_VI__TEMPLATE__DESERIALIZE(%s,\n" % self.name + else: source += "ESX_VI__TEMPLATE__DYNAMIC_DESERIALIZE(%s,\n" \ % self.name source += "{\n" - source += self.generate_dispatch('DESERIALIZE') - source += "},\n" - source += "{\n" - - source += self.generate_deserialize_code() - source += "})\n\n" + source += "{\n" + source += self.generate_deserialize_code() + source += "})\n\n" - if self.features & Object.FEATURE__LIST: - source += "/* esxVI_%s_DeserializeList */\n" % self.name - source += "ESX_VI__TEMPLATE__LIST__DESERIALIZE(%s)\n\n" \ - % self.name + if self.features & Object.FEATURE__LIST: + source += "/* esxVI_%s_DeserializeList */\n" % self.name + source += "ESX_VI__TEMPLATE__LIST__DESERIALIZE(%s)\n\n" \ + % self.name source += "\n\n" @@ -966,12 +917,10 @@ class Object(Type): -class ManagedObject(Type): - FEATURE__LIST = (1 << 2) - - +class ManagedObject(GenericObject): def __init__(self, name, extends, properties, features=0, extended_by=None): - Type.__init__(self, "struct", name) + GenericObject.__init__(self, name, 'VI Managed Object', True, + managed_objects_by_name) self.extends = extends self.features = features self.properties = properties @@ -981,100 +930,6 @@ class ManagedObject(Type): self.extended_by.sort() - def generate_struct_members(self, add_banner=False, struct_gap=False): - members = "" - - if struct_gap: - members += "\n" - - if self.extends is not None: - members += managed_objects_by_name[self.extends] \ - .generate_struct_members(add_banner=True) + "\n" - - if self.extends is not None or add_banner: - members += " /* %s */\n" % self.name - - for property in self.properties: - members += property.generate_struct_member() - - if len(self.properties) < 1: - members += " /* no properties */\n" - - return members - - - def generate_dispatch(self, suffix, is_first=True): - source = "" - - if self.extended_by is not None: - if not is_first: - source += "\n" - - source += " /* %s */\n" % self.name - - for extended_by in self.extended_by: - source += " ESX_VI__TEMPLATE__DISPATCH__%s(%s)\n" \ - % (suffix, extended_by) - - for extended_by in self.extended_by: - source += managed_objects_by_name[extended_by] \ - .generate_dispatch(suffix, False) - - return source - - - def generate_free_code(self, add_banner=False): - source = "" - - if self.extends is not None: - source += managed_objects_by_name[self.extends] \ - .generate_free_code(add_banner=True) + "\n" - - if self.extends is not None or add_banner: - source += " /* %s */\n" % self.name - - if len(self.properties) < 1: - source += " /* no properties */\n" - else: - string = "" - - for property in self.properties: - string += property.generate_free_code() - - if len(string) < 1: - source += " /* no properties to be freed */\n" - else: - source += string - - return source - - - def generate_validate_code(self, add_banner=False): - source = "" - - if self.extends is not None: - source += managed_objects_by_name[self.extends] \ - .generate_validate_code(add_banner=True) + "\n" - - if self.extends is not None or add_banner: - source += " /* %s */\n" % self.name - - if len(self.properties) < 1: - source += " /* no properties */\n" - else: - string = "" - - for property in self.properties: - string += property.generate_validate_code(managed=True) - - if len(string) < 1: - source += " /* no required properties */\n" - else: - source += string - - return source - - def generate_lookup_code1(self, add_banner=False): source = "" @@ -1127,30 +982,6 @@ class ManagedObject(Type): return source - def generate_comment(self): - comment = separator - comment += " * VI Managed Object: %s\n" % self.name - - if self.extends is not None: - comment += " * extends %s\n" % self.extends - - first = True - - if self.extended_by is not None: - for extended_by in self.extended_by: - if first: - comment += " * extended by %s\n" \ - % extended_by - first = False - else: - comment += " * %s\n" \ - % extended_by - - comment += " */\n\n" - - return comment - - def generate_header(self): header = self.generate_comment() @@ -1169,7 +1000,6 @@ class ManagedObject(Type): "/* required */\n") header += "\n" header += self.generate_struct_members() - header += "};\n\n" # functions @@ -1213,53 +1043,32 @@ class ManagedObject(Type): source += "ESX_VI__TEMPLATE__ALLOC(%s)\n\n" % self.name # free + source += "/* esxVI_%s_Free */\n" % self.name + if self.extended_by is None: - source += "/* esxVI_%s_Free */\n" % self.name source += "ESX_VI__TEMPLATE__FREE(%s,\n" % self.name - source += "{\n" - - if self.features & ManagedObject.FEATURE__LIST: - if self.extends is not None: - # avoid "dereferencing type-punned pointer will break - # strict-aliasing rules" warnings - source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ - % (self.extends, self.extends) - source += " esxVI_%s_Free(&next);\n" % self.extends - source += " item->_next = (esxVI_%s *)next;\n\n" % self.name - else: - source += " esxVI_%s_Free(&item->_next);\n" % self.name - - source += " esxVI_ManagedObjectReference_Free(&item->_reference);\n\n" - - source += self.generate_free_code() - - source += "})\n\n" else: - source += "/* esxVI_%s_Free */\n" % self.name source += "ESX_VI__TEMPLATE__DYNAMIC_FREE(%s,\n" % self.name source += "{\n" - source += self.generate_dispatch('FREE') - source += "},\n" - source += "{\n" - - if self.features & ManagedObject.FEATURE__LIST: - if self.extends is not None: - # avoid "dereferencing type-punned pointer will break - # strict-aliasing rules" warnings - source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ - % (self.extends, self.extends) - source += " esxVI_%s_Free(&next);\n" % self.extends - source += " item->_next = (esxVI_%s *)next;\n\n" % self.name - else: - source += " esxVI_%s_Free(&item->_next);\n" % self.name - source += " esxVI_ManagedObjectReference_Free(&item->_reference);\n\n" + source += "{\n" - source += self.generate_free_code() + if self.features & ManagedObject.FEATURE__LIST: + if self.extends is not None: + # avoid "dereferencing type-punned pointer will break + # strict-aliasing rules" warnings + source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" \ + % (self.extends, self.extends) + source += " esxVI_%s_Free(&next);\n" % self.extends + source += " item->_next = (esxVI_%s *)next;\n\n" % self.name + else: + source += " esxVI_%s_Free(&item->_next);\n" % self.name - source += "})\n\n" + source += " esxVI_ManagedObjectReference_Free(&item->_reference);\n\n" + source += self.generate_free_code() + source += "})\n\n" # validate source += "/* esxVI_%s_Validate */\n" % self.name @@ -1319,8 +1128,6 @@ class Enum(Type): header = separator header += " * VI Enum: %s\n" % self.name header += " */\n\n" - - # enum header += "enum _esxVI_%s {\n" % self.name header += " esxVI_%s_Undefined = 0,\n" % self.name @@ -1354,7 +1161,6 @@ class Enum(Type): source = separator source += " * VI Enum: %s\n" % self.name source += " */\n\n" - source += "static const esxVI_Enumeration _esxVI_%s_Enumeration = {\n" \ % self.name source += " esxVI_Type_%s, {\n" % self.name -- 1.7.9.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list