aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/qdeclarativecomponent.cpp44
-rw-r--r--src/declarative/qml/qdeclarativeincubator.cpp18
-rw-r--r--src/declarative/qml/qdeclarativeincubator_p.h2
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp2
4 files changed, 46 insertions, 20 deletions
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 2f1ad82138..0bcfd5a28e 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -944,6 +944,8 @@ public:
static void StatusChangedSetter(v8::Local<v8::String>, v8::Local<v8::Value> value,
const v8::AccessorInfo& info);
+ void dispose();
+
v8::Persistent<v8::Object> me;
QDeclarativeGuard<QObject> parent;
v8::Persistent<v8::Value> valuemap;
@@ -1098,35 +1100,31 @@ void QDeclarativeComponent::incubateObject(QDeclarativeV8Function *args)
if (args->Length() >= 3) {
quint32 v = (*args)[2]->Uint32Value();
- if (v == QDeclarativeIncubator::Asynchronous)
+ if (v == 0)
mode = QDeclarativeIncubator::Asynchronous;
- else if (v == QDeclarativeIncubator::AsynchronousIfNested)
+ else if (v == 1)
mode = QDeclarativeIncubator::AsynchronousIfNested;
- else if (v == QDeclarativeIncubator::Synchronous)
- mode = QDeclarativeIncubator::Synchronous;
}
QDeclarativeComponentExtension *e = componentExtension(args->engine());
QV8IncubatorResource *r = new QV8IncubatorResource(args->engine(), mode);
+ v8::Local<v8::Object> o = e->incubationConstructor->NewInstance();
+ o->SetExternalResource(r);
+
if (!valuemap.IsEmpty()) {
r->valuemap = qPersistentNew(valuemap);
r->qmlGlobal = qPersistentNew(args->qmlGlobal());
}
r->parent = parent;
+ r->me = qPersistentNew(o);
create(*r, creationContext());
if (r->status() == QDeclarativeIncubator::Null) {
- delete r;
+ r->dispose();
args->returnValue(v8::Null());
} else {
- v8::Local<v8::Object> o = e->incubationConstructor->NewInstance();
- o->SetExternalResource(r);
-
- if (r->status() == QDeclarativeIncubator::Loading)
- r->me = qPersistentNew(o);
-
args->returnValue(o);
}
}
@@ -1275,6 +1273,14 @@ void QV8IncubatorResource::setInitialState(QObject *o)
qPersistentDispose(qmlGlobal);
}
}
+
+void QV8IncubatorResource::dispose()
+{
+ qPersistentDispose(valuemap);
+ qPersistentDispose(qmlGlobal);
+ // No further status changes are forthcoming, so we no long need a self reference
+ qPersistentDispose(me);
+}
void QV8IncubatorResource::statusChanged(Status s)
{
@@ -1293,18 +1299,20 @@ void QV8IncubatorResource::statusChanged(Status s)
v8::Context::Scope context_scope(engine->context());
v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(callback);
v8::Handle<v8::Value> args[] = { v8::Integer::NewFromUnsigned(s) };
- // XXX TryCatch
+ v8::TryCatch tc;
f->Call(me, 1, args);
+ if (tc.HasCaught()) {
+ QDeclarativeError error;
+ QDeclarativeExpressionPrivate::exceptionToError(tc.Message(), error);
+ QDeclarativeEnginePrivate::warning(QDeclarativeEnginePrivate::get(engine->engine()),
+ error);
+ }
}
}
}
- if (s == Ready || s == Error) {
- qPersistentDispose(valuemap);
- qPersistentDispose(qmlGlobal);
- // No further status changes are forthcoming, so we no long need a self reference
- qPersistentDispose(me);
- }
+ if (s == Ready || s == Error)
+ dispose();
}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativeincubator.cpp b/src/declarative/qml/qdeclarativeincubator.cpp
index a468dc5d57..053a026882 100644
--- a/src/declarative/qml/qdeclarativeincubator.cpp
+++ b/src/declarative/qml/qdeclarativeincubator.cpp
@@ -131,6 +131,7 @@ void QDeclarativeIncubatorPrivate::clear()
Q_ASSERT(component);
QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(component->engine);
component->release();
+ component = 0;
enginePriv->incubatorCount--;
QDeclarativeIncubationController *controller = enginePriv->incubationController;
@@ -143,7 +144,6 @@ void QDeclarativeIncubatorPrivate::clear()
nextWaitingFor.remove();
waitingOnMe = 0;
}
-
}
/*!
@@ -454,6 +454,22 @@ Ready state, the created object is \b not deleted.
*/
void QDeclarativeIncubator::clear()
{
+ Status s = status();
+
+ if (s == Loading)
+ qFatal("QDeclarativeIncubator::clear(): Clear not implemented for loading incubator");
+
+ if (s == Null)
+ return;
+
+ Q_ASSERT(d->component == 0);
+ Q_ASSERT(d->waitingOnMe == 0);
+ Q_ASSERT(d->waitingFor.isEmpty());
+ Q_ASSERT(!d->nextWaitingFor.isInList());
+
+ d->errors.clear();
+ d->progress = QDeclarativeIncubatorPrivate::Execute;
+ d->result = 0;
}
/*!
diff --git a/src/declarative/qml/qdeclarativeincubator_p.h b/src/declarative/qml/qdeclarativeincubator_p.h
index 8210f6d3f6..57c54d3a07 100644
--- a/src/declarative/qml/qdeclarativeincubator_p.h
+++ b/src/declarative/qml/qdeclarativeincubator_p.h
@@ -63,7 +63,6 @@ class QDeclarativeCompiledData;
class QDeclarativeIncubator;
class QDeclarativeIncubatorPrivate : public QDeclarativeEnginePrivate::Incubator
{
- QIntrusiveListNode nextWaitingFor;
public:
QDeclarativeIncubatorPrivate(QDeclarativeIncubator *q, QDeclarativeIncubator::IncubationMode m);
~QDeclarativeIncubatorPrivate();
@@ -83,6 +82,7 @@ public:
typedef QDeclarativeIncubatorPrivate QIP;
QIP *waitingOnMe;
+ QIntrusiveListNode nextWaitingFor;
QIntrusiveList<QIP, &QIP::nextWaitingFor> waitingFor;
void clear();
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp
index 4bbea93c00..21084802e0 100644
--- a/src/declarative/qml/v8/qv8engine.cpp
+++ b/src/declarative/qml/v8/qv8engine.cpp
@@ -502,6 +502,8 @@ void QV8Engine::initializeGlobal(v8::Handle<v8::Object> global)
qt->Set(v8::String::New(enumerator.key(jj)), v8::Integer::New(enumerator.value(jj)));
}
}
+ qt->Set(v8::String::New("Asynchronous"), v8::Integer::New(0));
+ qt->Set(v8::String::New("Synchronous"), v8::Integer::New(1));
qt->Set(v8::String::New("include"), V8FUNCTION(QV8Include::include, this));
qt->Set(v8::String::New("isQtObject"), V8FUNCTION(isQtObject, this));