summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/runtime/JSArray.h
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-08-11 14:44:44 +0100
committerBen Murdoch <benm@google.com>2010-08-12 19:15:41 +0100
commitdd8bb3de4f353a81954234999f1fea748aee2ea9 (patch)
tree729b52bf09294f0d6c67cd5ea80aee1b727b7bd8 /JavaScriptCore/runtime/JSArray.h
parentf3d41ba51d86bf719c7a65ab5297aea3c17e2d98 (diff)
downloadexternal_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.zip
external_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.tar.gz
external_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.tar.bz2
Merge WebKit at r65072 : Initial merge by git.
Change-Id: Ibcf418498376b2660aacb7f8d46ea7085ef91585
Diffstat (limited to 'JavaScriptCore/runtime/JSArray.h')
-rw-r--r--JavaScriptCore/runtime/JSArray.h30
1 files changed, 12 insertions, 18 deletions
diff --git a/JavaScriptCore/runtime/JSArray.h b/JavaScriptCore/runtime/JSArray.h
index a7ce328..f718d7e 100644
--- a/JavaScriptCore/runtime/JSArray.h
+++ b/JavaScriptCore/runtime/JSArray.h
@@ -39,6 +39,7 @@ namespace JSC {
unsigned m_numValuesInVector;
SparseArrayValueMap* m_sparseValueMap;
void* subclassData; // A JSArray subclass can use this to fill the vector lazily.
+ void* m_allocBase; // Pointer to base address returned by malloc(). Keeping this pointer does eliminate false positives from the leak detector.
size_t reportedMapCapacity;
#if CHECK_ARRAY_CONSISTENCY
bool m_inCompactInitialization;
@@ -61,6 +62,9 @@ namespace JSC {
friend class Walker;
public:
+ enum VPtrStealingHackType { VPtrStealingHack };
+ JSArray(VPtrStealingHackType);
+
explicit JSArray(NonNullPassRefPtr<Structure>);
JSArray(NonNullPassRefPtr<Structure>, unsigned initialLength, ArrayCreationMode);
JSArray(NonNullPassRefPtr<Structure>, const ArgList& initialValues);
@@ -73,7 +77,7 @@ namespace JSC {
static JS_EXPORTDATA const ClassInfo info;
- unsigned length() const { return arrayStorage()->m_length; }
+ unsigned length() const { return m_storage->m_length; }
void setLength(unsigned); // OK to use on new arrays, but not if it might be a RegExpMatchArray.
void sort(ExecState*);
@@ -86,11 +90,11 @@ namespace JSC {
void shiftCount(ExecState*, int count);
void unshiftCount(ExecState*, int count);
- bool canGetIndex(unsigned i) { return i < m_vectorLength && m_vector[i]; }
+ bool canGetIndex(unsigned i) { return i < m_vectorLength && m_storage->m_vector[i]; }
JSValue getIndex(unsigned i)
{
ASSERT(canGetIndex(i));
- return m_vector[i];
+ return m_storage->m_vector[i];
}
bool canSetIndex(unsigned i) { return i < m_vectorLength; }
@@ -98,9 +102,9 @@ namespace JSC {
{
ASSERT(canSetIndex(i));
- JSValue& x = m_vector[i];
+ JSValue& x = m_storage->m_vector[i];
if (!x) {
- ArrayStorage *storage = arrayStorage();
+ ArrayStorage *storage = m_storage;
++storage->m_numValuesInVector;
if (i >= storage->m_length)
storage->m_length = i + 1;
@@ -111,7 +115,7 @@ namespace JSC {
void uncheckedSetIndex(unsigned i, JSValue v)
{
ASSERT(canSetIndex(i));
- ArrayStorage *storage = arrayStorage();
+ ArrayStorage *storage = m_storage;
#if CHECK_ARRAY_CONSISTENCY
ASSERT(storage->m_inCompactInitialization);
#endif
@@ -139,16 +143,6 @@ namespace JSC {
void* subclassData() const;
void setSubclassData(void*);
- inline ArrayStorage *arrayStorage() const
- {
- return reinterpret_cast<ArrayStorage*>(reinterpret_cast<char*>(m_vector) - (sizeof(ArrayStorage) - sizeof(JSValue)));
- }
-
- inline void setArrayStorage(ArrayStorage *storage)
- {
- m_vector = &storage->m_vector[0];
- }
-
private:
virtual const ClassInfo* classInfo() const { return &info; }
@@ -166,7 +160,7 @@ namespace JSC {
unsigned m_vectorLength; // The valid length of m_vector
int m_indexBias; // The number of JSValue sized blocks before ArrayStorage.
- JSValue* m_vector; // Copy of ArrayStorage.m_vector. Used for quick vector access and to materialize ArrayStorage ptr.
+ ArrayStorage *m_storage;
};
JSArray* asArray(JSValue);
@@ -192,7 +186,7 @@ namespace JSC {
{
JSObject::markChildrenDirect(markStack);
- ArrayStorage* storage = arrayStorage();
+ ArrayStorage* storage = m_storage;
unsigned usedVectorLength = std::min(storage->m_length, m_vectorLength);
markStack.appendValues(storage->m_vector, usedVectorLength, MayContainNullValues);