All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
__cxxabiv1 Namespace Reference

Namespaces

 __class_type_info
 

Functions

void * __dynamic_cast (const void *src_ptr, const __class_type_info *src_type, const __class_type_info *dst_type, ptrdiff_t src2dst)
 

Function Documentation

void* __cxxabiv1::__dynamic_cast ( const void *  src_ptr,
const __class_type_info *  src_type,
const __class_type_info *  dst_type,
ptrdiff_t  src2dst 
)

Definition at line 682 of file tinfo.cc.

686 {
687  const void *vtable = *static_cast <const void *const *> (src_ptr);
688  const vtable_prefix *prefix =
689  adjust_pointer <vtable_prefix> (vtable,
690  -offsetof (vtable_prefix, origin));
691  const void *whole_ptr =
692  adjust_pointer <void> (src_ptr, prefix->whole_object);
693  const __class_type_info *whole_type = prefix->whole_type;
694  __class_type_info::__dyncast_result result;
695 
696  whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
697  dst_type, whole_ptr, src_type, src_ptr, result);
698  if (!result.dst_ptr)
699  return NULL;
700  if (contained_public_p (result.dst2src))
701  // Src is known to be a public base of dst.
702  return const_cast <void *> (result.dst_ptr);
703  if (contained_public_p (__class_type_info::__sub_kind (result.whole2src & result.whole2dst)))
704  // Both src and dst are known to be public bases of whole. Found a valid
705  // cross cast.
706  return const_cast <void *> (result.dst_ptr);
707  if (contained_nonvirtual_p (result.whole2src))
708  // Src is known to be a non-public nonvirtual base of whole, and not a
709  // base of dst. Found an invalid cross cast, which cannot also be a down
710  // cast
711  return NULL;
712  if (result.dst2src == __class_type_info::__unknown)
713  result.dst2src = dst_type->__find_public_src (src2dst, result.dst_ptr,
714  src_type, src_ptr);
715  if (contained_public_p (result.dst2src))
716  // Found a valid down cast
717  return const_cast <void *> (result.dst_ptr);
718  // Must be an invalid down cast, or the cross cast wasn't bettered
719  return NULL;
720 }