1/* 2 * Copyright (C) 2003, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef RUNTIME_ARRAY_H_ 27#define RUNTIME_ARRAY_H_ 28 29#include "BridgeJSC.h" 30#include "JSDOMBinding.h" 31#include <runtime/ArrayPrototype.h> 32 33namespace JSC { 34 35class RuntimeArray : public JSArray { 36public: 37 typedef JSArray Base; 38 39 static RuntimeArray* create(ExecState* exec, Bindings::Array* array) 40 { 41 // FIXME: deprecatedGetDOMStructure uses the prototype off of the wrong global object 42 // We need to pass in the right global object for "array". 43 Structure* domStructure = WebCore::deprecatedGetDOMStructure<RuntimeArray>(exec); 44 RuntimeArray* runtimeArray = new (NotNull, allocateCell<RuntimeArray>(*exec->heap())) RuntimeArray(exec, domStructure); 45 runtimeArray->finishCreation(exec->vm(), array); 46 exec->vm().heap.addFinalizer(runtimeArray, destroy); 47 return runtimeArray; 48 } 49 50 typedef Bindings::Array BindingsArray; 51 ~RuntimeArray(); 52 static void destroy(JSCell*); 53 static const bool needsDestruction = false; 54 55 static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 56 static bool getOwnPropertySlot(JSCell*, ExecState*, PropertyName, PropertySlot&); 57 static bool getOwnPropertySlotByIndex(JSCell*, ExecState*, unsigned, PropertySlot&); 58 static bool getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, PropertyDescriptor&); 59 static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); 60 static void putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow); 61 62 static bool deleteProperty(JSCell*, ExecState*, PropertyName); 63 static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned propertyName); 64 65 unsigned getLength() const { return m_array->getLength(); } 66 67 Bindings::Array* getConcreteArray() const { return m_array; } 68 69 static const ClassInfo s_info; 70 71 static ArrayPrototype* createPrototype(ExecState*, JSGlobalObject* globalObject) 72 { 73 return globalObject->arrayPrototype(); 74 } 75 76 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 77 { 78 return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info, ArrayClass); 79 } 80 81protected: 82 void finishCreation(VM&, Bindings::Array*); 83 84 static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | JSArray::StructureFlags; 85 86private: 87 RuntimeArray(ExecState*, Structure*); 88 static JSValue lengthGetter(ExecState*, JSValue, PropertyName); 89 static JSValue indexGetter(ExecState*, JSValue, unsigned); 90 91 BindingsArray* m_array; 92}; 93 94} // namespace JSC 95 96#endif // RUNTIME_ARRAY_H_ 97