33 #include <private/qscriptactivationobject_p.h> |
33 #include <private/qscriptactivationobject_p.h> |
34 #include <QtCore/qstringlist.h> |
34 #include <QtCore/qstringlist.h> |
35 |
35 |
36 QT_BEGIN_NAMESPACE |
36 QT_BEGIN_NAMESPACE |
37 |
37 |
|
38 /*! |
|
39 \class QScriptDeclarativeClass::Value |
|
40 \internal |
|
41 \brief The QScriptDeclarativeClass::Value class acts as a container for JavaScript data types. |
|
42 |
|
43 QScriptDeclarativeClass::Value class is similar to QScriptValue, but it is slightly faster. |
|
44 Unlike QScriptValue, however, Value instances cannot be stored as they may not survive garbage |
|
45 collection. If you need to store a Value, convert it to a QScriptValue and store that. |
|
46 */ |
|
47 |
|
48 QScriptDeclarativeClass::Value::Value() |
|
49 { |
|
50 new (this) JSC::JSValue(JSC::jsUndefined()); |
|
51 } |
|
52 |
|
53 QScriptDeclarativeClass::Value::Value(const Value &other) |
|
54 { |
|
55 new (this) JSC::JSValue((JSC::JSValue &)other); |
|
56 } |
|
57 |
|
58 static QScriptDeclarativeClass::Value jscToValue(const JSC::JSValue &val) |
|
59 { |
|
60 return QScriptDeclarativeClass::Value((QScriptDeclarativeClass::Value &)val); |
|
61 } |
|
62 |
|
63 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, int value) |
|
64 { |
|
65 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); |
|
66 } |
|
67 |
|
68 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, uint value) |
|
69 { |
|
70 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); |
|
71 } |
|
72 |
|
73 QScriptDeclarativeClass::Value::Value(QScriptContext *, bool value) |
|
74 { |
|
75 if (value) |
|
76 new (this) JSC::JSValue(JSC::JSValue::JSTrue); |
|
77 else |
|
78 new (this) JSC::JSValue(JSC::JSValue::JSFalse); |
|
79 } |
|
80 |
|
81 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, double value) |
|
82 { |
|
83 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); |
|
84 } |
|
85 |
|
86 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, float value) |
|
87 { |
|
88 new (this) JSC::JSValue(QScriptEnginePrivate::frameForContext(ctxt), value); |
|
89 } |
|
90 |
|
91 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QString &value) |
|
92 { |
|
93 new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::frameForContext(ctxt), value)); |
|
94 } |
|
95 |
|
96 QScriptDeclarativeClass::Value::Value(QScriptContext *ctxt, const QScriptValue &value) |
|
97 { |
|
98 new (this) JSC::JSValue(QScriptEnginePrivate::get(ctxt->engine())->scriptValueToJSCValue(value)); |
|
99 } |
|
100 |
|
101 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, int value) |
|
102 { |
|
103 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); |
|
104 } |
|
105 |
|
106 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, uint value) |
|
107 { |
|
108 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); |
|
109 } |
|
110 |
|
111 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, bool value) |
|
112 { |
|
113 if (value) |
|
114 new (this) JSC::JSValue(JSC::JSValue::JSTrue); |
|
115 else |
|
116 new (this) JSC::JSValue(JSC::JSValue::JSFalse); |
|
117 } |
|
118 |
|
119 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, double value) |
|
120 { |
|
121 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); |
|
122 } |
|
123 |
|
124 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, float value) |
|
125 { |
|
126 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->currentFrame, value); |
|
127 } |
|
128 |
|
129 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QString &value) |
|
130 { |
|
131 new (this) JSC::JSValue(JSC::jsString(QScriptEnginePrivate::get(eng)->currentFrame, value)); |
|
132 } |
|
133 |
|
134 QScriptDeclarativeClass::Value::Value(QScriptEngine *eng, const QScriptValue &value) |
|
135 { |
|
136 new (this) JSC::JSValue(QScriptEnginePrivate::get(eng)->scriptValueToJSCValue(value)); |
|
137 } |
|
138 |
|
139 QScriptDeclarativeClass::Value::~Value() |
|
140 { |
|
141 ((JSC::JSValue *)(this))->~JSValue(); |
|
142 } |
|
143 |
|
144 QScriptValue QScriptDeclarativeClass::Value::toScriptValue(QScriptEngine *engine) const |
|
145 { |
|
146 return QScriptEnginePrivate::get(engine)->scriptValueFromJSCValue((JSC::JSValue &)*this); |
|
147 } |
|
148 |
38 QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier() |
149 QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier() |
|
150 : identifier(0), engine(0) |
39 { |
151 { |
40 new (&d) JSC::Identifier(); |
152 new (&d) JSC::Identifier(); |
41 } |
153 } |
42 |
154 |
43 QScriptDeclarativeClass::PersistentIdentifier::~PersistentIdentifier() |
155 QScriptDeclarativeClass::PersistentIdentifier::~PersistentIdentifier() |
44 { |
156 { |
45 ((JSC::Identifier &)d).JSC::Identifier::~Identifier(); |
157 if (engine) { |
|
158 QScript::APIShim shim(engine); |
|
159 ((JSC::Identifier &)d).JSC::Identifier::~Identifier(); |
|
160 } else { |
|
161 ((JSC::Identifier &)d).JSC::Identifier::~Identifier(); |
|
162 } |
46 } |
163 } |
47 |
164 |
48 QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier(const PersistentIdentifier &other) |
165 QScriptDeclarativeClass::PersistentIdentifier::PersistentIdentifier(const PersistentIdentifier &other) |
49 { |
166 { |
50 identifier = other.identifier; |
167 identifier = other.identifier; |
|
168 engine = other.engine; |
51 new (&d) JSC::Identifier((JSC::Identifier &)(other.d)); |
169 new (&d) JSC::Identifier((JSC::Identifier &)(other.d)); |
52 } |
170 } |
53 |
171 |
54 QScriptDeclarativeClass::PersistentIdentifier & |
172 QScriptDeclarativeClass::PersistentIdentifier & |
55 QScriptDeclarativeClass::PersistentIdentifier::operator=(const PersistentIdentifier &other) |
173 QScriptDeclarativeClass::PersistentIdentifier::operator=(const PersistentIdentifier &other) |
56 { |
174 { |
57 identifier = other.identifier; |
175 identifier = other.identifier; |
|
176 engine = other.engine; |
58 ((JSC::Identifier &)d) = (JSC::Identifier &)(other.d); |
177 ((JSC::Identifier &)d) = (JSC::Identifier &)(other.d); |
59 return *this; |
178 return *this; |
60 } |
179 } |
61 |
180 |
62 QScriptDeclarativeClass::QScriptDeclarativeClass(QScriptEngine *engine) |
181 QScriptDeclarativeClass::QScriptDeclarativeClass(QScriptEngine *engine) |
72 Object *object) |
191 Object *object) |
73 { |
192 { |
74 Q_ASSERT(engine); |
193 Q_ASSERT(engine); |
75 Q_ASSERT(scriptClass); |
194 Q_ASSERT(scriptClass); |
76 |
195 |
77 QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine)); |
196 QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine)); |
|
197 QScript::APIShim shim(p); |
78 |
198 |
79 JSC::ExecState* exec = p->currentFrame; |
199 JSC::ExecState* exec = p->currentFrame; |
80 QScriptObject *result = new (exec) QScriptObject(p->scriptObjectStructure); |
200 QScriptObject *result = new (exec) QScriptObject(p->scriptObjectStructure); |
81 result->setDelegate(new QScript::DeclarativeObjectDelegate(scriptClass, object)); |
201 result->setDelegate(new QScript::DeclarativeObjectDelegate(scriptClass, object)); |
82 return p->scriptValueFromJSCValue(result); |
202 return p->scriptValueFromJSCValue(result); |
83 } |
203 } |
84 |
204 |
|
205 QScriptDeclarativeClass::Value |
|
206 QScriptDeclarativeClass::newObjectValue(QScriptEngine *engine, |
|
207 QScriptDeclarativeClass *scriptClass, |
|
208 Object *object) |
|
209 { |
|
210 Q_ASSERT(engine); |
|
211 Q_ASSERT(scriptClass); |
|
212 |
|
213 QScriptEnginePrivate *p = static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(engine)); |
|
214 QScript::APIShim shim(p); |
|
215 |
|
216 JSC::ExecState* exec = p->currentFrame; |
|
217 QScriptObject *result = new (exec) QScriptObject(p->scriptObjectStructure); |
|
218 result->setDelegate(new QScript::DeclarativeObjectDelegate(scriptClass, object)); |
|
219 return jscToValue(JSC::JSValue(result)); |
|
220 } |
|
221 |
85 QScriptDeclarativeClass *QScriptDeclarativeClass::scriptClass(const QScriptValue &v) |
222 QScriptDeclarativeClass *QScriptDeclarativeClass::scriptClass(const QScriptValue &v) |
86 { |
223 { |
87 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
224 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
88 if (!d || !d->isJSC() || !d->jscValue.inherits(&QScriptObject::info)) |
225 if (!d || !d->isJSC()) |
89 return 0; |
226 return 0; |
90 QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(d->jscValue)); |
227 return QScriptEnginePrivate::declarativeClass(d->jscValue); |
91 QScriptObjectDelegate *delegate = scriptObject->delegate(); |
228 } |
92 if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject)) |
229 |
|
230 QScriptDeclarativeClass::Object *QScriptDeclarativeClass::object(const QScriptValue &v) |
|
231 { |
|
232 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
|
233 if (!d || !d->isJSC()) |
93 return 0; |
234 return 0; |
94 return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->scriptClass(); |
235 return QScriptEnginePrivate::declarativeObject(d->jscValue); |
95 } |
|
96 |
|
97 QScriptDeclarativeClass::Object *QScriptDeclarativeClass::object(const QScriptValue &v) |
|
98 { |
|
99 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
|
100 if (!d || !d->isJSC() || !d->jscValue.inherits(&QScriptObject::info)) |
|
101 return 0; |
|
102 QScriptObject *scriptObject = static_cast<QScriptObject*>(JSC::asObject(d->jscValue)); |
|
103 QScriptObjectDelegate *delegate = scriptObject->delegate(); |
|
104 if (!delegate || (delegate->type() != QScriptObjectDelegate::DeclarativeClassObject)) |
|
105 return 0; |
|
106 return static_cast<QScript::DeclarativeObjectDelegate*>(delegate)->object(); |
|
107 } |
236 } |
108 |
237 |
109 QScriptValue QScriptDeclarativeClass::function(const QScriptValue &v, const Identifier &name) |
238 QScriptValue QScriptDeclarativeClass::function(const QScriptValue &v, const Identifier &name) |
110 { |
239 { |
111 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
240 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
112 |
241 |
113 if (!d->isObject()) |
242 if (!d->isObject()) |
114 return QScriptValue(); |
243 return QScriptValue(); |
115 |
244 |
|
245 QScript::APIShim shim(d->engine); |
116 JSC::ExecState *exec = d->engine->currentFrame; |
246 JSC::ExecState *exec = d->engine->currentFrame; |
117 JSC::JSObject *object = d->jscValue.getObject(); |
247 JSC::JSObject *object = d->jscValue.getObject(); |
118 JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); |
248 JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); |
119 JSC::JSValue result; |
249 JSC::JSValue result; |
120 |
250 |
147 result = slot.getValue(exec, id); |
278 result = slot.getValue(exec, id); |
148 return d->engine->scriptValueFromJSCValue(result); |
279 return d->engine->scriptValueFromJSCValue(result); |
149 } |
280 } |
150 |
281 |
151 return QScriptValue(); |
282 return QScriptValue(); |
|
283 } |
|
284 |
|
285 QScriptDeclarativeClass::Value |
|
286 QScriptDeclarativeClass::functionValue(const QScriptValue &v, const Identifier &name) |
|
287 { |
|
288 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
|
289 |
|
290 if (!d->isObject()) |
|
291 return Value(); |
|
292 |
|
293 QScript::APIShim shim(d->engine); |
|
294 JSC::ExecState *exec = d->engine->currentFrame; |
|
295 JSC::JSObject *object = d->jscValue.getObject(); |
|
296 JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); |
|
297 JSC::JSValue result; |
|
298 |
|
299 JSC::Identifier id(exec, (JSC::UString::Rep *)name); |
|
300 |
|
301 if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) { |
|
302 result = slot.getValue(exec, id); |
|
303 if (QScript::isFunction(result)) |
|
304 return jscToValue(result); |
|
305 } |
|
306 |
|
307 return Value(); |
|
308 } |
|
309 |
|
310 QScriptDeclarativeClass::Value |
|
311 QScriptDeclarativeClass::propertyValue(const QScriptValue &v, const Identifier &name) |
|
312 { |
|
313 QScriptValuePrivate *d = QScriptValuePrivate::get(v); |
|
314 |
|
315 if (!d->isObject()) |
|
316 return Value(); |
|
317 |
|
318 QScript::APIShim shim(d->engine); |
|
319 JSC::ExecState *exec = d->engine->currentFrame; |
|
320 JSC::JSObject *object = d->jscValue.getObject(); |
|
321 JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); |
|
322 JSC::JSValue result; |
|
323 |
|
324 JSC::Identifier id(exec, (JSC::UString::Rep *)name); |
|
325 |
|
326 if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) { |
|
327 result = slot.getValue(exec, id); |
|
328 return jscToValue(result); |
|
329 } |
|
330 |
|
331 return Value(); |
152 } |
332 } |
153 |
333 |
154 /* |
334 /* |
155 Returns the scope chain entry at \a index. If index is less than 0, returns |
335 Returns the scope chain entry at \a index. If index is less than 0, returns |
156 entries starting at the end. For example, scopeChainValue(context, -1) will return |
336 entries starting at the end. For example, scopeChainValue(context, -1) will return |
239 QScriptEngine *QScriptDeclarativeClass::engine() const |
421 QScriptEngine *QScriptDeclarativeClass::engine() const |
240 { |
422 { |
241 return d_ptr->engine; |
423 return d_ptr->engine; |
242 } |
424 } |
243 |
425 |
|
426 bool QScriptDeclarativeClass::supportsCall() const |
|
427 { |
|
428 return d_ptr->supportsCall; |
|
429 } |
|
430 |
|
431 void QScriptDeclarativeClass::setSupportsCall(bool c) |
|
432 { |
|
433 d_ptr->supportsCall = c; |
|
434 } |
|
435 |
244 QScriptDeclarativeClass::PersistentIdentifier |
436 QScriptDeclarativeClass::PersistentIdentifier |
245 QScriptDeclarativeClass::createPersistentIdentifier(const QString &str) |
437 QScriptDeclarativeClass::createPersistentIdentifier(const QString &str) |
246 { |
438 { |
247 QScriptEnginePrivate *p = |
439 QScriptEnginePrivate *p = |
248 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); |
440 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); |
|
441 QScript::APIShim shim(p); |
249 JSC::ExecState* exec = p->currentFrame; |
442 JSC::ExecState* exec = p->currentFrame; |
250 |
443 |
251 PersistentIdentifier rv(true); |
444 PersistentIdentifier rv(p); |
252 new (&rv.d) JSC::Identifier(exec, (UChar *)str.constData(), str.size()); |
445 new (&rv.d) JSC::Identifier(exec, (UChar *)str.constData(), str.size()); |
253 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); |
446 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); |
254 return rv; |
447 return rv; |
255 } |
448 } |
256 |
449 |
257 QScriptDeclarativeClass::PersistentIdentifier |
450 QScriptDeclarativeClass::PersistentIdentifier |
258 QScriptDeclarativeClass::createPersistentIdentifier(const Identifier &id) |
451 QScriptDeclarativeClass::createPersistentIdentifier(const Identifier &id) |
259 { |
452 { |
260 QScriptEnginePrivate *p = |
453 QScriptEnginePrivate *p = |
261 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); |
454 static_cast<QScriptEnginePrivate *>(QObjectPrivate::get(d_ptr->engine)); |
|
455 QScript::APIShim shim(p); |
262 JSC::ExecState* exec = p->currentFrame; |
456 JSC::ExecState* exec = p->currentFrame; |
263 |
457 |
264 PersistentIdentifier rv(true); |
458 PersistentIdentifier rv(p); |
265 new (&rv.d) JSC::Identifier(exec, (JSC::UString::Rep *)id); |
459 new (&rv.d) JSC::Identifier(exec, (JSC::UString::Rep *)id); |
266 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); |
460 rv.identifier = (void *)((JSC::Identifier &)rv.d).ustring().rep(); |
267 return rv; |
461 return rv; |
268 } |
462 } |
269 |
463 |