Hi All,
 
Freeing of an object having inheritance depth >=2 throws an error such as:
" internal error Call to esxVI_<grand_parent>_Free for unexpected type 'Child'.  "
 
For instance:
Below code snippet is from esx_vi_generator.input (modified)
 
object VirtualDevice
    Int                                      key                            r   
    Description                              deviceInfo                     o   
    VirtualDeviceBackingInfo                 backing                        o   
    VirtualDeviceConnectInfo                 connectable                    o   
    Int                                      controllerKey                  o   
    Int                                      unitNumber                     o   
end

object VirtualController extends VirtualDevice
    Int                                      busNumber                      r
    Int                                      device                         ol
end


object VirtualIDEController extends VirtualController
end
 
object VirtualDeviceConfigSpec
    VirtualDeviceConfigSpecOperation         operation                      o
    VirtualDeviceConfigSpecFileOperation     fileOperation                  o
    VirtualDevice                            device                         r
end
 

object VirtualMachineConfigSpec
.
.
.
   VirtualDeviceConfigSpec                  deviceChange                   ol
.
.
end
 
On free of "VirtualMachineConfigSpec", I hit below error:
"
libvir: ESX Driver error : internal error Call to esxVI_VirtualDevice_Free for unexpected type 'VirtualIDEController'
"
 
But if I remove VirtualController and include its fields directly to VirtualIDEController, error is resolved. Please let me know if I'm missing anything, else, it seems like a bug with generated code.
 
While debugging the error seems to come from:
 
esx_vi_types.c:
 
/*
 * Macros to implement dynamic dispatched functions
 */
#define ESX_VI__TEMPLATE__DISPATCH(_actual_type, _actual_type_name, __type,   \
                                   _dispatch,  _error_return)                 \
    switch (_actual_type) {                                                   \
      _dispatch                                                               \
                                                                              \
      case esxVI_Type_##__type:                                               \
        break;                                                                \
                                                                              \
      default:                                                                \
        virReportError(VIR_ERR_INTERNAL_ERROR,                                \
                       _("Call to %s for unexpected type '%s'"),              \
                       __FUNCTION__, _actual_type_name);                      \
        return _error_return;                                                 \
    }

 
Thanks!
Ata