[libvirt] [PATCH] esx: Fix dynamic dispatch for types with more than one level of inheritance

Traverse the whole inheritance hierarchy for dynamic dispatch as it is already done for the dynamic cast. Also make AnyType cast errors more verbose. Reported by Ata Bohra. --- src/esx/esx_vi_generator.py | 36 ++++++++++++++++++++++++------------ src/esx/esx_vi_types.c | 12 ++++++++---- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py index c4bbb03..af4e7e8 100755 --- a/src/esx/esx_vi_generator.py +++ b/src/esx/esx_vi_generator.py @@ -484,6 +484,26 @@ class Object(Type): 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 += objects_by_name[extended_by] \ + .generate_dispatch(suffix, False) + + return source + + def generate_free_code(self, add_banner=False): source = "" @@ -835,9 +855,7 @@ class Object(Type): source += "ESX_VI__TEMPLATE__DYNAMIC_DEEP_COPY(%s,\n" % self.name source += "{\n" - for extended_by in self.extended_by: - source += " ESX_VI__TEMPLATE__DISPATCH__DEEP_COPY(%s)\n" \ - % extended_by + source += self.generate_dispatch('DEEP_COPY') source += "},\n" source += "{\n" @@ -863,9 +881,7 @@ class Object(Type): % self.name source += "{\n" - for extended_by in self.extended_by: - source += " ESX_VI__TEMPLATE__DISPATCH__CAST_FROM_ANY_TYPE(%s)\n" \ - % extended_by + source += self.generate_dispatch('CAST_FROM_ANY_TYPE') source += "})\n\n" @@ -895,9 +911,7 @@ class Object(Type): source += "ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(%s,\n" % self.name source += "{\n" - for extended_by in self.extended_by: - source += " ESX_VI__TEMPLATE__DISPATCH__SERIALIZE(%s)\n" \ - % extended_by + source += self.generate_dispatch('SERIALIZE') source += "},\n" source += "{\n" @@ -933,9 +947,7 @@ class Object(Type): % self.name source += "{\n" - for extended_by in self.extended_by: - source += " ESX_VI__TEMPLATE__DISPATCH__DESERIALIZE(%s)\n" \ - % extended_by + source += self.generate_dispatch('DESERIALIZE') source += "},\n" source += "{\n" diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index d2c71c7..c5ddb51 100644 --- a/src/esx/esx_vi_types.c +++ b/src/esx/esx_vi_types.c @@ -212,8 +212,10 @@ { \ if (anyType->type != esxVI_Type_##_type) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ - _("Call to %s for unexpected type '%s'"), \ - __FUNCTION__, anyType->other); \ + _("Call to %s for unexpected type '%s', " \ + "expected '%s'"), \ + __FUNCTION__, anyType->other, \ + esxVI_Type_ToString(esxVI_Type_##_type)); \ return -1; \ } \ }, /* nothing */) @@ -225,8 +227,10 @@ { \ if (anyType->type != esxVI_Type_##_type) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ - _("Call to %s for unexpected type '%s'"), \ - __FUNCTION__, anyType->other); \ + _("Call to %s for unexpected type '%s', " \ + "expected '%s'"), \ + __FUNCTION__, anyType->other, \ + esxVI_Type_ToString(esxVI_Type_##_type)); \ return -1; \ } \ }, Value) -- 1.7.4.1

On 10/06/2012 10:32 AM, Matthias Bolte wrote:
Traverse the whole inheritance hierarchy for dynamic dispatch as it is already done for the dynamic cast.
Also make AnyType cast errors more verbose.
Reported by Ata Bohra. --- src/esx/esx_vi_generator.py | 36 ++++++++++++++++++++++++------------ src/esx/esx_vi_types.c | 12 ++++++++---- 2 files changed, 32 insertions(+), 16 deletions(-)
ACK. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

2012/10/9 Eric Blake <eblake@redhat.com>:
On 10/06/2012 10:32 AM, Matthias Bolte wrote:
Traverse the whole inheritance hierarchy for dynamic dispatch as it is already done for the dynamic cast.
Also make AnyType cast errors more verbose.
Reported by Ata Bohra. --- src/esx/esx_vi_generator.py | 36 ++++++++++++++++++++++++------------ src/esx/esx_vi_types.c | 12 ++++++++---- 2 files changed, 32 insertions(+), 16 deletions(-)
ACK.
Thanks, pushed. -- Matthias Bolte http://photron.blogspot.com
participants (2)
-
Eric Blake
-
Matthias Bolte