Remove m_subclassData from JSArray, move the attribute to subclass as needed
[WebKit-https.git] / Source / WebCore / bridge / runtime_array.h
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
33 namespace JSC {
34     
35 class RuntimeArray : public JSArray {
36 public:
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->globalData(), array);
46         return runtimeArray;
47     }
48
49     typedef Bindings::Array BindingsArray;
50     ~RuntimeArray();
51     static void destroy(JSCell*);
52
53     static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
54     static bool getOwnPropertySlot(JSCell*, ExecState*, const Identifier&, PropertySlot&);
55     static bool getOwnPropertySlotByIndex(JSCell*, ExecState*, unsigned, PropertySlot&);
56     static bool getOwnPropertyDescriptor(JSObject*, ExecState*, const Identifier&, PropertyDescriptor&);
57     static void put(JSCell*, ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
58     static void putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
59     
60     static bool deleteProperty(JSCell*, ExecState*, const Identifier &propertyName);
61     static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned propertyName);
62     
63     unsigned getLength() const { return m_array->getLength(); }
64     
65     Bindings::Array* getConcreteArray() const { return m_array; }
66
67     static const ClassInfo s_info;
68
69     static ArrayPrototype* createPrototype(ExecState*, JSGlobalObject* globalObject)
70     {
71         return globalObject->arrayPrototype();
72     }
73
74     static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
75     {
76         return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
77     }
78
79 protected:
80     void finishCreation(JSGlobalData&, Bindings::Array*);
81
82     static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSArray::StructureFlags;
83
84 private:
85     RuntimeArray(ExecState*, Structure*);
86     static JSValue lengthGetter(ExecState*, JSValue, const Identifier&);
87     static JSValue indexGetter(ExecState*, JSValue, unsigned);
88
89     BindingsArray* m_array;
90 };
91     
92 } // namespace JSC
93
94 #endif // RUNTIME_ARRAY_H_