2003-10-10 Paolo Carlini <pcarlini@unitus.it>

* include/bits/ostream.tcc (operator<<(basic_ostream&, _CharT))
	Avoid unnecessarily calling __builtin_alloca and dealing
	explicitly with width() smaller than zero.
	(operator<<(basic_ostream&, char), operator<<(basic_ostream&,
	const _CharT*), operator<<(basic_ostream<_CharT, _Traits>&,
	const char*), operator<<(basic_ostream<char, _Traits>&,
	const char*), operator<<(basic_ostream, const basic_string&)):
	Likewise.

From-SVN: r72302
This commit is contained in:
Paolo Carlini 2003-10-10 19:10:47 +02:00 committed by Paolo Carlini
parent fc45d35133
commit 6b61bca48f
2 changed files with 44 additions and 30 deletions

View File

@ -1,3 +1,14 @@
2003-10-10 Paolo Carlini <pcarlini@unitus.it>
* include/bits/ostream.tcc (operator<<(basic_ostream&, _CharT))
Avoid unnecessarily calling __builtin_alloca and dealing
explicitly with width() smaller than zero.
(operator<<(basic_ostream&, char), operator<<(basic_ostream&,
const _CharT*), operator<<(basic_ostream<_CharT, _Traits>&,
const char*), operator<<(basic_ostream<char, _Traits>&,
const char*), operator<<(basic_ostream, const basic_string&)):
Likewise.
2003-10-09 Benjamin Kosnik <bkoz@redhat.com>
* config/linker-map.gnu: Make more *_type_info bits visible.

View File

@ -471,17 +471,18 @@ namespace std
{
try
{
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
_CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__w + 1)));
__pads[0] = __c;
const streamsize __w = __out.width();
streamsize __len = 1;
_CharT* __cs = &__c;
if (__w > __len)
{
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
__cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
&__c, __w, __len, false);
__len = __w;
}
__out._M_write(__pads, __len);
__out._M_write(__cs, __len);
__out.width(0);
}
catch(...)
@ -507,17 +508,17 @@ namespace std
{
try
{
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
char* __pads = static_cast<char*>(__builtin_alloca(__w + 1));
__pads[0] = __c;
const streamsize __w = __out.width();
streamsize __len = 1;
char* __cs = &__c;
if (__w > __len)
{
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __pads,
__cs = static_cast<char*>(__builtin_alloca(__w));
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __cs,
&__c, __w, __len, false);
__len = __w;
}
__out._M_write(__pads, __len);
__out._M_write(__cs, __len);
__out.width(0);
}
catch(...)
@ -542,14 +543,15 @@ namespace std
{
try
{
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
_CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w));
const streamsize __w = __out.width();
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
__s, __w, __len, false);
__s = __pads;
__s = __cs;
__len = __w;
}
__out._M_write(__s, __len);
@ -583,22 +585,23 @@ namespace std
if (__cerb && __s)
{
size_t __clen = __traits_type::length(__s);
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * (__clen + 1)));
_CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __clen));
for (size_t __i = 0; __i < __clen; ++__i)
__ws[__i] = __out.widen(__s[__i]);
_CharT* __str = __ws;
try
{
const streamsize __w = __out.width();
streamsize __len = static_cast<streamsize>(__clen);
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
_CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w));
if (__w > __len)
{
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads,
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
__ws, __w, __len, false);
__str = __pads;
__str = __cs;
__len = __w;
}
__out._M_write(__str, __len);
@ -629,15 +632,14 @@ namespace std
{
try
{
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
char* __pads = static_cast<char*>(__builtin_alloca(__w));
const streamsize __w = __out.width();
streamsize __len = static_cast<streamsize>(_Traits::length(__s));
if (__w > __len)
{
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __pads,
char* __cs = static_cast<char*>(__builtin_alloca(__w));
__pad<char, _Traits>::_S_pad(__out, __out.fill(), __cs,
__s, __w, __len, false);
__s = __pads;
__s = __cs;
__len = __w;
}
__out._M_write(__s, __len);
@ -667,18 +669,19 @@ namespace std
typename __ostream_type::sentry __cerb(__out);
if (__cerb)
{
const _CharT* __s = __str.data();
const streamsize __w = __out.width() > 0 ? __out.width() : 0;
_CharT* __pads = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __w));
const streamsize __w = __out.width();
streamsize __len = static_cast<streamsize>(__str.size());
const _CharT* __s = __str.data();
#ifdef _GLIBCXX_RESOLVE_LIB_DEFECTS
// 25. String operator<< uses width() value wrong
#endif
if (__w > __len)
{
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __pads, __s,
_CharT* __cs = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
* __w));
__pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs, __s,
__w, __len, false);
__s = __pads;
__s = __cs;
__len = __w;
}
__out._M_write(__s, __len);