Avoid unnecessary initialization of js::Vector

This commit is contained in:
Luke Wagner 2010-06-11 14:18:45 -07:00
parent 1da69179fa
commit db5e1acb26
4 changed files with 28 additions and 7 deletions

View File

@ -48,7 +48,6 @@
#include <stdlib.h>
#include <string.h>
#define __STDC_LIMIT_MACROS
#include "jsstdint.h"
#include "jstypes.h"

View File

@ -877,7 +877,7 @@ js_NumberValueToCharBuffer(JSContext *cx, const Value &v, JSCharBuffer &cb)
size_t cstrlen = strlen(cstr);
JS_ASSERT(cstrlen < arrSize);
size_t sizeBefore = cb.length();
if (!cb.growBy(cstrlen))
if (!cb.growByUninitialized(cstrlen))
return JS_FALSE;
jschar *appendBegin = cb.begin() + sizeBefore;
#ifdef DEBUG

View File

@ -1901,7 +1901,7 @@ ReplaceCallback(JSContext *cx, size_t count, void *p)
return false;
size_t growth = leftlen + replen;
if (!rdata.cb.growBy(growth))
if (!rdata.cb.growByUninitialized(growth))
return false;
jschar *chars = rdata.cb.begin() + rdata.index;

View File

@ -190,6 +190,8 @@ class Vector : AllocPolicy
bool growHeapStorageBy(size_t lengthInc);
bool convertToHeapStorage(size_t lengthInc);
template <bool InitNewElems> inline bool growByImpl(size_t inc);
/* magic constants */
static const int sMaxInlineBytes = 1024;
@ -371,6 +373,9 @@ class Vector : AllocPolicy
/* Call shrinkBy or growBy based on whether newSize > length(). */
bool resize(size_t newLength);
/* Leave new elements as uninitialized memory. */
bool growByUninitialized(size_t incr);
void clear();
bool append(const T &t);
@ -546,15 +551,17 @@ Vector<T,N,AP>::shrinkBy(size_t incr)
}
template <class T, size_t N, class AP>
inline bool
Vector<T,N,AP>::growBy(size_t incr)
template <bool InitNewElems>
JS_ALWAYS_INLINE bool
Vector<T,N,AP>::growByImpl(size_t incr)
{
ReentrancyGuard g(*this);
if (usingInlineStorage()) {
size_t freespace = sInlineCapacity - inlineLength();
if (incr <= freespace) {
T *newend = inlineEnd() + incr;
Impl::initialize(inlineEnd(), newend);
if (InitNewElems)
Impl::initialize(inlineEnd(), newend);
inlineLength() += incr;
JS_ASSERT(usingInlineStorage());
return true;
@ -574,11 +581,26 @@ Vector<T,N,AP>::growBy(size_t incr)
/* We are !usingInlineStorage(). Initialize new elements. */
JS_ASSERT(heapCapacity() - heapLength() >= incr);
T *newend = heapEnd() + incr;
Impl::initialize(heapEnd(), newend);
if (InitNewElems)
Impl::initialize(heapEnd(), newend);
heapEnd() = newend;
return true;
}
template <class T, size_t N, class AP>
inline bool
Vector<T,N,AP>::growBy(size_t incr)
{
return growByImpl<true>(incr);
}
template <class T, size_t N, class AP>
inline bool
Vector<T,N,AP>::growByUninitialized(size_t incr)
{
return growByImpl<false>(incr);
}
template <class T, size_t N, class AP>
inline bool
Vector<T,N,AP>::resize(size_t newLength)