use std::mem;
use crate::{util::CStr, Pod};
use super::Ptr;
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct TypeDescriptor {
pub vftable: Ptr,
pub spare: Ptr<CStr>,
#[cfg_attr(feature = "serde", serde(skip))]
pub name: [u8; 0],
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct PMD {
pub mdisp: i32,
pub pdisp: i32,
pub vdisp: i32,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct FuncInfo {
pub magic_number: u32,
pub max_state: i32,
pub unwind_map: Ptr,
pub try_blocks: u32,
pub try_block_map: Ptr<UnwindMapEntry>,
pub ip_map_entries: u32,
pub ip_to_state_map: Ptr,
pub es_type_list: Ptr<ESTypeList>,
pub eh_flags: i32,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct UnwindMapEntry {
pub to_state: i32,
pub action: Ptr,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct TryBlockMapEntry {
pub try_low: i32,
pub try_high: i32,
pub catch_high: i32,
pub catches: i32,
pub handler_array: Ptr<[HandlerType]>,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct HandlerType {
pub adjectives: u32,
pub ty: Ptr<TypeDescriptor>,
pub disp_catch_obj: i32,
pub address_of_handler: Ptr,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct ESTypeList {
pub count: i32,
pub type_array: Ptr<[HandlerType]>,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct ThrowInfo {
pub attributes: u32,
pub unwind: Ptr,
pub forward_compat: Ptr,
pub catchable_type_array: Ptr<CatchableTypeArray>,
}
#[derive(Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct CatchableTypeArray {
pub catchable_types: i32,
#[cfg_attr(feature = "serde", serde(skip))]
pub array: [Ptr<CatchableType>; 0],
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct CatchableType {
pub properties: u32,
pub type_descriptor: Ptr<TypeDescriptor>,
pub pmd: PMD,
pub size_or_offset: i32,
pub copy_function: Ptr,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct RTTICompleteObjectLocator {
pub signature: u32,
pub offset: u32,
pub cd_offset: u32,
pub type_descriptor: Ptr<TypeDescriptor>,
pub class_descriptor: Ptr<RTTIClassHierarchyDescriptor>,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct RTTIClassHierarchyDescriptor {
pub signature: u32,
pub attributes: u32,
pub num_base_classes: u32,
pub base_class_array: Ptr<[Ptr<RTTIBaseClassDescriptor>]>,
}
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[repr(C)]
pub struct RTTIBaseClassDescriptor {
pub type_descriptor: Ptr<TypeDescriptor>,
pub num_contained_bases: u32,
pub pmd: PMD,
pub attributes: u32,
}
unsafe impl Pod for TypeDescriptor {}
unsafe impl Pod for PMD {}
unsafe impl Pod for FuncInfo {}
unsafe impl Pod for UnwindMapEntry {}
unsafe impl Pod for TryBlockMapEntry {}
unsafe impl Pod for HandlerType {}
unsafe impl Pod for ESTypeList {}
unsafe impl Pod for ThrowInfo {}
unsafe impl Pod for CatchableTypeArray {}
unsafe impl Pod for CatchableType {}
unsafe impl Pod for RTTICompleteObjectLocator {}
unsafe impl Pod for RTTIClassHierarchyDescriptor {}
unsafe impl Pod for RTTIBaseClassDescriptor {}
const _: [(); 8] = [(); mem::size_of::<TypeDescriptor>()]; const _: [(); 12] = [(); mem::size_of::<PMD>()];
const _: [(); 36] = [(); mem::size_of::<FuncInfo>()];
const _: [(); 8] = [(); mem::size_of::<UnwindMapEntry>()];
const _: [(); 20] = [(); mem::size_of::<TryBlockMapEntry>()];
const _: [(); 16] = [(); mem::size_of::<HandlerType>()];
const _: [(); 8] = [(); mem::size_of::<ESTypeList>()];
const _: [(); 16] = [(); mem::size_of::<ThrowInfo>()];
const _: [(); 4] = [(); mem::size_of::<CatchableTypeArray>()]; const _: [(); 28] = [(); mem::size_of::<CatchableType>()];
const _: [(); 20] = [(); mem::size_of::<RTTICompleteObjectLocator>()];
const _: [(); 16] = [(); mem::size_of::<RTTIClassHierarchyDescriptor>()];
const _: [(); 24] = [(); mem::size_of::<RTTIBaseClassDescriptor>()];