#ifndef JSArray_h
#define JSArray_h
#include "JSObject.h"
namespace JSC {
typedef HashMap<unsigned, JSValuePtr> SparseArrayValueMap;
struct ArrayStorage {
unsigned m_length;
unsigned m_vectorLength;
unsigned m_numValuesInVector;
SparseArrayValueMap* m_sparseValueMap;
void* lazyCreationData; JSValuePtr m_vector[1];
};
class JSArray : public JSObject {
friend class JIT;
public:
explicit JSArray(PassRefPtr<Structure>);
JSArray(PassRefPtr<Structure>, unsigned initialLength);
JSArray(ExecState*, PassRefPtr<Structure>, const ArgList& initialValues);
virtual ~JSArray();
virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
virtual bool getOwnPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
virtual void put(ExecState*, unsigned propertyName, JSValuePtr);
static const ClassInfo info;
unsigned length() const { return m_storage->m_length; }
void setLength(unsigned);
void sort(ExecState*);
void sort(ExecState*, JSValuePtr compareFunction, CallType, const CallData&);
void sortNumeric(ExecState*, JSValuePtr compareFunction, CallType, const CallData&);
void push(ExecState*, JSValuePtr);
JSValuePtr pop();
bool canGetIndex(unsigned i) { return i < m_fastAccessCutoff; }
JSValuePtr getIndex(unsigned i)
{
ASSERT(canGetIndex(i));
return m_storage->m_vector[i];
}
bool canSetIndex(unsigned i) { return i < m_fastAccessCutoff; }
JSValuePtr setIndex(unsigned i, JSValuePtr v)
{
ASSERT(canSetIndex(i));
return m_storage->m_vector[i] = v;
}
void fillArgList(ExecState*, ArgList&);
static PassRefPtr<Structure> createStructure(JSValuePtr prototype)
{
return Structure::create(prototype, TypeInfo(ObjectType));
}
protected:
virtual void put(ExecState*, const Identifier& propertyName, JSValuePtr, PutPropertySlot&);
virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
virtual bool deleteProperty(ExecState*, unsigned propertyName);
virtual void getPropertyNames(ExecState*, PropertyNameArray&);
virtual void mark();
void* lazyCreationData();
void setLazyCreationData(void*);
private:
virtual const ClassInfo* classInfo() const { return &info; }
bool getOwnPropertySlotSlowCase(ExecState*, unsigned propertyName, PropertySlot&);
void putSlowCase(ExecState*, unsigned propertyName, JSValuePtr);
bool increaseVectorLength(unsigned newLength);
unsigned compactForSorting();
enum ConsistencyCheckType { NormalConsistencyCheck, DestructorConsistencyCheck, SortConsistencyCheck };
void checkConsistency(ConsistencyCheckType = NormalConsistencyCheck);
unsigned m_fastAccessCutoff;
ArrayStorage* m_storage;
};
JSArray* asArray(JSValuePtr);
JSArray* constructEmptyArray(ExecState*);
JSArray* constructEmptyArray(ExecState*, unsigned initialLength);
JSArray* constructArray(ExecState*, JSValuePtr singleItemValue);
JSArray* constructArray(ExecState*, const ArgList& values);
inline JSArray* asArray(JSValuePtr value)
{
ASSERT(asObject(value)->inherits(&JSArray::info));
return static_cast<JSArray*>(asObject(value));
}
}
#endif // JSArray_h