diff options
-rw-r--r-- | libcxx/include/__config | 4 | ||||
-rw-r--r-- | libcxx/include/__locale | 2 | ||||
-rw-r--r-- | libcxx/include/locale | 2 | ||||
-rw-r--r-- | libcxx/src/locale.cpp | 36 |
4 files changed, 44 insertions, 0 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config index b1385100e6c..239f0a22ce4 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -285,4 +285,8 @@ template <unsigned> struct __static_assert_check {}; #define __has_feature(__x) 0 #endif +#ifdef __APPLE__ +#define _LIBCPP_STABLE_APPLE_ABI +#endif + #endif // _LIBCPP_CONFIG diff --git a/libcxx/include/__locale b/libcxx/include/__locale index 521da04926c..3f669d61042 100644 --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -541,8 +541,10 @@ public: #endif _LIBCPP_ALWAYS_INLINE const mask* table() const _NOEXCEPT {return __tab_;} static const mask* classic_table() _NOEXCEPT; +#ifndef _LIBCPP_STABLE_APPLE_ABI static const int* __classic_upper_table() _NOEXCEPT; static const int* __classic_lower_table() _NOEXCEPT; +#endif protected: ~ctype(); diff --git a/libcxx/include/locale b/libcxx/include/locale index 4a65eb6bec8..778d6c6f902 100644 --- a/libcxx/include/locale +++ b/libcxx/include/locale @@ -192,8 +192,10 @@ template <class charT> class messages_byname; _LIBCPP_BEGIN_NAMESPACE_STD +#ifndef _LIBCPP_STABLE_APPLE_ABI // Get the C locale object locale_t __cloc(); +#endif // OSX has nice foo_l() functions that let you turn off use of the global // locale. Linux, not so much. The following functions avoid the locale when diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index eafd7639c67..63f54294a46 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -116,6 +116,7 @@ namespace with_locale { namespace { _LIBCPP_BEGIN_NAMESPACE_STD +#ifndef _LIBCPP_APPLE_STABLE_ABI locale_t __cloc() { // In theory this could create a race condition. In practice // the race condition is non-fatal since it will just create @@ -127,6 +128,7 @@ locale_t __cloc() { return result; #endif } +#endif // _LIBCPP_APPLE_STABLE_ABI namespace { @@ -812,30 +814,46 @@ ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) wchar_t ctype<wchar_t>::do_toupper(char_type c) const { +#ifndef _LIBCPP_STABLE_APPLE_ABI return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; +#else + return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; +#endif } const wchar_t* ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) +#ifndef _LIBCPP_STABLE_APPLE_ABI *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] : *low; +#else + *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; +#endif return low; } wchar_t ctype<wchar_t>::do_tolower(char_type c) const { +#ifndef _LIBCPP_STABLE_APPLE_ABI return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; +#else + return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; +#endif } const wchar_t* ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) +#ifndef _LIBCPP_STABLE_APPLE_ABI *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] : *low; +#else + *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; +#endif return low; } @@ -894,28 +912,44 @@ ctype<char>::~ctype() char ctype<char>::do_toupper(char_type c) const { +#ifndef _LIBCPP_STABLE_APPLE_ABI return isascii(c) ? __classic_upper_table()[c] : c; +#else + return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; +#endif } const char* ctype<char>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) +#ifndef _LIBCPP_STABLE_APPLE_ABI *low = isascii(*low) ? __classic_upper_table()[*low] : *low; +#else + *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[c] : c; +#endif return low; } char ctype<char>::do_tolower(char_type c) const { +#ifndef _LIBCPP_STABLE_APPLE_ABI return isascii(c) ? __classic_lower_table()[c] : c; +#else + return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; +#endif } const char* ctype<char>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) +#ifndef _LIBCPP_STABLE_APPLE_ABI *low = isascii(*low) ? __classic_lower_table()[*low] : *low; +#else + *low = isascii(*low) ? _DefaultRuneLocale.__maplower[c] : c; +#endif return low; } @@ -965,6 +999,7 @@ ctype<char>::classic_table() _NOEXCEPT #endif } +#ifndef _LIBCPP_APPLE_STABLE_ABI const int* ctype<char>::__classic_lower_table() _NOEXCEPT { @@ -988,6 +1023,7 @@ ctype<char>::__classic_upper_table() _NOEXCEPT return NULL; #endif } +#endif // _LIBCPP_APPLE_STABLE_ABI // template <> class ctype_byname<char> |