1 /* 2 * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 3 * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * 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. 9 * 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. 14 * 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 18 * 19 */ 20 21 #ifndef JSArray_h 22 #define JSArray_h 23 24 #include "JSObject.h" 25 26 namespace JSC { 27 28 typedef HashMap<unsigned, JSValue> SparseArrayValueMap; 29 30 struct ArrayStorage { 31 unsigned m_length; 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. 36 JSValue m_vector[1]; 37 }; 38 39 class JSArray : public JSObject { 40 friend class JIT; 41 42 public: 43 explicit JSArray(PassRefPtr<Structure>); 44 JSArray(PassRefPtr<Structure>, unsigned initialLength); 45 JSArray(PassRefPtr<Structure>, const ArgList& initialValues); 46 virtual ~JSArray(); 47 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. 51 52 static JS_EXPORTDATA const ClassInfo info; 53 length()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. 56 57 void sort(ExecState*); 58 void sort(ExecState*, JSValue compareFunction, CallType, const CallData&); 59 void sortNumeric(ExecState*, JSValue compareFunction, CallType, const CallData&); 60 61 void push(ExecState*, JSValue); 62 JSValue pop(); 63 canGetIndex(unsigned i)64 bool canGetIndex(unsigned i) { return i < m_fastAccessCutoff; } getIndex(unsigned i)65 JSValue getIndex(unsigned i) 66 { 67 ASSERT(canGetIndex(i)); 68 return m_storage->m_vector[i]; 69 } 70 canSetIndex(unsigned i)71 bool canSetIndex(unsigned i) { return i < m_fastAccessCutoff; } setIndex(unsigned i,JSValue v)72 JSValue setIndex(unsigned i, JSValue v) 73 { 74 ASSERT(canSetIndex(i)); 75 return m_storage->m_vector[i] = v; 76 } 77 78 void fillArgList(ExecState*, MarkedArgumentBuffer&); 79 void copyToRegisters(ExecState*, Register*, uint32_t); 80 createStructure(JSValue prototype)81 static PassRefPtr<Structure> createStructure(JSValue prototype) 82 { 83 return Structure::create(prototype, TypeInfo(ObjectType)); 84 } 85 86 protected: 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&); 91 virtual void markChildren(MarkStack&); 92 93 void* lazyCreationData(); 94 void setLazyCreationData(void*); 95 96 private: classInfo()97 virtual const ClassInfo* classInfo() const { return &info; } 98 99 bool getOwnPropertySlotSlowCase(ExecState*, unsigned propertyName, PropertySlot&); 100 void putSlowCase(ExecState*, unsigned propertyName, JSValue); 101 102 bool increaseVectorLength(unsigned newLength); 103 104 unsigned compactForSorting(); 105 106 enum ConsistencyCheckType { NormalConsistencyCheck, DestructorConsistencyCheck, SortConsistencyCheck }; 107 void checkConsistency(ConsistencyCheckType = NormalConsistencyCheck); 108 109 unsigned m_fastAccessCutoff; 110 ArrayStorage* m_storage; 111 }; 112 113 JSArray* asArray(JSValue); 114 115 JSArray* constructEmptyArray(ExecState*); 116 JSArray* constructEmptyArray(ExecState*, unsigned initialLength); 117 JSArray* constructArray(ExecState*, JSValue singleItemValue); 118 JSArray* constructArray(ExecState*, const ArgList& values); 119 asArray(JSValue value)120 inline JSArray* asArray(JSValue value) 121 { 122 ASSERT(asObject(value)->inherits(&JSArray::info)); 123 return static_cast<JSArray*>(asObject(value)); 124 } 125 isJSArray(JSGlobalData * globalData,JSValue v)126 inline bool isJSArray(JSGlobalData* globalData, JSValue v) { return v.isCell() && v.asCell()->vptr() == globalData->jsArrayVPtr; } 127 128 } // namespace JSC 129 130 #endif // JSArray_h 131