aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-05-21 21:31:45 +0200
committerLars Knoll <lars.knoll@digia.com>2013-05-21 23:04:25 +0200
commit3089c2c0fe681f2caec31326748ca9e03a7b32db (patch)
tree100dcbd40943b3f503c0264f947ec2df5d6c3d0e
parent9de9a3eca43db3a5d3c297e422293cd6ce2c7e18 (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.cpp26
-rw-r--r--src/qml/qml/v4/qv4v8_p.h2
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions.cpp5
-rw-r--r--src/qml/qml/v8/qv8qobjectwrapper.cpp4
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();