diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h | |
download | Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2 |
Long live Qt!
Diffstat (limited to 'src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h')
-rw-r--r-- | src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h new file mode 100644 index 0000000..e280022 --- /dev/null +++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSArray.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) + * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#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; // A JSArray subclass can use this to fill the vector lazily. + 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); // FIXME: Make protected and add setItem. + + static const ClassInfo info; + + 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*); + void sort(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)); + } + +} // namespace JSC + +#endif // JSArray_h |