1/*
2 *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
4 *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU Library General Public
8 *  License as published by the Free Software Foundation; either
9 *  version 2 of the License, or (at your option) any later version.
10 *
11 *  This library is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 *  Library General Public License for more details.
15 *
16 *  You should have received a copy of the GNU Library General Public License
17 *  along with this library; see the file COPYING.LIB.  If not, write to
18 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 *  Boston, MA 02110-1301, USA.
20 *
21 */
22
23#ifndef ClassInfo_h
24#define ClassInfo_h
25
26#include "CallFrame.h"
27#include "ConstructData.h"
28#include "CopyToken.h"
29#include "JSCell.h"
30
31namespace JSC {
32
33class JSArrayBufferView;
34struct HashTable;
35
36struct MethodTable {
37    typedef void (*DestroyFunctionPtr)(JSCell*);
38    DestroyFunctionPtr destroy;
39
40    typedef void (*VisitChildrenFunctionPtr)(JSCell*, SlotVisitor&);
41    VisitChildrenFunctionPtr visitChildren;
42
43    typedef void (*CopyBackingStoreFunctionPtr)(JSCell*, CopyVisitor&, CopyToken);
44    CopyBackingStoreFunctionPtr copyBackingStore;
45
46    typedef CallType (*GetCallDataFunctionPtr)(JSCell*, CallData&);
47    GetCallDataFunctionPtr getCallData;
48
49    typedef ConstructType (*GetConstructDataFunctionPtr)(JSCell*, ConstructData&);
50    GetConstructDataFunctionPtr getConstructData;
51
52    typedef void (*PutFunctionPtr)(JSCell*, ExecState*, PropertyName propertyName, JSValue, PutPropertySlot&);
53    PutFunctionPtr put;
54
55    typedef void (*PutByIndexFunctionPtr)(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
56    PutByIndexFunctionPtr putByIndex;
57
58    typedef bool (*DeletePropertyFunctionPtr)(JSCell*, ExecState*, PropertyName);
59    DeletePropertyFunctionPtr deleteProperty;
60
61    typedef bool (*DeletePropertyByIndexFunctionPtr)(JSCell*, ExecState*, unsigned);
62    DeletePropertyByIndexFunctionPtr deletePropertyByIndex;
63
64    typedef bool (*GetOwnPropertySlotFunctionPtr)(JSObject*, ExecState*, PropertyName, PropertySlot&);
65    GetOwnPropertySlotFunctionPtr getOwnPropertySlot;
66
67    typedef bool (*GetOwnPropertySlotByIndexFunctionPtr)(JSObject*, ExecState*, unsigned, PropertySlot&);
68    GetOwnPropertySlotByIndexFunctionPtr getOwnPropertySlotByIndex;
69
70    typedef JSValue (*ToThisFunctionPtr)(JSCell*, ExecState*, ECMAMode);
71    ToThisFunctionPtr toThis;
72
73    typedef JSValue (*DefaultValueFunctionPtr)(const JSObject*, ExecState*, PreferredPrimitiveType);
74    DefaultValueFunctionPtr defaultValue;
75
76    typedef void (*GetOwnPropertyNamesFunctionPtr)(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
77    GetOwnPropertyNamesFunctionPtr getOwnPropertyNames;
78
79    typedef void (*GetOwnNonIndexPropertyNamesFunctionPtr)(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
80    GetOwnNonIndexPropertyNamesFunctionPtr getOwnNonIndexPropertyNames;
81
82    typedef void (*GetPropertyNamesFunctionPtr)(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
83    GetPropertyNamesFunctionPtr getPropertyNames;
84
85    typedef String (*ClassNameFunctionPtr)(const JSObject*);
86    ClassNameFunctionPtr className;
87
88    typedef bool (*CustomHasInstanceFunctionPtr)(JSObject*, ExecState*, JSValue);
89    CustomHasInstanceFunctionPtr customHasInstance;
90
91    typedef bool (*DefineOwnPropertyFunctionPtr)(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool);
92    DefineOwnPropertyFunctionPtr defineOwnProperty;
93
94    typedef ArrayBuffer* (*SlowDownAndWasteMemory)(JSArrayBufferView*);
95    SlowDownAndWasteMemory slowDownAndWasteMemory;
96
97    typedef PassRefPtr<ArrayBufferView> (*GetTypedArrayImpl)(JSArrayBufferView*);
98    GetTypedArrayImpl getTypedArrayImpl;
99
100    typedef void (*DumpToStreamFunctionPtr)(const JSCell*, PrintStream&);
101    DumpToStreamFunctionPtr dumpToStream;
102};
103
104#define CREATE_MEMBER_CHECKER(member) \
105    template <typename T> \
106    struct MemberCheck##member { \
107        struct Fallback { \
108            void member(...); \
109        }; \
110        struct Derived : T, Fallback { }; \
111        template <typename U, U> struct Check; \
112        typedef char Yes[2]; \
113        typedef char No[1]; \
114        template <typename U> \
115        static No &func(Check<void (Fallback::*)(...), &U::member>*); \
116        template <typename U> \
117        static Yes &func(...); \
118        enum { has = sizeof(func<Derived>(0)) == sizeof(Yes) }; \
119    }
120
121#define HAS_MEMBER_NAMED(klass, name) (MemberCheck##name<klass>::has)
122
123#define CREATE_METHOD_TABLE(ClassName) { \
124        &ClassName::destroy, \
125        &ClassName::visitChildren, \
126        &ClassName::copyBackingStore, \
127        &ClassName::getCallData, \
128        &ClassName::getConstructData, \
129        &ClassName::put, \
130        &ClassName::putByIndex, \
131        &ClassName::deleteProperty, \
132        &ClassName::deletePropertyByIndex, \
133        &ClassName::getOwnPropertySlot, \
134        &ClassName::getOwnPropertySlotByIndex, \
135        &ClassName::toThis, \
136        &ClassName::defaultValue, \
137        &ClassName::getOwnPropertyNames, \
138        &ClassName::getOwnNonIndexPropertyNames, \
139        &ClassName::getPropertyNames, \
140        &ClassName::className, \
141        &ClassName::customHasInstance, \
142        &ClassName::defineOwnProperty, \
143        &ClassName::slowDownAndWasteMemory, \
144        &ClassName::getTypedArrayImpl, \
145        &ClassName::dumpToStream \
146    }, \
147    ClassName::TypedArrayStorageType
148
149struct ClassInfo {
150    // A string denoting the class name. Example: "Window".
151    const char* className;
152
153    // Pointer to the class information of the base class.
154    // nullptrif there is none.
155    const ClassInfo* parentClass;
156
157    // Static hash-table of properties.
158    // For classes that can be used from multiple threads, it is accessed via a getter function
159    // that would typically return a pointer to a thread-specific value.
160    const HashTable* propHashTable(ExecState* exec) const
161    {
162        if (classPropHashTableGetterFunction)
163            return &classPropHashTableGetterFunction(exec->vm());
164
165        return staticPropHashTable;
166    }
167
168    const HashTable* propHashTable(VM& vm) const
169    {
170        if (classPropHashTableGetterFunction)
171            return &classPropHashTableGetterFunction(vm);
172
173        return staticPropHashTable;
174    }
175
176    bool isSubClassOf(const ClassInfo* other) const
177    {
178        for (const ClassInfo* ci = this; ci; ci = ci->parentClass) {
179            if (ci == other)
180                return true;
181        }
182        return false;
183    }
184
185    bool hasStaticProperties() const
186    {
187        for (const ClassInfo* ci = this; ci; ci = ci->parentClass) {
188            if (ci->staticPropHashTable || ci->classPropHashTableGetterFunction)
189                return true;
190        }
191        return false;
192    }
193
194    bool hasStaticSetterOrReadonlyProperties(VM&) const;
195
196    const HashTable* staticPropHashTable;
197    typedef const HashTable& (*ClassPropHashTableGetterFunction)(VM&);
198    const ClassPropHashTableGetterFunction classPropHashTableGetterFunction;
199
200    MethodTable methodTable;
201
202    TypedArrayType typedArrayStorageType;
203};
204
205} // namespace JSC
206
207#endif // ClassInfo_h
208