svn commit: r256642 - head/contrib/libcxxrt

Dimitry Andric dim at FreeBSD.org
Wed Oct 16 17:00:22 UTC 2013


Author: dim
Date: Wed Oct 16 17:00:21 2013
New Revision: 256642
URL: http://svnweb.freebsd.org/changeset/base/256642

Log:
  Since C++ typeinfo objects are currently not guaranteed to be merged at
  runtime by the dynamic linker, check for their equality in libcxxrt by
  not only comparing the typeinfo's name pointers, but also comparing the
  full names, if necessary.  (This is similar to what GNU libstdc++ does
  in its default configuration.)  The 'deep' check can be turned off again
  by defining LIBCXXRT_MERGED_TYPEINFO, and recompiling libcxxrt.
  
  Reviewed by:	theraven
  MFC after:	3 days

Modified:
  head/contrib/libcxxrt/typeinfo.cc

Modified: head/contrib/libcxxrt/typeinfo.cc
==============================================================================
--- head/contrib/libcxxrt/typeinfo.cc	Wed Oct 16 16:53:00 2013	(r256641)
+++ head/contrib/libcxxrt/typeinfo.cc	Wed Oct 16 17:00:21 2013	(r256642)
@@ -35,15 +35,23 @@ type_info::~type_info() {}
 
 bool type_info::operator==(const type_info &other) const
 {
+#ifdef LIBCXXRT_MERGED_TYPEINFO	
 	return __type_name == other.__type_name;
+#else
+	return __type_name == other.__type_name || strcmp(__type_name, other.__type_name) == 0;
+#endif
 }
 bool type_info::operator!=(const type_info &other) const
 {
-	return __type_name != other.__type_name;
+	return !operator==(other);
 }
 bool type_info::before(const type_info &other) const
 {
+#ifdef LIBCXXRT_MERGED_TYPEINFO
 	return __type_name < other.__type_name;
+#else
+	return strcmp(__type_name, other.__type_name) < 0;
+#endif
 }
 const char* type_info::name() const
 {


More information about the svn-src-all mailing list