2 * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 typedef HashMap
<unsigned, JSValue
> SparseArrayValueMap
;
32 unsigned m_vectorLength
;
33 unsigned m_numValuesInVector
;
34 SparseArrayValueMap
* m_sparseValueMap
;
35 void* lazyCreationData
; // A JSArray subclass can use this to fill the vector lazily.
39 class JSArray
: public JSObject
{
43 explicit JSArray(PassRefPtr
<Structure
>);
44 JSArray(PassRefPtr
<Structure
>, unsigned initialLength
);
45 JSArray(PassRefPtr
<Structure
>, const ArgList
& initialValues
);
48 virtual bool getOwnPropertySlot(ExecState
*, const Identifier
& propertyName
, PropertySlot
&);
49 virtual bool getOwnPropertySlot(ExecState
*, unsigned propertyName
, PropertySlot
&);
50 virtual void put(ExecState
*, unsigned propertyName
, JSValue
); // FIXME: Make protected and add setItem.
52 static JS_EXPORTDATA
const ClassInfo info
;
54 unsigned length() const { return m_storage
->m_length
; }
55 void setLength(unsigned); // OK to use on new arrays, but not if it might be a RegExpMatchArray.
57 void sort(ExecState
*);
58 void sort(ExecState
*, JSValue compareFunction
, CallType
, const CallData
&);
59 void sortNumeric(ExecState
*, JSValue compareFunction
, CallType
, const CallData
&);
61 void push(ExecState
*, JSValue
);
64 bool canGetIndex(unsigned i
) { return i
< m_fastAccessCutoff
; }
65 JSValue
getIndex(unsigned i
)
67 ASSERT(canGetIndex(i
));
68 return m_storage
->m_vector
[i
];
71 bool canSetIndex(unsigned i
) { return i
< m_fastAccessCutoff
; }
72 JSValue
setIndex(unsigned i
, JSValue v
)
74 ASSERT(canSetIndex(i
));
75 return m_storage
->m_vector
[i
] = v
;
78 void fillArgList(ExecState
*, MarkedArgumentBuffer
&);
79 void copyToRegisters(ExecState
*, Register
*, uint32_t);
81 static PassRefPtr
<Structure
> createStructure(JSValue prototype
)
83 return Structure::create(prototype
, TypeInfo(ObjectType
));
87 virtual void put(ExecState
*, const Identifier
& propertyName
, JSValue
, PutPropertySlot
&);
88 virtual bool deleteProperty(ExecState
*, const Identifier
& propertyName
);
89 virtual bool deleteProperty(ExecState
*, unsigned propertyName
);
90 virtual void getPropertyNames(ExecState
*, PropertyNameArray
&);
93 void* lazyCreationData();
94 void setLazyCreationData(void*);
97 virtual const ClassInfo
* classInfo() const { return &info
; }
99 bool getOwnPropertySlotSlowCase(ExecState
*, unsigned propertyName
, PropertySlot
&);
100 void putSlowCase(ExecState
*, unsigned propertyName
, JSValue
);
102 bool increaseVectorLength(unsigned newLength
);
104 unsigned compactForSorting();
106 enum ConsistencyCheckType
{ NormalConsistencyCheck
, DestructorConsistencyCheck
, SortConsistencyCheck
};
107 void checkConsistency(ConsistencyCheckType
= NormalConsistencyCheck
);
109 unsigned m_fastAccessCutoff
;
110 ArrayStorage
* m_storage
;
113 JSArray
* asArray(JSValue
);
115 JSArray
* constructEmptyArray(ExecState
*);
116 JSArray
* constructEmptyArray(ExecState
*, unsigned initialLength
);
117 JSArray
* constructArray(ExecState
*, JSValue singleItemValue
);
118 JSArray
* constructArray(ExecState
*, const ArgList
& values
);
120 inline JSArray
* asArray(JSValue value
)
122 ASSERT(asObject(value
)->inherits(&JSArray::info
));
123 return static_cast<JSArray
*>(asObject(value
));
126 inline bool isJSArray(JSGlobalData
* globalData
, JSValue v
) { return v
.isCell() && v
.asCell()->vptr() == globalData
->jsArrayVPtr
; }