aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8/qv8bindings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/v8/qv8bindings.cpp')
-rw-r--r--src/declarative/qml/v8/qv8bindings.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/declarative/qml/v8/qv8bindings.cpp b/src/declarative/qml/v8/qv8bindings.cpp
index 84ed892c09..b21ddf5d2e 100644
--- a/src/declarative/qml/v8/qv8bindings.cpp
+++ b/src/declarative/qml/v8/qv8bindings.cpp
@@ -167,18 +167,41 @@ QV8Bindings::QV8Bindings(const QString &program, int index, int line,
v8::HandleScope handle_scope;
v8::Context::Scope scope(engine->context());
- v8::Local<v8::Script> script = engine->qmlModeCompile(program, compiled->name, line);
- v8::Local<v8::Value> result = script->Run(engine->contextWrapper()->sharedContext());
+ v8::Local<v8::Script> script;
+ bool compileFailed = false;
+ {
+ v8::TryCatch try_catch;
+ script = engine->qmlModeCompile(program, compiled->name, line);
+ if (try_catch.HasCaught()) {
+ // The binding was not compiled. There are some exceptional cases which the
+ // expression rewriter does not rewrite properly (e.g., \r-terminated lines
+ // are not rewritten correctly but this bug is demed out-of-scope to fix for
+ // performance reasons; see QTBUG-24064).
+ compileFailed = true;
+ QDeclarativeError error;
+ error.setDescription(QString(QLatin1String("Exception occurred during compilation of binding at line: %1")).arg(line));
+ v8::Local<v8::Message> message = try_catch.Message();
+ if (!message.IsEmpty())
+ QDeclarativeExpressionPrivate::exceptionToError(message, error);
+ QDeclarativeEnginePrivate::get(engine->engine())->warning(error);
+ compiled->v8bindings[index] = qPersistentNew(v8::Array::New());
+ }
+ }
- if (result->IsArray())
- compiled->v8bindings[index] = qPersistentNew(v8::Local<v8::Array>::Cast(result));
+ if (!compileFailed) {
+ v8::Local<v8::Value> result = script->Run(engine->contextWrapper()->sharedContext());
+ if (result->IsArray()) {
+ compiled->v8bindings[index] = qPersistentNew(v8::Local<v8::Array>::Cast(result));
+ }
+ }
}
url = compiled->url;
functions = qPersistentNew(compiled->v8bindings[index]);
bindingsCount = functions->Length();
- bindings = new QV8Bindings::Binding[bindingsCount];
-
+ if (bindingsCount)
+ bindings = new QV8Bindings::Binding[bindingsCount];
+
setContext(context);
}
@@ -195,6 +218,9 @@ QDeclarativeAbstractBinding *QV8Bindings::configBinding(int index, QObject *targ
const QDeclarativePropertyData &p,
int line, int column)
{
+ if (bindingsCount <= index) // initialization failed.
+ return 0;
+
QV8Bindings::Binding *rv = bindings + index;
rv->line = line;