1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the QtScript module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QSCRIPTOBJECT_P_H
41#define QSCRIPTOBJECT_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QtCore/qobjectdefs.h>
55
56#include "JSObject.h"
57
58QT_BEGIN_NAMESPACE
59
60class QScriptObjectDelegate;
61
62class QScriptObject : public JSC::JSObject
63{
64public:
65 // work around CELL_SIZE limitation
66 struct Data
67 {
68 JSC::JSValue data; // QScriptValue::data
69 QScriptObjectDelegate *delegate;
70 bool isMarking; // recursion guard
71
72 Data() : delegate(0), isMarking(false) {}
73 ~Data();
74 };
75
76 explicit QScriptObject(WTF::PassRefPtr<JSC::Structure> sid);
77 virtual ~QScriptObject();
78
79 virtual bool getOwnPropertySlot(JSC::ExecState*,
80 const JSC::Identifier& propertyName,
81 JSC::PropertySlot&);
82 virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier&, JSC::PropertyDescriptor&);
83 virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
84 JSC::JSValue, JSC::PutPropertySlot&);
85 virtual bool deleteProperty(JSC::ExecState*,
86 const JSC::Identifier& propertyName);
87 virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&,
88 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
89 virtual void markChildren(JSC::MarkStack& markStack);
90 virtual JSC::CallType getCallData(JSC::CallData&);
91 virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
92 virtual bool hasInstance(JSC::ExecState*, JSC::JSValue value, JSC::JSValue proto);
93 virtual bool compareToObject(JSC::ExecState*, JSC::JSObject*);
94
95 virtual const JSC::ClassInfo* classInfo() const { return &info; }
96 static const JSC::ClassInfo info;
97
98 static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype)
99 {
100 return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags));
101 }
102
103 inline JSC::JSValue data() const;
104 inline void setData(JSC::JSValue data);
105
106 inline QScriptObjectDelegate *delegate() const;
107 inline void setDelegate(QScriptObjectDelegate *delegate);
108
109protected:
110 static const unsigned StructureFlags = JSC::ImplementsHasInstance | JSC::OverridesHasInstance | JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSObject::StructureFlags;
111
112 Data *d;
113};
114
115class QScriptObjectPrototype : public QScriptObject
116{
117public:
118 QScriptObjectPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>,
119 JSC::Structure* prototypeFunctionStructure);
120};
121
122class QScriptObjectDelegate
123{
124public:
125 enum Type {
126 QtObject,
127 Variant,
128 ClassObject,
129 DeclarativeClassObject
130 };
131
132 QScriptObjectDelegate();
133 virtual ~QScriptObjectDelegate();
134
135 virtual Type type() const = 0;
136
137 virtual bool getOwnPropertySlot(QScriptObject*, JSC::ExecState*,
138 const JSC::Identifier& propertyName,
139 JSC::PropertySlot&);
140 virtual bool getOwnPropertyDescriptor(QScriptObject*, JSC::ExecState*,
141 const JSC::Identifier& propertyName,
142 JSC::PropertyDescriptor&);
143 virtual void put(QScriptObject*, JSC::ExecState* exec, const JSC::Identifier& propertyName,
144 JSC::JSValue, JSC::PutPropertySlot&);
145 virtual bool deleteProperty(QScriptObject*, JSC::ExecState*,
146 const JSC::Identifier& propertyName);
147 virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, JSC::PropertyNameArray&,
148 JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
149 virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack);
150 virtual JSC::CallType getCallData(QScriptObject*, JSC::CallData&);
151 virtual JSC::ConstructType getConstructData(QScriptObject*, JSC::ConstructData&);
152 virtual bool hasInstance(QScriptObject*, JSC::ExecState*,
153 JSC::JSValue value, JSC::JSValue proto);
154 virtual bool compareToObject(QScriptObject*, JSC::ExecState*, JSC::JSObject*);
155
156private:
157 Q_DISABLE_COPY(QScriptObjectDelegate)
158};
159
160inline JSC::JSValue QScriptObject::data() const
161{
162 if (!d)
163 return JSC::JSValue();
164 return d->data;
165}
166
167inline void QScriptObject::setData(JSC::JSValue data)
168{
169 if (!d)
170 d = new Data();
171 d->data = data;
172}
173
174inline QScriptObjectDelegate *QScriptObject::delegate() const
175{
176 if (!d)
177 return 0;
178 return d->delegate;
179}
180
181inline void QScriptObject::setDelegate(QScriptObjectDelegate *delegate)
182{
183 if (!d)
184 d = new Data();
185 else
186 delete d->delegate;
187 d->delegate = delegate;
188}
189
190QT_END_NAMESPACE
191
192#endif
193

source code of qtscript/src/script/bridge/qscriptobject_p.h