Merge to upstream r222492.

Change-Id: I6a0a6e90d217a69531ec3bb5ca0a367f39f4a1da
This commit is contained in:
Dan Albert
2014-11-20 15:55:17 -08:00
parent 54e693ac44
commit 7112dae6ac
584 changed files with 21668 additions and 1424 deletions

View File

@@ -7,8 +7,7 @@
//
//===----------------------------------------------------------------------===//
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
#include "__config"
#include "ios"
#include "streambuf"
#include "istream"
@@ -54,11 +53,9 @@ string
__iostream_category::message(int ev) const
{
if (ev != static_cast<int>(io_errc::stream)
#ifdef ELAST
&& ev <= ELAST
#elif defined(__linux__)
&& ev <= 4095
#endif // ELAST
#ifdef _LIBCPP_ELAST
&& ev <= _LIBCPP_ELAST
#endif // _LIBCPP_ELAST
)
return __do_message::message(ev);
return string("unspecified iostream_category error");
@@ -151,12 +148,22 @@ ios_base::getloc() const
}
// 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()
{
@@ -169,14 +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;
size_t newsize = newcap * sizeof(long);
long* iarray = static_cast<long*>(realloc(__iarray_, newsize));
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);
@@ -185,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];
@@ -198,14 +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;
size_t newsize = newcap * sizeof(void*);
void** parray = static_cast<void**>(realloc(__parray_, newsize));
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);
@@ -214,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];
@@ -229,22 +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;
size_t newesize = newcap * sizeof(event_callback);
event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newesize));
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;
size_t newisize = newcap * sizeof(int);
int* indxs = static_cast<int *>(realloc(__index_, newisize));
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;