jsarrayinlines.h
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef jsarrayinlines_h___
#define jsarrayinlines_h___
#include "jsinferinlines.h"
#include "jsobjinlines.h"
inline void
JSObject::markDenseArrayNotPacked(JSContext *cx)
{
JS_ASSERT(isDenseArray());
MarkTypeObjectFlags(cx, this, js::types::OBJECT_FLAG_NON_PACKED_ARRAY);
}
inline void
JSObject::ensureDenseArrayInitializedLength(JSContext *cx, uint32_t index, uint32_t extra)
{
/*
* Ensure that the array's contents have been initialized up to index, and
* mark the elements through 'index + extra' as initialized in preparation
* for a write.
*/
JS_ASSERT(index + extra <= getDenseArrayCapacity());
uint32_t &initlen = getElementsHeader()->initializedLength;
if (initlen < index)
markDenseArrayNotPacked(cx);
if (initlen < index + extra) {
JSCompartment *comp = compartment();
size_t offset = initlen;
for (js::HeapSlot *sp = elements + initlen;
sp != elements + (index + extra);
sp++, offset++)
sp->init(comp, this, offset, js::MagicValue(JS_ARRAY_HOLE));
initlen = index + extra;
}
}
inline JSObject::EnsureDenseResult
JSObject::ensureDenseArrayElements(JSContext *cx, unsigned index, unsigned extra)
{
JS_ASSERT(isDenseArray());
unsigned currentCapacity = getDenseArrayCapacity();
unsigned requiredCapacity;
if (extra == 1) {
/* Optimize for the common case. */
if (index < currentCapacity) {
ensureDenseArrayInitializedLength(cx, index, 1);
return ED_OK;
}
requiredCapacity = index + 1;
if (requiredCapacity == 0) {
/* Overflow. */
return ED_SPARSE;
}
} else {
requiredCapacity = index + extra;
if (requiredCapacity < index) {
/* Overflow. */
return ED_SPARSE;
}
if (requiredCapacity <= currentCapacity) {
ensureDenseArrayInitializedLength(cx, index, extra);
return ED_OK;
}
}
/*
* We use the extra argument also as a hint about number of non-hole
* elements to be inserted.
*/
if (requiredCapacity > MIN_SPARSE_INDEX &&
willBeSparseDenseArray(requiredCapacity, extra)) {
return ED_SPARSE;
}
if (!growElements(cx, requiredCapacity))
return ED_FAILED;
ensureDenseArrayInitializedLength(cx, index, extra);
return ED_OK;
}
#endif /* jsarrayinlines_h___ */