Commit 1e143002 by Nathan Sidwell Committed by Nathan Sidwell

tinfo.cc (convert_to_base): New function.

	* tinfo.cc (convert_to_base): New function.
	(get_vbase_offset): Remove. Move into convert_to_base.
	(__vmi_class_type_info::do_find_public_src): Adjust.
	(__vmi_class_type_info::do_dyncast): Adjust.
	(__vmi_class_type_info::do_upcast): Adjust.
plus commit changelog entry 2000-04-06  Nathan Sidwell  <nathan@codesourcery.com>

From-SVN: r32993
parent 62771d51
2000-04-07 Nathan Sidwell <nathan@codesourcery.com>
* tinfo.cc (convert_to_base): New function.
(get_vbase_offset): Remove. Move into convert_to_base.
(__vmi_class_type_info::do_find_public_src): Adjust.
(__vmi_class_type_info::do_dyncast): Adjust.
(__vmi_class_type_info::do_upcast): Adjust.
2000-04-06 Jason Merrill <jason@yorick.cygnus.com> 2000-04-06 Jason Merrill <jason@yorick.cygnus.com>
* tinfo.cc (operator=): Use __builtin_strcmp. * tinfo.cc (operator=): Use __builtin_strcmp.
...@@ -30,6 +38,14 @@ ...@@ -30,6 +38,14 @@
2000-04-06 Nathan Sidwell <nathan@codesourcery.com> 2000-04-06 Nathan Sidwell <nathan@codesourcery.com>
* vec.cc: New file.
* Make-lang.in (CXX_LIB2FUNCS): Add it.
(vec.o): Build it.
* inc/cxxabi.h (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor,
__cxa_vec_delete): Declare.
2000-04-06 Nathan Sidwell <nathan@codesourcery.com>
* rtti.c (dfs_class_hint_mark): New static function. * rtti.c (dfs_class_hint_mark): New static function.
(dfs_class_hint_unmark): New static function. (dfs_class_hint_unmark): New static function.
(class_hint_flags): Use them. (class_hint_flags): Use them.
......
...@@ -590,12 +590,19 @@ adjust_pointer (const void *base, ptrdiff_t offset) ...@@ -590,12 +590,19 @@ adjust_pointer (const void *base, ptrdiff_t offset)
(reinterpret_cast <const char *> (base) + offset); (reinterpret_cast <const char *> (base) + offset);
} }
inline ptrdiff_t // ADDR is a pointer to an object. Convert it to a pointer to a base,
get_vbase_offset (const void *object, ptrdiff_t offset) // using OFFSET. IS_VIRTUAL is true, if we are getting a virtual base.
inline void const *
convert_to_base (void const *addr, bool is_virtual, ptrdiff_t offset)
{ {
const char *vtable = *reinterpret_cast <const char *const *> (object); if (is_virtual)
vtable += offset; {
return *reinterpret_cast <const ptrdiff_t *> (vtable); const void *vtable = *static_cast <const void *const *> (addr);
offset = *adjust_pointer<ptrdiff_t> (vtable, offset);
}
return adjust_pointer<void> (addr, offset);
} }
// some predicate functions for __class_type_info::sub_kind // some predicate functions for __class_type_info::sub_kind
...@@ -721,20 +728,20 @@ do_find_public_src (ptrdiff_t src2dst, ...@@ -721,20 +728,20 @@ do_find_public_src (ptrdiff_t src2dst,
const void *base = obj_ptr; const void *base = obj_ptr;
ptrdiff_t offset = base_list[i].offset (); ptrdiff_t offset = base_list[i].offset ();
bool is_virtual = base_list[i].is_virtual_p ();
if (base_list[i].is_virtual_p ()) if (is_virtual)
{ {
if (src2dst == -3) if (src2dst == -3)
continue; // Not a virtual base, so can't be here. continue; // Not a virtual base, so can't be here.
offset = get_vbase_offset (base, offset);
} }
base = adjust_pointer <void> (base, offset); base = convert_to_base (base, is_virtual, offset);
sub_kind base_kind = base_list[i].base->do_find_public_src sub_kind base_kind = base_list[i].base->do_find_public_src
(src2dst, base, src_type, src_ptr); (src2dst, base, src_type, src_ptr);
if (contained_p (base_kind)) if (contained_p (base_kind))
{ {
if (base_list[i].is_virtual_p ()) if (is_virtual)
base_kind = sub_kind (base_kind | contained_virtual_mask); base_kind = sub_kind (base_kind | contained_virtual_mask);
return base_kind; return base_kind;
} }
...@@ -843,13 +850,11 @@ do_dyncast (ptrdiff_t src2dst, ...@@ -843,13 +850,11 @@ do_dyncast (ptrdiff_t src2dst,
void const *base = obj_ptr; void const *base = obj_ptr;
sub_kind base_access = access_path; sub_kind base_access = access_path;
ptrdiff_t offset = base_list[i].offset (); ptrdiff_t offset = base_list[i].offset ();
bool is_virtual = base_list[i].is_virtual_p ();
if (base_list[i].is_virtual_p ()) if (is_virtual)
{ base_access = sub_kind (base_access | contained_virtual_mask);
base_access = sub_kind (base_access | contained_virtual_mask); base = convert_to_base (base, is_virtual, offset);
offset = get_vbase_offset (base, offset);
}
base = adjust_pointer <void> (base, offset);
if (!base_list[i].is_public_p ()) if (!base_list[i].is_public_p ())
base_access = sub_kind (base_access & ~contained_public_mask); base_access = sub_kind (base_access & ~contained_public_mask);
...@@ -1032,6 +1037,7 @@ do_upcast (sub_kind access_path, ...@@ -1032,6 +1037,7 @@ do_upcast (sub_kind access_path,
const void *base = obj_ptr; const void *base = obj_ptr;
sub_kind sub_access = access_path; sub_kind sub_access = access_path;
ptrdiff_t offset = base_list[i].offset (); ptrdiff_t offset = base_list[i].offset ();
bool is_virtual = base_list[i].is_virtual_p ();
if (!base_list[i].is_public_p ()) if (!base_list[i].is_public_p ())
{ {
...@@ -1040,22 +1046,16 @@ do_upcast (sub_kind access_path, ...@@ -1040,22 +1046,16 @@ do_upcast (sub_kind access_path,
continue; continue;
sub_access = sub_kind (sub_access & ~contained_public_mask); sub_access = sub_kind (sub_access & ~contained_public_mask);
} }
if (base_list[i].is_virtual_p ()) if (is_virtual)
{ sub_access = sub_kind (sub_access | contained_virtual_mask);
sub_access = sub_kind (sub_access | contained_virtual_mask);
if (base)
offset = get_vbase_offset (base, offset);
}
if (base) if (base)
base = adjust_pointer <void> (base, offset); base = convert_to_base (base, is_virtual, offset);
if (base_list[i].base->do_upcast (sub_access, dst, base, result2)) if (base_list[i].base->do_upcast (sub_access, dst, base, result2))
return true; // must fail return true; // must fail
if (result2.base_type) if (result2.base_type)
{ {
if (result2.base_type == nonvirtual_base_type if (result2.base_type == nonvirtual_base_type && is_virtual)
&& base_list[i].is_virtual_p ())
result2.base_type = base_list[i].base; result2.base_type = base_list[i].base;
if (!result.base_type) if (!result.base_type)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment