diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-05-21 21:31:45 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2013-05-21 23:04:25 +0200 |
commit | 3089c2c0fe681f2caec31326748ca9e03a7b32db (patch) | |
tree | 100dcbd40943b3f503c0264f947ec2df5d6c3d0e | |
parent | 9de9a3eca43db3a5d3c297e422293cd6ce2c7e18 (diff) |
Fix running through all tst_qqmlecmascript tests
* Implement SetHiddenField/GetHiddenField (hack)
* Fix recursive calls to SetEngine, to allow for the re-use of
the QQmlEngine member in tst_qqmlecmascript after ~QQmlEngine
was called on another instance
* Fix array sizing in function call parameter handling
* Don't try to clone the function object in Qt.binding (assert instead)
Change-Id: Ia3155dea8518348ec329037ca04e5c38e47a4f92
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r-- | src/qml/qml/v4/qv4v8.cpp | 26 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4v8_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions.cpp | 5 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8qobjectwrapper.cpp | 4 |
4 files changed, 26 insertions, 11 deletions
diff --git a/src/qml/qml/v4/qv4v8.cpp b/src/qml/qml/v4/qv4v8.cpp index 6804fac6f3..e7ca797899 100644 --- a/src/qml/qml/v4/qv4v8.cpp +++ b/src/qml/qml/v4/qv4v8.cpp @@ -875,14 +875,24 @@ int Object::GetIdentityHash() bool Object::SetHiddenValue(Handle<String> key, Handle<Value> value) { - Q_UNIMPLEMENTED(); - Q_UNREACHABLE(); + QV4::Object *o = ConstValuePtr(this)->asObject(); + assert(o); + QString newKey = QStringLiteral("__hidden:"); + newKey += key->asQString(); + QV4::String* str = o->engine()->newString(newKey); + if (o->__hasProperty__(str)) + return false; + o->put(str, value->v4Value()); + return true; } Handle<Value> Object::GetHiddenValue(Handle<String> key) { - Q_UNIMPLEMENTED(); - Q_UNREACHABLE(); + QV4::Object *o = ConstValuePtr(this)->asObject(); + assert(o); + QString newKey = QStringLiteral("__hidden:"); + newKey += key->asQString(); + return o->get(o->engine()->newString(newKey)); } Handle<Object> Object::Clone() @@ -1706,20 +1716,22 @@ Isolate::~Isolate() ExecutionEngine *Isolate::GetEngine() { - return Isolate::GetCurrent()->m_engine; + return Isolate::GetCurrent()->m_engines.top(); } void Isolate::SetEngine(ExecutionEngine *e) { Isolate *i = GetCurrent(); - i->m_engine = e; + if (e) + i->m_engines.push(e); + else + i->m_engines.pop(); } Isolate *Isolate::GetCurrent() { if (!currentIsolate.hasLocalData()) { Isolate *i = new Isolate; - i->m_engine = 0; currentIsolate.setLocalData(i); } return currentIsolate.localData(); diff --git a/src/qml/qml/v4/qv4v8_p.h b/src/qml/qml/v4/qv4v8_p.h index a4e311553e..11662b97f7 100644 --- a/src/qml/qml/v4/qv4v8_p.h +++ b/src/qml/qml/v4/qv4v8_p.h @@ -1746,7 +1746,7 @@ class V8EXPORT Isolate { private: friend class Context; - QV4::ExecutionEngine *m_engine; + QStack<QV4::ExecutionEngine*> m_engines; }; diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index 02b291b148..c69ea9a8e1 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -1626,8 +1626,9 @@ QV4::Value binding(const v8::Arguments &args) if (!args[0]->IsFunction()) V4THROW_TYPE("binding(): argument (binding expression) must be a function"); - v8::Handle<v8::Object> rv = args[0]->ToObject()->Clone(); - rv->SetHiddenValue(v8::Value::fromV4Value(V8ENGINE()->bindingFlagKey()), QV4::Value::fromBoolean(true)); + v8::Handle<v8::Object> rv = args[0]->ToObject(); + if (!rv->SetHiddenValue(v8::Value::fromV4Value(V8ENGINE()->bindingFlagKey()), QV4::Value::fromBoolean(true))) + V4THROW_ERROR("function passed to binding() can only be bound once"); // FIXME: With v8 we cloned the binding argument return rv->v4Value(); } diff --git a/src/qml/qml/v8/qv8qobjectwrapper.cpp b/src/qml/qml/v8/qv8qobjectwrapper.cpp index 5e0a79a49d..93f7c9cb65 100644 --- a/src/qml/qml/v8/qv8qobjectwrapper.cpp +++ b/src/qml/qml/v8/qv8qobjectwrapper.cpp @@ -2245,9 +2245,11 @@ QV4::Value CallArgument::toValue(QV8Engine *engine) // directly against QList<QObject*>? QList<QObject *> &list = *qlistPtr; QV4::ArrayObject *array = QV8Engine::getV4(engine)->newArrayObject(); - array->setArrayLength(list.count()); + array->arrayReserve(list.count()); for (int ii = 0; ii < list.count(); ++ii) array->arrayData[ii].value = engine->newQObject(list.at(ii)); + array->arrayDataLen = list.count(); + array->setArrayLengthUnchecked(list.count()); return QV4::Value::fromObject(array); } else if (type == qMetaTypeId<QQmlV4Handle>()) { return handlePtr->toValue(); |