diff options
author | dim <dim@FreeBSD.org> | 2015-01-15 21:17:36 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-01-15 21:17:36 +0000 |
commit | 80c1930a959a4c0b7f5897afc73176ffcadc4887 (patch) | |
tree | c7ef11e9501df78a928c64bb92aa05baf56f5808 /contrib/libc++/src/ios.cpp | |
parent | 6449dfa4f9e574a7e65a543b10119ab730a8404d (diff) | |
parent | 083c980732b44eb899ce399cf182dec9b90b9a1d (diff) | |
download | FreeBSD-src-80c1930a959a4c0b7f5897afc73176ffcadc4887.zip FreeBSD-src-80c1930a959a4c0b7f5897afc73176ffcadc4887.tar.gz |
Import libc++ trunk r224926. This fixes a number of bugs, completes
C++14 support[1], adds more C++1z features[2], and fixes the following
LWG issues[3]:
1450: Contradiction in regex_constants
2003: String exception inconsistency in erase.
2075: Progress guarantees, lock-free property, and scheduling
assumptions
2104: unique_lock move-assignment should not be noexcept
2112: User-defined classes that cannot be derived from
2132: std::function ambiguity
2135: Unclear requirement for exceptions thrown in
condition_variable::wait()
2142: packaged_task::operator() synchronization too broad?
2182: Container::[const_]reference types are misleadingly specified
2186: Incomplete action on async/launch::deferred
2188: Reverse iterator does not fully support targets that overload
operator&
2193: Default constructors for standard library containers are explicit
2205: Problematic postconditions of regex_match and regex_search
2213: Return value of std::regex_replace
2240: Probable misuse of term "function scope" in [thread.condition]
2252: Strong guarantee on vector::push_back() still broken with C++11?
2257: Simplify container requirements with the new algorithms
2258: a.erase(q1, q2) unable to directly return q2
2263: Comparing iterators and allocator pointers with different
const-character
2268: Setting a default argument in the declaration of a member
function assign of std::basic_string
2271: regex_traits::lookup_classname specification unclear
2272: quoted should use char_traits::eq for character comparison
2278: User-defined literals for Standard Library types
2280: begin / end for arrays should be constexpr and noexcept
2285: make_reverse_iterator
2288: Inconsistent requirements for shared mutexes
2291: std::hash is vulnerable to collision DoS attack
2293: Wrong facet used by num_put::do_put
2299: Effects of inaccessible key_compare::is_transparent type are not
clear
2301: Why is std::tie not constexpr?
2304: Complexity of count in unordered associative containers
2306: match_results::reference should be value_type&, not const
value_type&
2308: Clarify container destructor requirements w.r.t. std::array
2313: tuple_size should always derive from integral_constant<size_t, N>
2314: apply() should return decltype(auto) and use decay_t before
tuple_size
2315: weak_ptr should be movable
2316: weak_ptr::lock() should be atomic
2317: The type property queries should be UnaryTypeTraits returning
size_t
2320: select_on_container_copy_construction() takes allocators, not
containers
2322: Associative(initializer_list, stuff) constructors are
underspecified
2323: vector::resize(n, t)'s specification should be simplified
2324: Insert iterator constructors should use addressof()
2329: regex_match()/regex_search() with match_results should forbid
temporary strings
2330: regex("meow", regex::icase) is technically forbidden but should
be permitted
2332: regex_iterator/regex_token_iterator should forbid temporary
regexes
2339: Wording issue in nth_element
2341: Inconsistency between basic_ostream::seekp(pos) and
basic_ostream::seekp(off, dir)
2344: quoted()'s interaction with padding is unclear
2346: integral_constant's member functions should be marked noexcept
2350: min, max, and minmax should be constexpr
2356: Stability of erasure in unordered associative containers
2357: Remaining "Assignable" requirement
2359: How does regex_constants::nosubs affect basic_regex::mark_count()?
2360: reverse_iterator::operator*() is unimplementable
[1] http://libcxx.llvm.org/cxx1y_status.html
[2] http://libcxx.llvm.org/cxx1z_status.html
[3] http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html
Exp-run: antoine
MFC after: 1 month
Diffstat (limited to 'contrib/libc++/src/ios.cpp')
-rw-r--r-- | contrib/libc++/src/ios.cpp | 88 |
1 files changed, 45 insertions, 43 deletions
diff --git a/contrib/libc++/src/ios.cpp b/contrib/libc++/src/ios.cpp index bbe3c07..d879beb 100644 --- a/contrib/libc++/src/ios.cpp +++ b/contrib/libc++/src/ios.cpp @@ -7,8 +7,7 @@ // //===----------------------------------------------------------------------===// -#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__; - +#include "__config" #include "ios" #include "streambuf" #include "istream" @@ -54,9 +53,9 @@ string __iostream_category::message(int ev) const { if (ev != static_cast<int>(io_errc::stream) -#ifdef ELAST - && ev <= ELAST -#endif +#ifdef _LIBCPP_ELAST + && ev <= _LIBCPP_ELAST +#endif // _LIBCPP_ELAST ) return __do_message::message(ev); return string("unspecified iostream_category error"); @@ -134,7 +133,7 @@ locale ios_base::imbue(const locale& newloc) { static_assert(sizeof(locale) == sizeof(__loc_), ""); - locale& loc_storage = *(locale*)&__loc_; + locale& loc_storage = *reinterpret_cast<locale*>(&__loc_); locale oldloc = loc_storage; loc_storage = newloc; __call_callbacks(imbue_event); @@ -144,17 +143,27 @@ ios_base::imbue(const locale& newloc) locale ios_base::getloc() const { - const locale& loc_storage = *(locale*)&__loc_; + const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_); return loc_storage; } // xalloc -#if __has_feature(cxx_atomic) +#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS) atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0); #else int ios_base::__xindex_ = 0; #endif +template <typename _Tp> +static size_t __ios_new_cap(size_t __req_size, size_t __current_cap) +{ // Precondition: __req_size > __current_cap + const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp); + if (__req_size < mx/2) + return _VSTD::max(2 * __current_cap, __req_size); + else + return mx; +} + int ios_base::xalloc() { @@ -167,13 +176,8 @@ ios_base::iword(int index) size_t req_size = static_cast<size_t>(index)+1; if (req_size > __iarray_cap_) { - size_t newcap; - const size_t mx = std::numeric_limits<size_t>::max(); - if (req_size < mx/2) - newcap = _VSTD::max(2 * __iarray_cap_, req_size); - else - newcap = mx; - long* iarray = (long*)realloc(__iarray_, newcap * sizeof(long)); + size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_); + long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long))); if (iarray == 0) { setstate(badbit); @@ -182,8 +186,9 @@ ios_base::iword(int index) return error; } __iarray_ = iarray; - for (long* p = __iarray_ + __iarray_size_; __iarray_cap_ < newcap; ++__iarray_cap_, ++p) + for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p) *p = 0; + __iarray_cap_ = newcap; } __iarray_size_ = max<size_t>(__iarray_size_, req_size); return __iarray_[index]; @@ -195,13 +200,8 @@ ios_base::pword(int index) size_t req_size = static_cast<size_t>(index)+1; if (req_size > __parray_cap_) { - size_t newcap; - const size_t mx = std::numeric_limits<size_t>::max(); - if (req_size < mx/2) - newcap = _VSTD::max(2 * __parray_cap_, req_size); - else - newcap = mx; - void** parray = (void**)realloc(__parray_, newcap * sizeof(void*)); + size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_); + void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *))); if (parray == 0) { setstate(badbit); @@ -210,8 +210,9 @@ ios_base::pword(int index) return error; } __parray_ = parray; - for (void** p = __parray_ + __parray_size_; __parray_cap_ < newcap; ++__parray_cap_, ++p) + for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p) *p = 0; + __parray_cap_ = newcap; } __parray_size_ = max<size_t>(__parray_size_, req_size); return __parray_[index]; @@ -225,20 +226,16 @@ ios_base::register_callback(event_callback fn, int index) size_t req_size = __event_size_ + 1; if (req_size > __event_cap_) { - size_t newcap; - const size_t mx = std::numeric_limits<size_t>::max(); - if (req_size < mx/2) - newcap = _VSTD::max(2 * __event_cap_, req_size); - else - newcap = mx; - event_callback* fns = (event_callback*)realloc(__fn_, newcap * sizeof(event_callback)); + size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_); + event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback))); if (fns == 0) setstate(badbit); __fn_ = fns; - int* indxs = (int*)realloc(__index_, newcap * sizeof(int)); + int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int))); if (indxs == 0) setstate(badbit); __index_ = indxs; + __event_cap_ = newcap; } __fn_[__event_size_] = fn; __index_[__event_size_] = index; @@ -248,7 +245,7 @@ ios_base::register_callback(event_callback fn, int index) ios_base::~ios_base() { __call_callbacks(erase_event); - locale& loc_storage = *(locale*)&__loc_; + locale& loc_storage = *reinterpret_cast<locale*>(&__loc_); loc_storage.~locale(); free(__fn_); free(__index_); @@ -299,19 +296,22 @@ void ios_base::copyfmt(const ios_base& rhs) { // If we can't acquire the needed resources, throw bad_alloc (can't set badbit) - // Don't alter *this until all needed resources are aquired + // Don't alter *this until all needed resources are acquired unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free); unique_ptr<int, void (*)(void*)> new_ints(0, free); unique_ptr<long, void (*)(void*)> new_longs(0, free); unique_ptr<void*, void (*)(void*)> new_pointers(0, free); if (__event_cap_ < rhs.__event_size_) { - new_callbacks.reset((event_callback*)malloc(sizeof(event_callback) * rhs.__event_size_)); + size_t newesize = sizeof(event_callback) * rhs.__event_size_; + new_callbacks.reset(static_cast<event_callback*>(malloc(newesize))); #ifndef _LIBCPP_NO_EXCEPTIONS if (!new_callbacks) throw bad_alloc(); #endif // _LIBCPP_NO_EXCEPTIONS - new_ints.reset((int*)malloc(sizeof(int) * rhs.__event_size_)); + + size_t newisize = sizeof(int) * rhs.__event_size_; + new_ints.reset(static_cast<int *>(malloc(newisize))); #ifndef _LIBCPP_NO_EXCEPTIONS if (!new_ints) throw bad_alloc(); @@ -319,7 +319,8 @@ ios_base::copyfmt(const ios_base& rhs) } if (__iarray_cap_ < rhs.__iarray_size_) { - new_longs.reset((long*)malloc(sizeof(long) * rhs.__iarray_size_)); + size_t newsize = sizeof(long) * rhs.__iarray_size_; + new_longs.reset(static_cast<long*>(malloc(newsize))); #ifndef _LIBCPP_NO_EXCEPTIONS if (!new_longs) throw bad_alloc(); @@ -327,7 +328,8 @@ ios_base::copyfmt(const ios_base& rhs) } if (__parray_cap_ < rhs.__parray_size_) { - new_pointers.reset((void**)malloc(sizeof(void*) * rhs.__parray_size_)); + size_t newsize = sizeof(void*) * rhs.__parray_size_; + new_pointers.reset(static_cast<void**>(malloc(newsize))); #ifndef _LIBCPP_NO_EXCEPTIONS if (!new_pointers) throw bad_alloc(); @@ -337,8 +339,8 @@ ios_base::copyfmt(const ios_base& rhs) __fmtflags_ = rhs.__fmtflags_; __precision_ = rhs.__precision_; __width_ = rhs.__width_; - locale& lhs_loc = *(locale*)&__loc_; - locale& rhs_loc = *(locale*)&rhs.__loc_; + locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_); + const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_); lhs_loc = rhs_loc; if (__event_cap_ < rhs.__event_size_) { @@ -381,7 +383,7 @@ ios_base::move(ios_base& rhs) __rdstate_ = rhs.__rdstate_; __exceptions_ = rhs.__exceptions_; __rdbuf_ = 0; - locale& rhs_loc = *(locale*)&rhs.__loc_; + locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_); ::new(&__loc_) locale(rhs_loc); __fn_ = rhs.__fn_; rhs.__fn_ = 0; @@ -413,8 +415,8 @@ ios_base::swap(ios_base& rhs) _NOEXCEPT _VSTD::swap(__width_, rhs.__width_); _VSTD::swap(__rdstate_, rhs.__rdstate_); _VSTD::swap(__exceptions_, rhs.__exceptions_); - locale& lhs_loc = *(locale*)&__loc_; - locale& rhs_loc = *(locale*)&rhs.__loc_; + locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_); + locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_); _VSTD::swap(lhs_loc, rhs_loc); _VSTD::swap(__fn_, rhs.__fn_); _VSTD::swap(__index_, rhs.__index_); |