[libcxxabi] r208246 - Make libc++abi use the implementation of __numstr from libc++. No functionality change, just removal of duplicated code.
Marshall Clow
mclow.lists at gmail.com
Wed May 7 13:17:41 PDT 2014
Author: marshall
Date: Wed May 7 15:17:41 2014
New Revision: 208246
URL: http://llvm.org/viewvc/llvm-project?rev=208246&view=rev
Log:
Make libc++abi use the implementation of __numstr from libc++. No functionality change, just removal of duplicated code.
Modified:
libcxxabi/trunk/src/stdexcept.cpp
Modified: libcxxabi/trunk/src/stdexcept.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/stdexcept.cpp?rev=208246&r1=208245&r2=208246&view=diff
==============================================================================
--- libcxxabi/trunk/src/stdexcept.cpp (original)
+++ libcxxabi/trunk/src/stdexcept.cpp Wed May 7 15:17:41 2014
@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
+#include "__refstring"
#include "stdexcept"
#include "new"
#include <cstdlib>
@@ -14,147 +15,25 @@
#include <cstdint>
#include <cstddef>
-#if __APPLE__
-#include <dlfcn.h>
-#include <mach-o/dyld.h>
-#endif
-
-// Note: optimize for size
-
-#pragma GCC visibility push(hidden)
-
-namespace
-{
-
-class __libcpp_nmstr
-{
-private:
- const char* str_;
-
- typedef int count_t;
-
- struct _Rep_base
- {
- std::size_t len;
- std::size_t cap;
- count_t count;
- };
-
- static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(sizeof(_Rep_base));
-
- count_t& count() const _NOEXCEPT {return ((_Rep_base*)(str_ - offset))->count;}
-
-#if __APPLE__
- static
- const void*
- compute_gcc_empty_string_storage() _NOEXCEPT
- {
- void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
- if (handle == 0)
- return 0;
- return (const char*)dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE") + offset;
- }
-
- static
- const void*
- get_gcc_empty_string_storage() _NOEXCEPT
- {
- static const void* p = compute_gcc_empty_string_storage();
- return p;
- }
-#endif
-
-public:
- explicit __libcpp_nmstr(const char* msg);
- __libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT;
- __libcpp_nmstr& operator=(const __libcpp_nmstr& s) _NOEXCEPT;
- ~__libcpp_nmstr();
- const char* c_str() const _NOEXCEPT {return str_;}
-};
-
-__libcpp_nmstr::__libcpp_nmstr(const char* msg)
-{
- std::size_t len = strlen(msg);
- str_ = static_cast<const char*>(::operator new(len + 1 + offset));
- _Rep_base* c = (_Rep_base*)str_;
- c->len = c->cap = len;
- str_ += offset;
- count() = 0;
- std::memcpy(const_cast<char*>(c_str()), msg, len + 1);
-}
-
-inline
-__libcpp_nmstr::__libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT
- : str_(s.str_)
-{
-#if __APPLE__
- if (str_ != get_gcc_empty_string_storage())
-#endif
- __sync_add_and_fetch(&count(), 1);
-}
-
-__libcpp_nmstr&
-__libcpp_nmstr::operator=(const __libcpp_nmstr& s) _NOEXCEPT
-{
- const char* p = str_;
- str_ = s.str_;
-#if __APPLE__
- if (str_ != get_gcc_empty_string_storage())
-#endif
- __sync_add_and_fetch(&count(), 1);
-#if __APPLE__
- if (p != get_gcc_empty_string_storage())
-#endif
- if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), count_t(-1)) < 0)
- {
- ::operator delete(const_cast<char*>(p-offset));
- }
- return *this;
-}
-
-inline
-__libcpp_nmstr::~__libcpp_nmstr()
-{
-#if __APPLE__
- if (str_ != get_gcc_empty_string_storage())
-#endif
- if (__sync_add_and_fetch(&count(), count_t(-1)) < 0)
- {
- ::operator delete(const_cast<char*>(str_ - offset));
- }
-}
-
-}
-
-#pragma GCC visibility pop
+static_assert(sizeof(std::__libcpp_refstring) == sizeof(const char *), "");
namespace std // purposefully not using versioning namespace
{
-logic_error::~logic_error() _NOEXCEPT
-{
- __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
- s.~__libcpp_nmstr();
-}
+logic_error::~logic_error() _NOEXCEPT {}
const char*
logic_error::what() const _NOEXCEPT
{
- __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
- return s.c_str();
+ return __imp_.c_str();
}
-runtime_error::~runtime_error() _NOEXCEPT
-{
- __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
- s.~__libcpp_nmstr();
-}
+runtime_error::~runtime_error() _NOEXCEPT {}
const char*
runtime_error::what() const _NOEXCEPT
{
- __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
- return s.c_str();
+ return __imp_.c_str();
}
domain_error::~domain_error() _NOEXCEPT {}
More information about the cfe-commits
mailing list