summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/qt/api
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-06-15 19:36:43 +0100
committerBen Murdoch <benm@google.com>2010-06-16 14:52:28 +0100
commit545e470e52f0ac6a3a072bf559c796b42c6066b6 (patch)
treec0c14763654d84d37577dde512c3d3b4699a9e86 /JavaScriptCore/qt/api
parent719298a66237d38ea5c05f1547123ad8aacbc237 (diff)
downloadexternal_webkit-545e470e52f0ac6a3a072bf559c796b42c6066b6.zip
external_webkit-545e470e52f0ac6a3a072bf559c796b42c6066b6.tar.gz
external_webkit-545e470e52f0ac6a3a072bf559c796b42c6066b6.tar.bz2
Merge webkit.org at r61121: Initial merge by git.
Change-Id: Icd6db395c62285be384d137164d95d7466c98760
Diffstat (limited to 'JavaScriptCore/qt/api')
-rw-r--r--JavaScriptCore/qt/api/qscriptengine.cpp13
-rw-r--r--JavaScriptCore/qt/api/qscriptengine.h1
-rw-r--r--JavaScriptCore/qt/api/qscriptengine_p.cpp9
-rw-r--r--JavaScriptCore/qt/api/qscriptengine_p.h6
-rw-r--r--JavaScriptCore/qt/api/qscriptprogram_p.h8
-rw-r--r--JavaScriptCore/qt/api/qscriptsyntaxcheckresult.cpp8
-rw-r--r--JavaScriptCore/qt/api/qscriptvalue.cpp18
-rw-r--r--JavaScriptCore/qt/api/qscriptvalue.h1
-rw-r--r--JavaScriptCore/qt/api/qscriptvalue_p.h185
9 files changed, 164 insertions, 85 deletions
diff --git a/JavaScriptCore/qt/api/qscriptengine.cpp b/JavaScriptCore/qt/api/qscriptengine.cpp
index dc08cd9..e1bdf77 100644
--- a/JavaScriptCore/qt/api/qscriptengine.cpp
+++ b/JavaScriptCore/qt/api/qscriptengine.cpp
@@ -193,6 +193,19 @@ QScriptValue QScriptEngine::undefinedValue()
}
/*!
+ Creates a QtScript object of class Object.
+
+ The prototype of the created object will be the Object
+ prototype object.
+
+ \sa newArray(), QScriptValue::setProperty()
+*/
+QScriptValue QScriptEngine::newObject()
+{
+ return QScriptValuePrivate::get(d_ptr->newObject());
+}
+
+/*!
Returns this engine's Global Object.
By default, the Global Object contains the built-in objects that are
diff --git a/JavaScriptCore/qt/api/qscriptengine.h b/JavaScriptCore/qt/api/qscriptengine.h
index e19ebda..653dffe 100644
--- a/JavaScriptCore/qt/api/qscriptengine.h
+++ b/JavaScriptCore/qt/api/qscriptengine.h
@@ -50,6 +50,7 @@ public:
QScriptValue nullValue();
QScriptValue undefinedValue();
+ QScriptValue newObject();
QScriptValue globalObject() const;
private:
friend class QScriptEnginePrivate;
diff --git a/JavaScriptCore/qt/api/qscriptengine_p.cpp b/JavaScriptCore/qt/api/qscriptengine_p.cpp
index 38185ab..a6cf4a4 100644
--- a/JavaScriptCore/qt/api/qscriptengine_p.cpp
+++ b/JavaScriptCore/qt/api/qscriptengine_p.cpp
@@ -74,11 +74,16 @@ QScriptValuePrivate* QScriptEnginePrivate::evaluate(const QScriptProgramPrivate*
{
if (program->isNull())
return new QScriptValuePrivate;
- return new QScriptValuePrivate(this, evaluate(program->program(), program->file(), program->line()));
+ return new QScriptValuePrivate(this, evaluate(*program, program->file(), program->line()));
+}
+
+QScriptValuePrivate* QScriptEnginePrivate::newObject() const
+{
+ return new QScriptValuePrivate(this, JSObjectMake(m_context, /* jsClass */ 0, /* userData */ 0));
}
QScriptValuePrivate* QScriptEnginePrivate::globalObject() const
{
- JSObjectRef globalObject = JSContextGetGlobalObject(context());
+ JSObjectRef globalObject = JSContextGetGlobalObject(m_context);
return new QScriptValuePrivate(this, globalObject, globalObject);
}
diff --git a/JavaScriptCore/qt/api/qscriptengine_p.h b/JavaScriptCore/qt/api/qscriptengine_p.h
index c6c64dd..9083f7d 100644
--- a/JavaScriptCore/qt/api/qscriptengine_p.h
+++ b/JavaScriptCore/qt/api/qscriptengine_p.h
@@ -56,11 +56,12 @@ public:
inline JSValueRef makeJSValue(bool number) const;
inline JSValueRef makeJSValue(QScriptValue::SpecialValue value) const;
+ QScriptValuePrivate* newObject() const;
QScriptValuePrivate* globalObject() const;
inline QScriptStringPrivate* toStringHandle(const QString& str) const;
- inline JSGlobalContextRef context() const;
+ inline operator JSGlobalContextRef() const;
private:
QScriptEngine* q_ptr;
JSGlobalContextRef m_context;
@@ -132,8 +133,9 @@ QScriptStringPrivate* QScriptEnginePrivate::toStringHandle(const QString& str) c
return new QScriptStringPrivate(str);
}
-JSGlobalContextRef QScriptEnginePrivate::context() const
+QScriptEnginePrivate::operator JSGlobalContextRef() const
{
+ Q_ASSERT(this);
return m_context;
}
diff --git a/JavaScriptCore/qt/api/qscriptprogram_p.h b/JavaScriptCore/qt/api/qscriptprogram_p.h
index 6e80e85..f6882c5 100644
--- a/JavaScriptCore/qt/api/qscriptprogram_p.h
+++ b/JavaScriptCore/qt/api/qscriptprogram_p.h
@@ -52,7 +52,7 @@ public:
inline bool operator==(const QScriptProgramPrivate& other) const;
inline bool operator!=(const QScriptProgramPrivate& other) const;
- inline JSStringRef program() const;
+ inline operator JSStringRef() const;
inline JSStringRef file() const;
inline int line() const;
private:
@@ -122,7 +122,11 @@ bool QScriptProgramPrivate::operator!=(const QScriptProgramPrivate& other) const
|| !JSStringIsEqual(m_program, other.m_program);
}
-JSStringRef QScriptProgramPrivate::program() const { return m_program; }
+QScriptProgramPrivate::operator JSStringRef() const
+{
+ return m_program;
+}
+
JSStringRef QScriptProgramPrivate::file() const {return m_fileName; }
int QScriptProgramPrivate::line() const { return m_line; }
diff --git a/JavaScriptCore/qt/api/qscriptsyntaxcheckresult.cpp b/JavaScriptCore/qt/api/qscriptsyntaxcheckresult.cpp
index 5cf02ef..3948c5d 100644
--- a/JavaScriptCore/qt/api/qscriptsyntaxcheckresult.cpp
+++ b/JavaScriptCore/qt/api/qscriptsyntaxcheckresult.cpp
@@ -119,7 +119,7 @@ QString QScriptSyntaxCheckResult::errorMessage() const
QScriptSyntaxCheckResultPrivate::~QScriptSyntaxCheckResultPrivate()
{
if (m_exception)
- JSValueUnprotect(m_engine->context(), m_exception);
+ JSValueUnprotect(*m_engine, m_exception);
}
QString QScriptSyntaxCheckResultPrivate::errorMessage() const
@@ -127,7 +127,7 @@ QString QScriptSyntaxCheckResultPrivate::errorMessage() const
if (!m_exception)
return QString();
- JSStringRef tmp = JSValueToStringCopy(m_engine->context(), m_exception, /* exception */ 0);
+ JSStringRef tmp = JSValueToStringCopy(*m_engine, m_exception, /* exception */ 0);
QString message = QScriptConverter::toString(tmp);
JSStringRelease(tmp);
return message;
@@ -139,10 +139,10 @@ int QScriptSyntaxCheckResultPrivate::errorLineNumber() const
return -1;
// m_exception is an instance of the Exception so it has "line" attribute.
JSStringRef lineAttrName = QScriptConverter::toString("line");
- JSValueRef line = JSObjectGetProperty(m_engine->context(),
+ JSValueRef line = JSObjectGetProperty(*m_engine,
m_exception,
lineAttrName,
/* exceptions */0);
JSStringRelease(lineAttrName);
- return JSValueToNumber(m_engine->context(), line, /* exceptions */0);
+ return JSValueToNumber(*m_engine, line, /* exceptions */0);
}
diff --git a/JavaScriptCore/qt/api/qscriptvalue.cpp b/JavaScriptCore/qt/api/qscriptvalue.cpp
index a53a2fe..22ff8be 100644
--- a/JavaScriptCore/qt/api/qscriptvalue.cpp
+++ b/JavaScriptCore/qt/api/qscriptvalue.cpp
@@ -556,7 +556,7 @@ QScriptValue& QScriptValue::operator=(const QScriptValue& other)
*/
bool QScriptValue::equals(const QScriptValue& other) const
{
- return d_ptr == other.d_ptr || d_ptr->equals(QScriptValuePrivate::get(other));
+ return d_ptr->equals(QScriptValuePrivate::get(other));
}
/*!
@@ -583,5 +583,19 @@ bool QScriptValue::equals(const QScriptValue& other) const
*/
bool QScriptValue::strictlyEquals(const QScriptValue& other) const
{
- return d_ptr == other.d_ptr || d_ptr->strictlyEquals(QScriptValuePrivate::get(other));
+ return d_ptr->strictlyEquals(QScriptValuePrivate::get(other));
+}
+
+/*!
+ Returns true if this QScriptValue is an instance of
+ \a other; otherwise returns false.
+
+ This QScriptValue is considered to be an instance of \a other if
+ \a other is a function and the value of the \c{prototype}
+ property of \a other is in the prototype chain of this
+ QScriptValue.
+*/
+bool QScriptValue::instanceOf(const QScriptValue& other) const
+{
+ return d_ptr->instanceOf(QScriptValuePrivate::get(other));
}
diff --git a/JavaScriptCore/qt/api/qscriptvalue.h b/JavaScriptCore/qt/api/qscriptvalue.h
index 182f311..6c42429 100644
--- a/JavaScriptCore/qt/api/qscriptvalue.h
+++ b/JavaScriptCore/qt/api/qscriptvalue.h
@@ -61,6 +61,7 @@ public:
QScriptValue& operator=(const QScriptValue& other);
bool equals(const QScriptValue& other) const;
bool strictlyEquals(const QScriptValue& other) const;
+ bool instanceOf(const QScriptValue& other) const;
QScriptEngine* engine() const;
diff --git a/JavaScriptCore/qt/api/qscriptvalue_p.h b/JavaScriptCore/qt/api/qscriptvalue_p.h
index 5959c03..1bb8a77 100644
--- a/JavaScriptCore/qt/api/qscriptvalue_p.h
+++ b/JavaScriptCore/qt/api/qscriptvalue_p.h
@@ -50,8 +50,8 @@ class QScriptValue;
value is kept in m_number
CBool -> QSVP is created from bool and no JSC engine has been associated yet. Current value is kept
in m_number
- CSpecial -> QSVP is Undefined or Null, but a JSC engine hasn't been associated yet, current value
- is kept in m_number (cast of QScriptValue::SpecialValue)
+ CNull -> QSVP is null, but a JSC engine hasn't been associated yet.
+ CUndefined -> QSVP is undefined, but a JSC engine hasn't been associated yet.
JSValue -> QSVP is associated with engine, but there is no information about real type, the state
have really short live cycle. Normally it is created as a function call result.
JSPrimitive -> QSVP is associated with engine, and it is sure that it isn't a JavaScript object.
@@ -59,6 +59,10 @@ class QScriptValue;
Each state keep all necessary information to invoke all methods, if not it should be changed to
a proper state. Changed state shouldn't be reverted.
+
+ The QScriptValuePrivate use the JSC C API directly. The QSVP type is equal to combination of
+ the JSValueRef and the JSObjectRef, and it could be automatically casted to these types by cast
+ operators.
*/
class QScriptValuePrivate : public QSharedData {
@@ -108,14 +112,15 @@ public:
inline QScriptValuePrivate* toObject();
inline bool equals(QScriptValuePrivate* other);
- inline bool strictlyEquals(const QScriptValuePrivate* other) const;
+ inline bool strictlyEquals(QScriptValuePrivate* other);
+ inline bool instanceOf(QScriptValuePrivate* other);
inline bool assignEngine(QScriptEnginePrivate* engine);
inline QScriptValuePrivate* call(const QScriptValuePrivate* , const QScriptValueList& args);
- inline JSGlobalContextRef context() const;
- inline JSValueRef value() const;
- inline JSObjectRef object() const;
+ inline operator JSValueRef() const;
+ inline operator JSObjectRef() const;
+
inline QScriptEnginePrivate* engine() const;
private:
@@ -125,7 +130,8 @@ private:
CString = 0x1000,
CNumber,
CBool,
- CSpecial,
+ CNull,
+ CUndefined,
JSValue = 0x2000, // JS values are equal or higher then this value.
JSPrimitive,
JSObject
@@ -161,7 +167,7 @@ QScriptValue QScriptValuePrivate::get(QScriptValuePrivate* d)
QScriptValuePrivate::~QScriptValuePrivate()
{
if (m_value)
- JSValueUnprotect(context(), m_value);
+ JSValueUnprotect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate()
@@ -206,8 +212,7 @@ QScriptValuePrivate::QScriptValuePrivate(qsreal number)
}
QScriptValuePrivate::QScriptValuePrivate(QScriptValue::SpecialValue value)
- : m_state(CSpecial)
- , m_number(value)
+ : m_state(value == QScriptValue::NullValue ? CNull : CUndefined)
, m_value(0)
{
}
@@ -218,7 +223,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, boo
, m_value(engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, int value)
@@ -227,7 +232,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, int
, m_value(m_engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, uint value)
@@ -236,7 +241,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, uin
, m_value(m_engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, qsreal value)
@@ -245,7 +250,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, qsr
, m_value(m_engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, const QString& value)
@@ -254,7 +259,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, con
, m_value(m_engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, QScriptValue::SpecialValue value)
@@ -263,7 +268,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, QSc
, m_value(m_engine->makeJSValue(value))
{
Q_ASSERT(engine);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSValueRef value)
@@ -273,7 +278,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSV
{
Q_ASSERT(engine);
Q_ASSERT(value);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSValueRef value, JSObjectRef object)
@@ -285,7 +290,7 @@ QScriptValuePrivate::QScriptValuePrivate(const QScriptEnginePrivate* engine, JSV
Q_ASSERT(engine);
Q_ASSERT(value);
Q_ASSERT(object);
- JSValueProtect(context(), m_value);
+ JSValueProtect(*m_engine, m_value);
}
bool QScriptValuePrivate::isValid() const { return m_state != Invalid; }
@@ -300,7 +305,7 @@ bool QScriptValuePrivate::isBool()
return false;
// Fall-through.
case JSPrimitive:
- return JSValueIsBoolean(context(), value());
+ return JSValueIsBoolean(*m_engine, *this);
default:
return false;
}
@@ -316,7 +321,7 @@ bool QScriptValuePrivate::isNumber()
return false;
// Fall-through.
case JSPrimitive:
- return JSValueIsNumber(context(), value());
+ return JSValueIsNumber(*m_engine, *this);
default:
return false;
}
@@ -325,14 +330,14 @@ bool QScriptValuePrivate::isNumber()
bool QScriptValuePrivate::isNull()
{
switch (m_state) {
- case CSpecial:
- return m_number == static_cast<int>(QScriptValue::NullValue);
+ case CNull:
+ return true;
case JSValue:
if (refinedJSValue() != JSPrimitive)
return false;
// Fall-through.
case JSPrimitive:
- return JSValueIsNull(context(), value());
+ return JSValueIsNull(*m_engine, *this);
default:
return false;
}
@@ -348,7 +353,7 @@ bool QScriptValuePrivate::isString()
return false;
// Fall-through.
case JSPrimitive:
- return JSValueIsString(context(), value());
+ return JSValueIsString(*m_engine, *this);
default:
return false;
}
@@ -357,14 +362,14 @@ bool QScriptValuePrivate::isString()
bool QScriptValuePrivate::isUndefined()
{
switch (m_state) {
- case CSpecial:
- return m_number == static_cast<int>(QScriptValue::UndefinedValue);
+ case CUndefined:
+ return true;
case JSValue:
if (refinedJSValue() != JSPrimitive)
return false;
// Fall-through.
case JSPrimitive:
- return JSValueIsUndefined(context(), value());
+ return JSValueIsUndefined(*m_engine, *this);
default:
return false;
}
@@ -405,7 +410,7 @@ bool QScriptValuePrivate::isFunction()
return false;
// Fall-through.
case JSObject:
- return JSObjectIsFunction(context(), object());
+ return JSObjectIsFunction(*m_engine, *this);
default:
return false;
}
@@ -422,12 +427,14 @@ QString QScriptValuePrivate::toString() const
return m_string;
case CNumber:
return QScriptConverter::toString(m_number);
- case CSpecial:
- return m_number == QScriptValue::NullValue ? QString::fromLatin1("null") : QString::fromLatin1("undefined");
+ case CNull:
+ return QString::fromLatin1("null");
+ case CUndefined:
+ return QString::fromLatin1("undefined");
case JSValue:
case JSPrimitive:
case JSObject:
- JSRetainPtr<JSStringRef> ptr(Adopt, JSValueToStringCopy(context(), value(), /* exception */ 0));
+ JSRetainPtr<JSStringRef> ptr(Adopt, JSValueToStringCopy(*m_engine, *this, /* exception */ 0));
return QScriptConverter::toString(ptr.get());
}
@@ -441,15 +448,16 @@ qsreal QScriptValuePrivate::toNumber() const
case JSValue:
case JSPrimitive:
case JSObject:
- return JSValueToNumber(context(), value(), /* exception */ 0);
+ return JSValueToNumber(*m_engine, *this, /* exception */ 0);
case CNumber:
return m_number;
case CBool:
return m_number ? 1 : 0;
+ case CNull:
case Invalid:
return 0;
- case CSpecial:
- return m_number == QScriptValue::NullValue ? 0 : qQNaN();
+ case CUndefined:
+ return qQNaN();
case CString:
bool ok;
qsreal result = m_string.toDouble(&ok);
@@ -472,7 +480,7 @@ bool QScriptValuePrivate::toBool() const
switch (m_state) {
case JSValue:
case JSPrimitive:
- return JSValueToBoolean(context(), value());
+ return JSValueToBoolean(*m_engine, *this);
case JSObject:
return true;
case CNumber:
@@ -480,7 +488,8 @@ bool QScriptValuePrivate::toBool() const
case CBool:
return m_number;
case Invalid:
- case CSpecial:
+ case CNull:
+ case CUndefined:
return false;
case CString:
return m_string.length();
@@ -536,26 +545,27 @@ QScriptValuePrivate* QScriptValuePrivate::toObject(QScriptEnginePrivate* engine)
{
switch (m_state) {
case Invalid:
- case CSpecial:
+ case CNull:
+ case CUndefined:
return new QScriptValuePrivate;
case CString:
{
// Exception can't occur here.
- JSObjectRef object = JSValueToObject(engine->context(), engine->makeJSValue(m_string), /* exception */ 0);
+ JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(m_string), /* exception */ 0);
Q_ASSERT(object);
return new QScriptValuePrivate(engine, object, object);
}
case CNumber:
{
// Exception can't occur here.
- JSObjectRef object = JSValueToObject(engine->context(), engine->makeJSValue(m_number), /* exception */ 0);
+ JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(m_number), /* exception */ 0);
Q_ASSERT(object);
return new QScriptValuePrivate(engine, object, object);
}
case CBool:
{
// Exception can't occure here.
- JSObjectRef object = JSValueToObject(engine->context(), engine->makeJSValue(static_cast<bool>(m_number)), /* exception */ 0);
+ JSObjectRef object = JSValueToObject(*engine, engine->makeJSValue(static_cast<bool>(m_number)), /* exception */ 0);
Q_ASSERT(object);
return new QScriptValuePrivate(engine, object, object);
}
@@ -567,7 +577,7 @@ QScriptValuePrivate* QScriptValuePrivate::toObject(QScriptEnginePrivate* engine)
{
if (engine != this->engine())
qWarning("QScriptEngine::toObject: cannot convert value created in a different engine");
- JSObjectRef object = JSValueToObject(context(), value(), /* exception */ 0);
+ JSObjectRef object = JSValueToObject(*m_engine, *this, /* exception */ 0);
if (object)
return new QScriptValuePrivate(m_engine.constData(), object);
}
@@ -597,47 +607,79 @@ QScriptValuePrivate* QScriptValuePrivate::toObject()
bool QScriptValuePrivate::equals(QScriptValuePrivate* other)
{
- if (!isValid() || !other->isValid())
+ if (!isValid())
+ return !other->isValid();
+
+ if (!other->isValid())
return false;
if ((m_state == other->m_state) && !isJSBased()) {
if (isNumberBased())
return m_number == other->m_number;
+ Q_ASSERT(isStringBased());
return m_string == other->m_string;
}
+ if (!isJSBased() && !other->isJSBased())
+ return false;
+
if (isJSBased() && !other->isJSBased()) {
if (!other->assignEngine(engine())) {
qWarning("equals(): Cannot compare to a value created in a different engine");
return false;
}
} else if (!isJSBased() && other->isJSBased()) {
- if (!other->assignEngine(other->engine())) {
+ if (!assignEngine(other->engine())) {
qWarning("equals(): Cannot compare to a value created in a different engine");
return false;
}
}
- return JSValueIsEqual(context(), value(), other->value(), /* exception */ 0);
+ return JSValueIsEqual(*m_engine, *this, *other, /* exception */ 0);
}
-bool QScriptValuePrivate::strictlyEquals(const QScriptValuePrivate* other) const
+bool QScriptValuePrivate::strictlyEquals(QScriptValuePrivate* other)
{
- if (m_state != other->m_state)
- return false;
if (isJSBased()) {
+ // We can't compare these two values without binding to the same engine.
+ if (!other->isJSBased()) {
+ if (other->assignEngine(engine()))
+ return JSValueIsStrictEqual(*m_engine, *this, *other);
+ return false;
+ }
if (other->engine() != engine()) {
qWarning("strictlyEquals(): Cannot compare to a value created in a different engine");
return false;
}
- return JSValueIsStrictEqual(context(), value(), other->value());
+ return JSValueIsStrictEqual(*m_engine, *this, *other);
}
- if (isStringBased())
- return m_string == other->m_string;
- if (isNumberBased())
- return m_number == other->m_number;
+ if (isStringBased()) {
+ if (other->isStringBased())
+ return m_string == other->m_string;
+ if (other->isJSBased()) {
+ assignEngine(other->engine());
+ return JSValueIsStrictEqual(*m_engine, *this, *other);
+ }
+ }
+ if (isNumberBased()) {
+ if (other->isNumberBased())
+ return m_number == other->m_number;
+ if (other->isJSBased()) {
+ assignEngine(other->engine());
+ return JSValueIsStrictEqual(*m_engine, *this, *other);
+ }
+ }
+ if (!isValid() && !other->isValid())
+ return true;
- return false; // Invalid state.
+ return false;
+}
+
+inline bool QScriptValuePrivate::instanceOf(QScriptValuePrivate* other)
+{
+ if (!isJSBased() || !other->isObject())
+ return false;
+ return JSValueIsInstanceOfConstructor(*m_engine, *this, *other, /* exception */ 0);
}
/*!
@@ -656,8 +698,11 @@ bool QScriptValuePrivate::assignEngine(QScriptEnginePrivate* engine)
case CNumber:
value = engine->makeJSValue(m_number);
break;
- case CSpecial:
- value = engine->makeJSValue(static_cast<QScriptValue::SpecialValue>(m_number));
+ case CNull:
+ value = engine->makeJSValue(QScriptValue::NullValue);
+ break;
+ case CUndefined:
+ value = engine->makeJSValue(QScriptValue::UndefinedValue);
break;
default:
if (!isJSBased())
@@ -691,12 +736,12 @@ QScriptValuePrivate* QScriptValuePrivate::call(const QScriptValuePrivate*, const
qWarning("QScriptValue::call() failed: cannot call function with values created in a different engine");
return new QScriptValuePrivate;
}
- argv[j] = value->value();
+ argv[j] = *value;
}
// Make the call
JSValueRef exception = 0;
- JSValueRef result = JSObjectCallAsFunction(context(), object(), /* thisObject */ 0, argc, argv.constData(), &exception);
+ JSValueRef result = JSObjectCallAsFunction(*m_engine, *this, /* thisObject */ 0, argc, argv.constData(), &exception);
if (!result && exception)
return new QScriptValuePrivate(engine(), exception);
if (result && !exception)
@@ -715,19 +760,13 @@ QScriptEnginePrivate* QScriptValuePrivate::engine() const
return m_engine.data();
}
-JSGlobalContextRef QScriptValuePrivate::context() const
-{
- Q_ASSERT(isJSBased());
- return m_engine->context();
-}
-
-JSValueRef QScriptValuePrivate::value() const
+QScriptValuePrivate::operator JSValueRef() const
{
Q_ASSERT(isJSBased());
return m_value;
}
-JSObjectRef QScriptValuePrivate::object() const
+QScriptValuePrivate::operator JSObjectRef() const
{
Q_ASSERT(m_state == JSObject);
return m_object;
@@ -736,9 +775,9 @@ JSObjectRef QScriptValuePrivate::object() const
void QScriptValuePrivate::setValue(JSValueRef value)
{
if (m_value)
- JSValueUnprotect(context(), m_value);
+ JSValueUnprotect(*m_engine, m_value);
if (value)
- JSValueProtect(context(), value);
+ JSValueProtect(*m_engine, value);
m_value = value;
}
@@ -750,11 +789,11 @@ void QScriptValuePrivate::setValue(JSValueRef value)
bool QScriptValuePrivate::inherits(const char* name)
{
Q_ASSERT(isJSBased());
- JSObjectRef globalObject = JSContextGetGlobalObject(context());
+ JSObjectRef globalObject = JSContextGetGlobalObject(*m_engine);
JSStringRef errorAttrName = QScriptConverter::toString(name);
- JSValueRef error = JSObjectGetProperty(context(), globalObject, errorAttrName, /* exception */ 0);
+ JSValueRef error = JSObjectGetProperty(*m_engine, globalObject, errorAttrName, /* exception */ 0);
JSStringRelease(errorAttrName);
- return JSValueIsInstanceOfConstructor(context(), value(), JSValueToObject(context(), error, /* exception */ 0), /* exception */ 0);
+ return JSValueIsInstanceOfConstructor(*m_engine, *this, JSValueToObject(*m_engine, error, /* exception */ 0), /* exception */ 0);
}
/*!
@@ -764,12 +803,12 @@ bool QScriptValuePrivate::inherits(const char* name)
QScriptValuePrivate::State QScriptValuePrivate::refinedJSValue()
{
Q_ASSERT(m_state == JSValue);
- if (!JSValueIsObject(context(), value())) {
+ if (!JSValueIsObject(*m_engine, *this)) {
m_state = JSPrimitive;
} else {
m_state = JSObject;
// We are sure that value is an JSObject, so we can const_cast safely without
- // calling JSC C API (JSValueToObject(context(), value(), /* exceptions */ 0)).
+ // calling JSC C API (JSValueToObject(*m_engine, *this, /* exceptions */ 0)).
m_object = const_cast<JSObjectRef>(m_value);
}
return m_state;
@@ -785,7 +824,7 @@ bool QScriptValuePrivate::isJSBased() const { return m_state >= JSValue; }
\internal
Returns true if current value of QSV is placed in m_number.
*/
-bool QScriptValuePrivate::isNumberBased() const { return !isJSBased() && !isStringBased() && m_state != Invalid; }
+bool QScriptValuePrivate::isNumberBased() const { return m_state == CNumber || m_state == CBool; }
/*!
\internal