summaryrefslogtreecommitdiffstats
path: root/src/script
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2010-02-18 13:23:42 (GMT)
committerKent Hansen <kent.hansen@nokia.com>2010-02-18 16:36:12 (GMT)
commit8e0a364f7baed4bbc7ff711be2a15692a40c3e93 (patch)
tree52f03614aa7b33912ae283053703d7898f6ac971 /src/script
parentaf4ccb478650b7efd5de3d81439173cd31931bd2 (diff)
downloadQt-8e0a364f7baed4bbc7ff711be2a15692a40c3e93.zip
Qt-8e0a364f7baed4bbc7ff711be2a15692a40c3e93.tar.gz
Qt-8e0a364f7baed4bbc7ff711be2a15692a40c3e93.tar.bz2
Move property helper functions to QScriptEnginePrivate
More preparation for operating purely on JSC::JSValue internally. Reviewed-by: Jedrzej Nowacki
Diffstat (limited to 'src/script')
-rw-r--r--src/script/api/qscriptengine.cpp166
-rw-r--r--src/script/api/qscriptengine_p.h99
-rw-r--r--src/script/api/qscriptvalue.cpp211
-rw-r--r--src/script/api/qscriptvalue_p.h18
4 files changed, 288 insertions, 206 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 06233d9..a045bab 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -1577,6 +1577,172 @@ JSC::JSValue QScriptEnginePrivate::newVariant(const QVariant &value)
return obj;
}
+JSC::JSValue QScriptEnginePrivate::propertyHelper(JSC::ExecState *exec, JSC::JSValue value, const JSC::Identifier &id, int resolveMode)
+{
+ JSC::JSValue result;
+ if (!(resolveMode & QScriptValue::ResolvePrototype)) {
+ // Look in the object's own properties
+ JSC::JSObject *object = JSC::asObject(value);
+ JSC::PropertySlot slot(object);
+ if (object->getOwnPropertySlot(exec, id, slot))
+ result = slot.getValue(exec, id);
+ }
+ if (!result && (resolveMode & QScriptValue::ResolveScope)) {
+ // ### check if it's a function object and look in the scope chain
+ JSC::JSValue scope = property(exec, value, QString::fromLatin1("__qt_scope__"), QScriptValue::ResolveLocal);
+ if (isObject(scope))
+ result = property(exec, scope, id, resolveMode);
+ }
+ return result;
+}
+
+JSC::JSValue QScriptEnginePrivate::propertyHelper(JSC::ExecState *exec, JSC::JSValue value, quint32 index, int resolveMode)
+{
+ JSC::JSValue result;
+ if (!(resolveMode & QScriptValue::ResolvePrototype)) {
+ // Look in the object's own properties
+ JSC::JSObject *object = JSC::asObject(value);
+ JSC::PropertySlot slot(object);
+ if (object->getOwnPropertySlot(exec, index, slot))
+ result = slot.getValue(exec, index);
+ }
+ return result;
+}
+
+void QScriptEnginePrivate::setProperty(JSC::ExecState *exec, JSC::JSValue objectValue, const JSC::Identifier &id,
+ JSC::JSValue value, const QScriptValue::PropertyFlags &flags)
+{
+ JSC::JSObject *thisObject = JSC::asObject(objectValue);
+ JSC::JSValue setter = thisObject->lookupSetter(exec, id);
+ JSC::JSValue getter = thisObject->lookupGetter(exec, id);
+ if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
+ if (!value) {
+ // deleting getter/setter
+ if ((flags & QScriptValue::PropertyGetter) && (flags & QScriptValue::PropertySetter)) {
+ // deleting both: just delete the property
+ thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
+ } else if (flags & QScriptValue::PropertyGetter) {
+ // preserve setter, if there is one
+ thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
+ if (setter && setter.isObject())
+ thisObject->defineSetter(exec, id, JSC::asObject(setter));
+ } else { // flags & QScriptValue::PropertySetter
+ // preserve getter, if there is one
+ thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
+ if (getter && getter.isObject())
+ thisObject->defineGetter(exec, id, JSC::asObject(getter));
+ }
+ } else {
+ if (value.isObject()) { // ### should check if it has callData()
+ // defining getter/setter
+ if (id == exec->propertyNames().underscoreProto) {
+ qWarning("QScriptValue::setProperty() failed: "
+ "cannot set getter or setter of native property `__proto__'");
+ } else {
+ if (flags & QScriptValue::PropertyGetter)
+ thisObject->defineGetter(exec, id, JSC::asObject(value));
+ if (flags & QScriptValue::PropertySetter)
+ thisObject->defineSetter(exec, id, JSC::asObject(value));
+ }
+ } else {
+ qWarning("QScriptValue::setProperty(): getter/setter must be a function");
+ }
+ }
+ } else {
+ // setting the value
+ if (getter && getter.isObject() && !(setter && setter.isObject())) {
+ qWarning("QScriptValue::setProperty() failed: "
+ "property '%s' has a getter but no setter",
+ qPrintable(QString(id.ustring())));
+ return;
+ }
+ if (!value) {
+ // ### check if it's a getter/setter property
+ thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
+ } else if (flags != QScriptValue::KeepExistingFlags) {
+ if (thisObject->hasOwnProperty(exec, id))
+ thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false); // ### hmmm - can't we just update the attributes?
+ unsigned attribs = 0;
+ if (flags & QScriptValue::ReadOnly)
+ attribs |= JSC::ReadOnly;
+ if (flags & QScriptValue::SkipInEnumeration)
+ attribs |= JSC::DontEnum;
+ if (flags & QScriptValue::Undeletable)
+ attribs |= JSC::DontDelete;
+ attribs |= flags & QScriptValue::UserRange;
+ thisObject->putWithAttributes(exec, id, value, attribs);
+ } else {
+ JSC::PutPropertySlot slot;
+ thisObject->put(exec, id, value, slot);
+ }
+ }
+}
+
+void QScriptEnginePrivate::setProperty(JSC::ExecState *exec, JSC::JSValue objectValue, quint32 index,
+ JSC::JSValue value, const QScriptValue::PropertyFlags &flags)
+{
+ if (!value) {
+ JSC::asObject(objectValue)->deleteProperty(exec, index, /*checkDontDelete=*/false);
+ } else {
+ if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
+ // fall back to string-based setProperty(), since there is no
+ // JSC::JSObject::defineGetter(unsigned)
+ setProperty(exec, objectValue, JSC::Identifier::from(exec, index), value, flags);
+ } else {
+ if (flags != QScriptValue::KeepExistingFlags) {
+ // if (JSC::asObject(d->jscValue)->hasOwnProperty(exec, arrayIndex))
+ // JSC::asObject(d->jscValue)->deleteProperty(exec, arrayIndex);
+ unsigned attribs = 0;
+ if (flags & QScriptValue::ReadOnly)
+ attribs |= JSC::ReadOnly;
+ if (flags & QScriptValue::SkipInEnumeration)
+ attribs |= JSC::DontEnum;
+ if (flags & QScriptValue::Undeletable)
+ attribs |= JSC::DontDelete;
+ attribs |= flags & QScriptValue::UserRange;
+ JSC::asObject(objectValue)->putWithAttributes(exec, index, value, attribs);
+ } else {
+ JSC::asObject(objectValue)->put(exec, index, value);
+ }
+ }
+ }
+}
+
+QScriptValue::PropertyFlags QScriptEnginePrivate::propertyFlags(JSC::ExecState *exec, JSC::JSValue value, const JSC::Identifier &id,
+ const QScriptValue::ResolveFlags &mode)
+{
+ JSC::JSObject *object = JSC::asObject(value);
+ unsigned attribs = 0;
+ JSC::PropertyDescriptor descriptor;
+ if (object->getOwnPropertyDescriptor(exec, id, descriptor))
+ attribs = descriptor.attributes();
+ else if (!object->getPropertyAttributes(exec, id, attribs)) {
+ if ((mode & QScriptValue::ResolvePrototype) && object->prototype() && object->prototype().isObject()) {
+ JSC::JSValue proto = object->prototype();
+ return propertyFlags(exec, proto, id, mode);
+ }
+ return 0;
+ }
+ QScriptValue::PropertyFlags result = 0;
+ if (attribs & JSC::ReadOnly)
+ result |= QScriptValue::ReadOnly;
+ if (attribs & JSC::DontEnum)
+ result |= QScriptValue::SkipInEnumeration;
+ if (attribs & JSC::DontDelete)
+ result |= QScriptValue::Undeletable;
+ //We cannot rely on attribs JSC::Setter/Getter because they are not necesserly set by JSC (bug?)
+ if (attribs & JSC::Getter || !object->lookupGetter(exec, id).isUndefinedOrNull())
+ result |= QScriptValue::PropertyGetter;
+ if (attribs & JSC::Setter || !object->lookupSetter(exec, id).isUndefinedOrNull())
+ result |= QScriptValue::PropertySetter;
+#ifndef QT_NO_QOBJECT
+ if (attribs & QScript::QObjectMemberAttribute)
+ result |= QScriptValue::QObjectMember;
+#endif
+ result |= QScriptValue::PropertyFlag(attribs & QScriptValue::UserRange);
+ return result;
+}
+
#ifdef QT_NO_QOBJECT
QScriptEngine::QScriptEngine()
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index 5f079f4..4be9146 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -156,6 +156,24 @@ public:
static inline QDateTime toDateTime(JSC::ExecState *, JSC::JSValue);
+ static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id,
+ int resolveMode = QScriptValue::ResolvePrototype);
+ static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, const JSC::Identifier &id, int resolveMode);
+ static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, quint32 index,
+ int resolveMode = QScriptValue::ResolvePrototype);
+ static JSC::JSValue propertyHelper(JSC::ExecState*, JSC::JSValue, quint32, int resolveMode);
+ static inline JSC::JSValue property(JSC::ExecState*, JSC::JSValue, const QString &, int resolveMode);
+ static inline void setProperty(JSC::ExecState*, JSC::JSValue object, const QString &name, JSC::JSValue,
+ const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
+ static void setProperty(JSC::ExecState*, JSC::JSValue object, const JSC::Identifier &id, JSC::JSValue,
+ const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
+ static void setProperty(JSC::ExecState*, JSC::JSValue object, quint32 index, JSC::JSValue,
+ const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags);
+ static QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value,
+ const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode);
+ static inline QScriptValue::PropertyFlags propertyFlags(JSC::ExecState*, JSC::JSValue value,
+ const QString &name, const QScriptValue::ResolveFlags &mode);
+
static bool convert(const QScriptValue &value,
int type, void *ptr,
QScriptEnginePrivate *eng);
@@ -568,32 +586,83 @@ inline void QScriptValuePrivate::initFrom(const QString &value)
engine->registerScriptValue(this);
}
-inline QScriptValue QScriptValuePrivate::property(const QString &name, int resolveMode) const
+inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const QString &name, int resolveMode)
{
- JSC::ExecState *exec = engine->currentFrame;
- return property(JSC::Identifier(exec, name), resolveMode);
+ return property(exec, value, JSC::Identifier(exec, name), resolveMode);
}
-inline QScriptValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const
+inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, const JSC::Identifier &id, int resolveMode)
{
- Q_ASSERT(isObject());
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
+ Q_ASSERT(isObject(value));
+ JSC::JSObject *object = JSC::asObject(value);
JSC::PropertySlot slot(object);
if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, id, slot))
- return engine->scriptValueFromJSCValue(slot.getValue(exec, id));
- return propertyHelper(id, resolveMode);
+ return slot.getValue(exec, id);
+ return propertyHelper(exec, value, id, resolveMode);
}
-inline QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
+inline JSC::JSValue QScriptEnginePrivate::property(JSC::ExecState *exec, JSC::JSValue value, quint32 index, int resolveMode)
{
- Q_ASSERT(isObject());
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
+ Q_ASSERT(isObject(value));
+ JSC::JSObject *object = JSC::asObject(value);
JSC::PropertySlot slot(object);
if ((resolveMode & QScriptValue::ResolvePrototype) && object->getPropertySlot(exec, index, slot))
- return engine->scriptValueFromJSCValue(slot.getValue(exec, index));
- return propertyHelper(index, resolveMode);
+ return slot.getValue(exec, index);
+ return propertyHelper(exec, value, index, resolveMode);
+}
+
+inline QScriptValue::PropertyFlags QScriptEnginePrivate::propertyFlags(JSC::ExecState *exec, JSC::JSValue value,
+ const QString &name,
+ const QScriptValue::ResolveFlags &mode)
+{
+ return propertyFlags(exec, value, JSC::Identifier(exec, name), mode);
+}
+
+inline void QScriptEnginePrivate::setProperty(JSC::ExecState *exec, JSC::JSValue objectValue, const QString &name,
+ JSC::JSValue value, const QScriptValue::PropertyFlags &flags)
+{
+ setProperty(exec, objectValue, JSC::Identifier(exec, name), value, flags);
+}
+
+inline JSC::JSValue QScriptValuePrivate::property(const JSC::Identifier &id, int resolveMode) const
+{
+ return QScriptEnginePrivate::property(engine->currentFrame, jscValue, id, resolveMode);
+}
+
+inline JSC::JSValue QScriptValuePrivate::property(quint32 index, int resolveMode) const
+{
+ return QScriptEnginePrivate::property(engine->currentFrame, jscValue, index, resolveMode);
+}
+
+inline JSC::JSValue QScriptValuePrivate::property(const QString &name, int resolveMode) const
+{
+ JSC::ExecState *exec = engine->currentFrame;
+ return QScriptEnginePrivate::property(exec, jscValue, JSC::Identifier(exec, name), resolveMode);
+}
+
+inline QScriptValue::PropertyFlags QScriptValuePrivate::propertyFlags(
+ const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode) const
+{
+ return QScriptEnginePrivate::propertyFlags(engine->currentFrame, jscValue, id, mode);
+}
+
+inline void QScriptValuePrivate::setProperty(const JSC::Identifier &id, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags)
+{
+ QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, id, value, flags);
+}
+
+inline void QScriptValuePrivate::setProperty(quint32 index, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags)
+{
+ QScriptEnginePrivate::setProperty(engine->currentFrame, jscValue, index, value, flags);
+}
+
+inline void QScriptValuePrivate::setProperty(const QString &name, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags)
+{
+ JSC::ExecState *exec = engine->currentFrame;
+ QScriptEnginePrivate::setProperty(exec, jscValue, JSC::Identifier(exec, name), value, flags);
}
inline void* QScriptValuePrivate::operator new(size_t size, QScriptEnginePrivate *engine)
diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index 929f606..a7d9f79 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -176,152 +176,6 @@
QT_BEGIN_NAMESPACE
-QScriptValue QScriptValuePrivate::propertyHelper(const JSC::Identifier &id, int resolveMode) const
-{
- JSC::JSValue result;
- if (!(resolveMode & QScriptValue::ResolvePrototype)) {
- // Look in the object's own properties
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
- JSC::PropertySlot slot(object);
- if (object->getOwnPropertySlot(exec, id, slot))
- result = slot.getValue(exec, id);
- }
- if (!result && (resolveMode & QScriptValue::ResolveScope)) {
- // ### check if it's a function object and look in the scope chain
- QScriptValue scope = property(QString::fromLatin1("__qt_scope__"), QScriptValue::ResolveLocal);
- if (scope.isObject())
- result = engine->scriptValueToJSCValue(QScriptValuePrivate::get(scope)->property(id, resolveMode));
- }
- return engine->scriptValueFromJSCValue(result);
-}
-
-QScriptValue QScriptValuePrivate::propertyHelper(quint32 index, int resolveMode) const
-{
- JSC::JSValue result;
- if (!(resolveMode & QScriptValue::ResolvePrototype)) {
- // Look in the object's own properties
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
- JSC::PropertySlot slot(object);
- if (object->getOwnPropertySlot(exec, index, slot))
- result = slot.getValue(exec, index);
- }
- return engine->scriptValueFromJSCValue(result);
-}
-
-void QScriptValuePrivate::setProperty(const JSC::Identifier &id, const QScriptValue &value,
- const QScriptValue::PropertyFlags &flags)
-{
- QScriptEnginePrivate *valueEngine = QScriptValuePrivate::getEngine(value);
- if (valueEngine && (valueEngine != engine)) {
- qWarning("QScriptValue::setProperty(%s) failed: "
- "cannot set value created in a different engine",
- qPrintable(QString(id.ustring())));
- return;
- }
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSValue jsValue = engine->scriptValueToJSCValue(value);
- JSC::JSObject *thisObject = JSC::asObject(jscValue);
- JSC::JSValue setter = thisObject->lookupSetter(exec, id);
- JSC::JSValue getter = thisObject->lookupGetter(exec, id);
- if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
- if (!jsValue) {
- // deleting getter/setter
- if ((flags & QScriptValue::PropertyGetter) && (flags & QScriptValue::PropertySetter)) {
- // deleting both: just delete the property
- thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
- } else if (flags & QScriptValue::PropertyGetter) {
- // preserve setter, if there is one
- thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
- if (setter && setter.isObject())
- thisObject->defineSetter(exec, id, JSC::asObject(setter));
- } else { // flags & QScriptValue::PropertySetter
- // preserve getter, if there is one
- thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
- if (getter && getter.isObject())
- thisObject->defineGetter(exec, id, JSC::asObject(getter));
- }
- } else {
- if (jsValue.isObject()) { // ### should check if it has callData()
- // defining getter/setter
- if (id == exec->propertyNames().underscoreProto) {
- qWarning("QScriptValue::setProperty() failed: "
- "cannot set getter or setter of native property `__proto__'");
- } else {
- if (flags & QScriptValue::PropertyGetter)
- thisObject->defineGetter(exec, id, JSC::asObject(jsValue));
- if (flags & QScriptValue::PropertySetter)
- thisObject->defineSetter(exec, id, JSC::asObject(jsValue));
- }
- } else {
- qWarning("QScriptValue::setProperty(): getter/setter must be a function");
- }
- }
- } else {
- // setting the value
- if (getter && getter.isObject() && !(setter && setter.isObject())) {
- qWarning("QScriptValue::setProperty() failed: "
- "property '%s' has a getter but no setter",
- qPrintable(QString(id.ustring())));
- return;
- }
- if (!jsValue) {
- // ### check if it's a getter/setter property
- thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false);
- } else if (flags != QScriptValue::KeepExistingFlags) {
- if (thisObject->hasOwnProperty(exec, id))
- thisObject->deleteProperty(exec, id, /*checkDontDelete=*/false); // ### hmmm - can't we just update the attributes?
- unsigned attribs = 0;
- if (flags & QScriptValue::ReadOnly)
- attribs |= JSC::ReadOnly;
- if (flags & QScriptValue::SkipInEnumeration)
- attribs |= JSC::DontEnum;
- if (flags & QScriptValue::Undeletable)
- attribs |= JSC::DontDelete;
- attribs |= flags & QScriptValue::UserRange;
- thisObject->putWithAttributes(exec, id, jsValue, attribs);
- } else {
- JSC::PutPropertySlot slot;
- thisObject->put(exec, id, jsValue, slot);
- }
- }
-}
-
-QScriptValue::PropertyFlags QScriptValuePrivate::propertyFlags(const JSC::Identifier &id,
- const QScriptValue::ResolveFlags &mode) const
-{
- JSC::ExecState *exec = engine->currentFrame;
- JSC::JSObject *object = JSC::asObject(jscValue);
- unsigned attribs = 0;
- JSC::PropertyDescriptor descriptor;
- if (object->getOwnPropertyDescriptor(exec, id, descriptor))
- attribs = descriptor.attributes();
- else if (!object->getPropertyAttributes(exec, id, attribs)) {
- if ((mode & QScriptValue::ResolvePrototype) && object->prototype() && object->prototype().isObject()) {
- QScriptValue proto = engine->scriptValueFromJSCValue(object->prototype());
- return QScriptValuePrivate::get(proto)->propertyFlags(id, mode);
- }
- return 0;
- }
- QScriptValue::PropertyFlags result = 0;
- if (attribs & JSC::ReadOnly)
- result |= QScriptValue::ReadOnly;
- if (attribs & JSC::DontEnum)
- result |= QScriptValue::SkipInEnumeration;
- if (attribs & JSC::DontDelete)
- result |= QScriptValue::Undeletable;
- //We cannot rely on attribs JSC::Setter/Getter because they are not necesserly set by JSC (bug?)
- if (attribs & JSC::Getter || !object->lookupGetter(exec, id).isUndefinedOrNull())
- result |= QScriptValue::PropertyGetter;
- if (attribs & JSC::Setter || !object->lookupSetter(exec, id).isUndefinedOrNull())
- result |= QScriptValue::PropertySetter;
- if (attribs & QScript::QObjectMemberAttribute)
- result |= QScriptValue::QObjectMember;
- result |= QScriptValue::PropertyFlag(attribs & QScriptValue::UserRange);
- return result;
-}
-
QVariant &QScriptValuePrivate::variantValue() const
{
Q_ASSERT(jscValue.inherits(&QScriptObject::info));
@@ -732,7 +586,8 @@ QScriptValue QScriptValue::scope() const
if (!d || !d->isObject())
return QScriptValue();
// ### make hidden property
- return d->property(QLatin1String("__qt_scope__"), QScriptValue::ResolveLocal);
+ JSC::JSValue result = d->property(QLatin1String("__qt_scope__"), QScriptValue::ResolveLocal);
+ return d->engine->scriptValueFromJSCValue(result);
}
/*!
@@ -1433,9 +1288,9 @@ QRegExp QScriptValue::toRegExp() const
Q_D(const QScriptValue);
if (!isRegExp())
return QRegExp();
- QString pattern = d->property(QLatin1String("source"), QScriptValue::ResolvePrototype).toString();
+ QString pattern = property(QLatin1String("source"), QScriptValue::ResolvePrototype).toString();
Qt::CaseSensitivity kase = Qt::CaseSensitive;
- if (d->property(QLatin1String("ignoreCase"), QScriptValue::ResolvePrototype).toBool())
+ if (property(QLatin1String("ignoreCase"), QScriptValue::ResolvePrototype).toBool())
kase = Qt::CaseInsensitive;
return QRegExp(pattern, kase, QRegExp::RegExp2);
}
@@ -1514,8 +1369,15 @@ void QScriptValue::setProperty(const QString &name, const QScriptValue &value,
Q_D(QScriptValue);
if (!d || !d->isObject())
return;
- JSC::ExecState *exec = d->engine->currentFrame;
- d->setProperty(JSC::Identifier(exec, name), value, flags);
+ QScriptEnginePrivate *valueEngine = QScriptValuePrivate::getEngine(value);
+ if (valueEngine && (valueEngine != d->engine)) {
+ qWarning("QScriptValue::setProperty(%s) failed: "
+ "cannot set value created in a different engine",
+ qPrintable(name));
+ return;
+ }
+ JSC::JSValue jsValue = d->engine->scriptValueToJSCValue(value);
+ d->setProperty(name, jsValue, flags);
}
/*!
@@ -1539,7 +1401,7 @@ QScriptValue QScriptValue::property(const QString &name,
Q_D(const QScriptValue);
if (!d || !d->isObject())
return QScriptValue();
- return d->property(name, mode);
+ return d->engine->scriptValueFromJSCValue(d->property(name, mode));
}
/*!
@@ -1561,7 +1423,7 @@ QScriptValue QScriptValue::property(quint32 arrayIndex,
Q_D(const QScriptValue);
if (!d || !d->isObject())
return QScriptValue();
- return d->property(arrayIndex, mode);
+ return d->engine->scriptValueFromJSCValue(d->property(arrayIndex, mode));
}
/*!
@@ -1588,33 +1450,8 @@ void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value,
"cannot set value created in a different engine");
return;
}
- JSC::ExecState *exec = d->engine->currentFrame;
- JSC::JSValue jscValue = d->engine->scriptValueToJSCValue(value);
- if (!jscValue) {
- JSC::asObject(d->jscValue)->deleteProperty(exec, arrayIndex, /*checkDontDelete=*/false);
- } else {
- if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) {
- // fall back to string-based setProperty(), since there is no
- // JSC::JSObject::defineGetter(unsigned)
- d->setProperty(JSC::Identifier::from(exec, arrayIndex), value, flags);
- } else {
- if (flags != QScriptValue::KeepExistingFlags) {
-// if (JSC::asObject(d->jscValue)->hasOwnProperty(exec, arrayIndex))
-// JSC::asObject(d->jscValue)->deleteProperty(exec, arrayIndex);
- unsigned attribs = 0;
- if (flags & QScriptValue::ReadOnly)
- attribs |= JSC::ReadOnly;
- if (flags & QScriptValue::SkipInEnumeration)
- attribs |= JSC::DontEnum;
- if (flags & QScriptValue::Undeletable)
- attribs |= JSC::DontDelete;
- attribs |= flags & QScriptValue::UserRange;
- JSC::asObject(d->jscValue)->putWithAttributes(exec, arrayIndex, jscValue, attribs);
- } else {
- JSC::asObject(d->jscValue)->put(exec, arrayIndex, jscValue);
- }
- }
- }
+ JSC::JSValue jsValue = d->engine->scriptValueToJSCValue(value);
+ d->setProperty(arrayIndex, jsValue, flags);
}
/*!
@@ -1635,7 +1472,7 @@ QScriptValue QScriptValue::property(const QScriptString &name,
Q_D(const QScriptValue);
if (!d || !d->isObject() || !QScriptStringPrivate::isValid(name))
return QScriptValue();
- return d->property(name.d_ptr->identifier, mode);
+ return d->engine->scriptValueFromJSCValue(d->property(name.d_ptr->identifier, mode));
}
/*!
@@ -1658,7 +1495,15 @@ void QScriptValue::setProperty(const QScriptString &name,
Q_D(QScriptValue);
if (!d || !d->isObject() || !QScriptStringPrivate::isValid(name))
return;
- d->setProperty(name.d_ptr->identifier, value, flags);
+ QScriptEnginePrivate *valueEngine = QScriptValuePrivate::getEngine(value);
+ if (valueEngine && (valueEngine != d->engine)) {
+ qWarning("QScriptValue::setProperty(%s) failed: "
+ "cannot set value created in a different engine",
+ qPrintable(name.toString()));
+ return;
+ }
+ JSC::JSValue jsValue = d->engine->scriptValueToJSCValue(value);
+ d->setProperty(name.d_ptr->identifier, jsValue, flags);
}
/*!
@@ -2177,7 +2022,7 @@ QScriptValue QScriptValue::data() const
return d->engine->scriptValueFromJSCValue(scriptObject->data());
} else {
// ### make hidden property
- return d->property(QLatin1String("__qt_data__"), QScriptValue::ResolveLocal);
+ return property(QLatin1String("__qt_data__"), QScriptValue::ResolveLocal);
}
}
diff --git a/src/script/api/qscriptvalue_p.h b/src/script/api/qscriptvalue_p.h
index 76fbc18..dedc250 100644
--- a/src/script/api/qscriptvalue_p.h
+++ b/src/script/api/qscriptvalue_p.h
@@ -89,14 +89,16 @@ public:
return q.d_ptr->engine;
}
- inline QScriptValue property(const JSC::Identifier &id, int resolveMode) const;
- QScriptValue propertyHelper(const JSC::Identifier &id, int resolveMode) const;
- inline QScriptValue property(quint32 index, int resolveMode) const;
- QScriptValue propertyHelper(quint32, int resolveMode) const;
- inline QScriptValue property(const QString &, int resolveMode) const;
- void setProperty(const JSC::Identifier &id, const QScriptValue &value,
- const QScriptValue::PropertyFlags &flags);
- QScriptValue::PropertyFlags propertyFlags(
+ inline JSC::JSValue property(const JSC::Identifier &id, int resolveMode) const;
+ inline JSC::JSValue property(quint32 index, int resolveMode) const;
+ inline JSC::JSValue property(const QString &, int resolveMode) const;
+ inline void setProperty(const QString &name, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags);
+ inline void setProperty(const JSC::Identifier &id, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags);
+ inline void setProperty(quint32 index, const JSC::JSValue &value,
+ const QScriptValue::PropertyFlags &flags);
+ inline QScriptValue::PropertyFlags propertyFlags(
const JSC::Identifier &id, const QScriptValue::ResolveFlags &mode) const;
void detachFromEngine();