]> git.saurik.com Git - apple/javascriptcore.git/blob - qt/api/qscriptvalue.cpp
127fe041010f672044b1813c6b819d8f76e36929
[apple/javascriptcore.git] / qt / api / qscriptvalue.cpp
1 /*
2 Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21
22 #include "qscriptvalue.h"
23
24 #include "qscriptengine.h"
25 #include "qscriptengine_p.h"
26 #include "qscriptvalue_p.h"
27 #include <QtCore/qdebug.h>
28
29 /*!
30 Constructs an invalid value.
31 */
32 QScriptValue::QScriptValue()
33 : d_ptr(new QScriptValuePrivate())
34 {
35 }
36
37 /*!
38 Constructs a new QScriptValue with a boolean \a value.
39 */
40 QScriptValue::QScriptValue(bool value)
41 : d_ptr(new QScriptValuePrivate(value))
42 {
43 }
44
45 /*!
46 Constructs a new QScriptValue with a number \a value.
47 */
48 QScriptValue::QScriptValue(int value)
49 : d_ptr(new QScriptValuePrivate(value))
50 {
51 }
52
53 /*!
54 Constructs a new QScriptValue with a number \a value.
55 */
56 QScriptValue::QScriptValue(uint value)
57 : d_ptr(new QScriptValuePrivate(value))
58 {
59 }
60
61 /*!
62 Constructs a new QScriptValue with a number \a value.
63 */
64 QScriptValue::QScriptValue(qsreal value)
65 : d_ptr(new QScriptValuePrivate(value))
66 {
67 }
68
69 /*!
70 Constructs a new QScriptValue with a string \a value.
71 */
72 QScriptValue::QScriptValue(const QString& value)
73 : d_ptr(new QScriptValuePrivate(value))
74 {
75 }
76
77 /*!
78 Constructs a new QScriptValue with a special \a value.
79 */
80 QScriptValue::QScriptValue(SpecialValue value)
81 : d_ptr(new QScriptValuePrivate(value))
82 {
83 }
84
85 /*!
86 Constructs a new QScriptValue with a string \a value.
87 */
88 QScriptValue::QScriptValue(const char* value)
89 : d_ptr(new QScriptValuePrivate(QString::fromUtf8(value)))
90 {
91 }
92
93 /*!
94 Block automatic convertion to bool
95 \internal
96 */
97 QScriptValue::QScriptValue(void* d)
98 {
99 Q_ASSERT(false);
100 }
101
102 /*!
103 Constructs a new QScriptValue from private
104 \internal
105 */
106 QScriptValue::QScriptValue(QScriptValuePrivate* d)
107 : d_ptr(d)
108 {
109 }
110
111 /*!
112 \obsolete
113
114 Constructs a new QScriptValue with the boolean \a value and
115 registers it with the script \a engine.
116 */
117 QScriptValue::QScriptValue(QScriptEngine* engine, bool value)
118 : d_ptr(new QScriptValuePrivate(engine, value))
119 {
120 }
121
122 /*!
123 \obsolete
124
125 Constructs a new QScriptValue with the integer \a value and
126 registers it with the script \a engine.
127 */
128 QScriptValue::QScriptValue(QScriptEngine* engine, int value)
129 : d_ptr(new QScriptValuePrivate(engine, value))
130 {
131 }
132
133 /*!
134 \obsolete
135
136 Constructs a new QScriptValue with the unsigned integer \a value and
137 registers it with the script \a engine.
138 */
139 QScriptValue::QScriptValue(QScriptEngine* engine, uint value)
140 : d_ptr(new QScriptValuePrivate(engine, value))
141 {
142 }
143
144 /*!
145 \obsolete
146
147 Constructs a new QScriptValue with the qsreal \a value and
148 registers it with the script \a engine.
149 */
150 QScriptValue::QScriptValue(QScriptEngine* engine, qsreal value)
151 : d_ptr(new QScriptValuePrivate(engine, value))
152 {
153 }
154
155 /*!
156 \obsolete
157
158 Constructs a new QScriptValue with the string \a value and
159 registers it with the script \a engine.
160 */
161 QScriptValue::QScriptValue(QScriptEngine* engine, const QString& value)
162 : d_ptr(new QScriptValuePrivate(engine, value))
163 {
164 }
165
166 /*!
167 \obsolete
168
169 Constructs a new QScriptValue with the string \a value and
170 registers it with the script \a engine.
171 */
172 QScriptValue::QScriptValue(QScriptEngine* engine, const char* value)
173 : d_ptr(new QScriptValuePrivate(engine, QString::fromUtf8(value)))
174 {
175 }
176
177 /*!
178 \obsolete
179
180 Constructs a new QScriptValue with the special \a value and
181 registers it with the script \a engine.
182 */
183 QScriptValue::QScriptValue(QScriptEngine* engine, SpecialValue value)
184 : d_ptr(new QScriptValuePrivate(engine, value))
185 {
186 }
187
188 /*!
189 Constructs a new QScriptValue that is a copy of \a other.
190
191 Note that if \a other is an object (i.e., isObject() would return
192 true), then only a reference to the underlying object is copied into
193 the new script value (i.e., the object itself is not copied).
194 */
195 QScriptValue::QScriptValue(const QScriptValue& other)
196 : d_ptr(other.d_ptr)
197 {
198 }
199
200 /*!
201 Destroys this QScriptValue.
202 */
203 QScriptValue::~QScriptValue()
204 {
205 }
206
207 /*!
208 Returns true if this QScriptValue is valid; otherwise returns
209 false.
210 */
211 bool QScriptValue::isValid() const
212 {
213 return d_ptr->isValid();
214 }
215
216 /*!
217 Returns true if this QScriptValue is of the primitive type Boolean;
218 otherwise returns false.
219
220 \sa toBool()
221 */
222 bool QScriptValue::isBool() const
223 {
224 return d_ptr->isBool();
225 }
226
227 /*!
228 \obsolete
229
230 Use isBool() instead.
231 Returns true if this QScriptValue is of the primitive type Boolean;
232 otherwise returns false.
233 */
234 bool QScriptValue::isBoolean() const
235 {
236 return d_ptr->isBool();
237 }
238
239 /*!
240 Returns true if this QScriptValue is of the primitive type Number;
241 otherwise returns false.
242
243 \sa toNumber()
244 */
245 bool QScriptValue::isNumber() const
246 {
247 return d_ptr->isNumber();
248 }
249
250 /*!
251 Returns true if this QScriptValue is of the primitive type Null;
252 otherwise returns false.
253
254 \sa QScriptEngine::nullValue()
255 */
256 bool QScriptValue::isNull() const
257 {
258 return d_ptr->isNull();
259 }
260
261 /*!
262 Returns true if this QScriptValue is of the primitive type String;
263 otherwise returns false.
264
265 \sa toString()
266 */
267 bool QScriptValue::isString() const
268 {
269 return d_ptr->isString();
270 }
271
272 /*!
273 Returns true if this QScriptValue is of the primitive type Undefined;
274 otherwise returns false.
275
276 \sa QScriptEngine::undefinedValue()
277 */
278 bool QScriptValue::isUndefined() const
279 {
280 return d_ptr->isUndefined();
281 }
282
283 /*!
284 Returns true if this QScriptValue is an object of the Error class;
285 otherwise returns false.
286
287 \sa QScriptContext::throwError()
288 */
289 bool QScriptValue::isError() const
290 {
291 return d_ptr->isError();
292 }
293
294 /*!
295 Returns true if this QScriptValue is of the Object type; otherwise
296 returns false.
297
298 Note that function values, variant values, and QObject values are
299 objects, so this function returns true for such values.
300
301 \sa toObject(), QScriptEngine::newObject()
302 */
303 bool QScriptValue::isObject() const
304 {
305 return d_ptr->isObject();
306 }
307
308 /*!
309 Returns true if this QScriptValue is a function; otherwise returns
310 false.
311
312 \sa call()
313 */
314 bool QScriptValue::isFunction() const
315 {
316 return d_ptr->isFunction();
317 }
318
319 /*!
320 Returns the string value of this QScriptValue, as defined in
321 \l{ECMA-262} section 9.8, "ToString".
322
323 Note that if this QScriptValue is an object, calling this function
324 has side effects on the script engine, since the engine will call
325 the object's toString() function (and possibly valueOf()) in an
326 attempt to convert the object to a primitive value (possibly
327 resulting in an uncaught script exception).
328
329 \sa isString()
330 */
331 QString QScriptValue::toString() const
332 {
333 return d_ptr->toString();
334 }
335
336 /*!
337 Returns the number value of this QScriptValue, as defined in
338 \l{ECMA-262} section 9.3, "ToNumber".
339
340 Note that if this QScriptValue is an object, calling this function
341 has side effects on the script engine, since the engine will call
342 the object's valueOf() function (and possibly toString()) in an
343 attempt to convert the object to a primitive value (possibly
344 resulting in an uncaught script exception).
345
346 \sa isNumber(), toInteger(), toInt32(), toUInt32(), toUInt16()
347 */
348 qsreal QScriptValue::toNumber() const
349 {
350 return d_ptr->toNumber();
351 }
352
353 /*!
354 Returns the boolean value of this QScriptValue, using the conversion
355 rules described in \l{ECMA-262} section 9.2, "ToBoolean".
356
357 Note that if this QScriptValue is an object, calling this function
358 has side effects on the script engine, since the engine will call
359 the object's valueOf() function (and possibly toString()) in an
360 attempt to convert the object to a primitive value (possibly
361 resulting in an uncaught script exception).
362
363 \sa isBool()
364 */
365 bool QScriptValue::toBool() const
366 {
367 return d_ptr->toBool();
368 }
369
370 /*!
371 \obsolete
372
373 Use toBool() instead.
374 */
375 bool QScriptValue::toBoolean() const
376 {
377 return d_ptr->toBool();
378 }
379
380 /*!
381 Returns the integer value of this QScriptValue, using the conversion
382 rules described in \l{ECMA-262} section 9.4, "ToInteger".
383
384 Note that if this QScriptValue is an object, calling this function
385 has side effects on the script engine, since the engine will call
386 the object's valueOf() function (and possibly toString()) in an
387 attempt to convert the object to a primitive value (possibly
388 resulting in an uncaught script exception).
389
390 \sa toNumber()
391 */
392 qsreal QScriptValue::toInteger() const
393 {
394 return d_ptr->toInteger();
395 }
396
397 /*!
398 Returns the signed 32-bit integer value of this QScriptValue, using
399 the conversion rules described in \l{ECMA-262} section 9.5, "ToInt32".
400
401 Note that if this QScriptValue is an object, calling this function
402 has side effects on the script engine, since the engine will call
403 the object's valueOf() function (and possibly toString()) in an
404 attempt to convert the object to a primitive value (possibly
405 resulting in an uncaught script exception).
406
407 \sa toNumber(), toUInt32()
408 */
409 qint32 QScriptValue::toInt32() const
410 {
411 return d_ptr->toInt32();
412 }
413
414 /*!
415 Returns the unsigned 32-bit integer value of this QScriptValue, using
416 the conversion rules described in \l{ECMA-262} section 9.6, "ToUint32".
417
418 Note that if this QScriptValue is an object, calling this function
419 has side effects on the script engine, since the engine will call
420 the object's valueOf() function (and possibly toString()) in an
421 attempt to convert the object to a primitive value (possibly
422 resulting in an uncaught script exception).
423
424 \sa toNumber(), toInt32()
425 */
426 quint32 QScriptValue::toUInt32() const
427 {
428 return d_ptr->toUInt32();
429 }
430
431 /*!
432 Returns the unsigned 16-bit integer value of this QScriptValue, using
433 the conversion rules described in \l{ECMA-262} section 9.7, "ToUint16".
434
435 Note that if this QScriptValue is an object, calling this function
436 has side effects on the script engine, since the engine will call
437 the object's valueOf() function (and possibly toString()) in an
438 attempt to convert the object to a primitive value (possibly
439 resulting in an uncaught script exception).
440
441 \sa toNumber()
442 */
443 quint16 QScriptValue::toUInt16() const
444 {
445 return d_ptr->toUInt16();
446 }
447
448 /*!
449 Calls this QScriptValue as a function, using \a thisObject as
450 the `this' object in the function call, and passing \a args
451 as arguments to the function. Returns the value returned from
452 the function.
453
454 If this QScriptValue is not a function, call() does nothing
455 and returns an invalid QScriptValue.
456
457 Note that if \a thisObject is not an object, the global object
458 (see \l{QScriptEngine::globalObject()}) will be used as the
459 `this' object.
460
461 Calling call() can cause an exception to occur in the script engine;
462 in that case, call() returns the value that was thrown (typically an
463 \c{Error} object). You can call
464 QScriptEngine::hasUncaughtException() to determine if an exception
465 occurred.
466
467 \snippet doc/src/snippets/code/src_script_qscriptvalue.cpp 2
468
469 \sa construct()
470 */
471 QScriptValue QScriptValue::call(const QScriptValue& thisObject, const QScriptValueList& args)
472 {
473 return d_ptr->call(thisObject.d_ptr.data(), args);
474 }
475
476 /*!
477 Returns the QScriptEngine that created this QScriptValue,
478 or 0 if this QScriptValue is invalid or the value is not
479 associated with a particular engine.
480 */
481 QScriptEngine* QScriptValue::engine() const
482 {
483 QScriptEnginePrivate* engine = d_ptr->engine();
484 if (engine)
485 return QScriptEnginePrivate::get(engine);
486 return 0;
487 }
488
489 /*!
490 Assigns the \a other value to this QScriptValue.
491
492 Note that if \a other is an object (isObject() returns true),
493 only a reference to the underlying object will be assigned;
494 the object itself will not be copied.
495 */
496 QScriptValue& QScriptValue::operator=(const QScriptValue& other)
497 {
498 d_ptr = other.d_ptr;
499 return *this;
500 }
501
502 /*!
503 Returns true if this QScriptValue is equal to \a other, otherwise
504 returns false. The comparison follows the behavior described in
505 \l{ECMA-262} section 11.9.3, "The Abstract Equality Comparison
506 Algorithm".
507
508 This function can return true even if the type of this QScriptValue
509 is different from the type of the \a other value; i.e. the
510 comparison is not strict. For example, comparing the number 9 to
511 the string "9" returns true; comparing an undefined value to a null
512 value returns true; comparing a \c{Number} object whose primitive
513 value is 6 to a \c{String} object whose primitive value is "6"
514 returns true; and comparing the number 1 to the boolean value
515 \c{true} returns true. If you want to perform a comparison
516 without such implicit value conversion, use strictlyEquals().
517
518 Note that if this QScriptValue or the \a other value are objects,
519 calling this function has side effects on the script engine, since
520 the engine will call the object's valueOf() function (and possibly
521 toString()) in an attempt to convert the object to a primitive value
522 (possibly resulting in an uncaught script exception).
523
524 \sa strictlyEquals(), lessThan()
525 */
526 bool QScriptValue::equals(const QScriptValue& other) const
527 {
528 return d_ptr == other.d_ptr || d_ptr->equals(QScriptValuePrivate::get(other));
529 }
530
531 /*!
532 Returns true if this QScriptValue is equal to \a other using strict
533 comparison (no conversion), otherwise returns false. The comparison
534 follows the behavior described in \l{ECMA-262} section 11.9.6, "The
535 Strict Equality Comparison Algorithm".
536
537 If the type of this QScriptValue is different from the type of the
538 \a other value, this function returns false. If the types are equal,
539 the result depends on the type, as shown in the following table:
540
541 \table
542 \header \o Type \o Result
543 \row \o Undefined \o true
544 \row \o Null \o true
545 \row \o Boolean \o true if both values are true, false otherwise
546 \row \o Number \o false if either value is NaN (Not-a-Number); true if values are equal, false otherwise
547 \row \o String \o true if both values are exactly the same sequence of characters, false otherwise
548 \row \o Object \o true if both values refer to the same object, false otherwise
549 \endtable
550
551 \sa equals()
552 */
553 bool QScriptValue::strictlyEquals(const QScriptValue& other) const
554 {
555 return d_ptr == other.d_ptr || d_ptr->strictlyEquals(QScriptValuePrivate::get(other));
556 }