diff options
Diffstat (limited to 'src/declarative/qml/v8')
-rw-r--r-- | src/declarative/qml/v8/qv8bindings.cpp | 6 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8bindings_p.h | 2 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine.cpp | 24 | ||||
-rw-r--r-- | src/declarative/qml/v8/qv8engine_p.h | 3 |
4 files changed, 31 insertions, 4 deletions
diff --git a/src/declarative/qml/v8/qv8bindings.cpp b/src/declarative/qml/v8/qv8bindings.cpp index daadce442b..39203d35af 100644 --- a/src/declarative/qml/v8/qv8bindings.cpp +++ b/src/declarative/qml/v8/qv8bindings.cpp @@ -156,7 +156,7 @@ void QV8Bindings::Binding::destroy() parent->release(); } -QV8Bindings::QV8Bindings(const QString &program, int index, int line, +QV8Bindings::QV8Bindings(int index, int line, QDeclarativeCompiledData *compiled, QDeclarativeContextData *context) : bindingsCount(0), bindings(0) @@ -171,7 +171,8 @@ QV8Bindings::QV8Bindings(const QString &program, int index, int line, bool compileFailed = false; { v8::TryCatch try_catch; - script = engine->qmlModeCompile(program, compiled->name, line); + const QByteArray &program = compiled->programs.at(index); + script = engine->qmlModeCompile(program.constData(), program.length(), 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 @@ -192,6 +193,7 @@ QV8Bindings::QV8Bindings(const QString &program, int index, int line, v8::Local<v8::Value> result = script->Run(engine->contextWrapper()->sharedContext()); if (result->IsArray()) { compiled->v8bindings[index] = qPersistentNew(v8::Local<v8::Array>::Cast(result)); + compiled->programs[index].clear(); // We don't need the source anymore } } } diff --git a/src/declarative/qml/v8/qv8bindings_p.h b/src/declarative/qml/v8/qv8bindings_p.h index a98f6cb440..8eaf4ff290 100644 --- a/src/declarative/qml/v8/qv8bindings_p.h +++ b/src/declarative/qml/v8/qv8bindings_p.h @@ -68,7 +68,7 @@ class QV8Bindings : public QDeclarativeAbstractExpression, public QDeclarativeRefCount { public: - QV8Bindings(const QString &program, int index, int line, + QV8Bindings(int index, int line, QDeclarativeCompiledData *compiled, QDeclarativeContextData *context); virtual ~QV8Bindings(); diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 90137330b5..92cd336e1c 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -416,7 +416,9 @@ v8::Handle<v8::Value> QV8Engine::fromVariant(const QVariant &variant) } // A handle scope and context must be entered -v8::Local<v8::Script> QV8Engine::qmlModeCompile(const QString &source, const QString &fileName, int lineNumber) +v8::Local<v8::Script> QV8Engine::qmlModeCompile(const QString &source, + const QString &fileName, + int lineNumber) { v8::Local<v8::String> v8source = m_stringWrapper.toString(source); v8::Local<v8::String> v8fileName = m_stringWrapper.toString(fileName); @@ -429,6 +431,26 @@ v8::Local<v8::Script> QV8Engine::qmlModeCompile(const QString &source, const QSt return script; } +// A handle scope and context must be entered. +// source can be either ascii or utf8. +v8::Local<v8::Script> QV8Engine::qmlModeCompile(const char *source, int sourceLength, + const QString &fileName, + int lineNumber) +{ + if (sourceLength == -1) + sourceLength = strlen(source); + + v8::Local<v8::String> v8source = v8::String::New(source, sourceLength); + v8::Local<v8::String> v8fileName = m_stringWrapper.toString(fileName); + + v8::ScriptOrigin origin(v8fileName, v8::Integer::New(lineNumber - 1)); + + v8::Local<v8::Script> script = v8::Script::Compile(v8source, &origin, 0, v8::Handle<v8::String>(), + v8::Script::QmlMode); + + return script; +} + QNetworkAccessManager *QV8Engine::networkAccessManager() { return QDeclarativeEnginePrivate::get(m_engine)->getNetworkAccessManager(); diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index a39f673adc..4bfb991eae 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -330,6 +330,9 @@ public: v8::Local<v8::Script> qmlModeCompile(const QString &source, const QString &fileName = QString(), int lineNumber = 1); + v8::Local<v8::Script> qmlModeCompile(const char *source, int sourceLength = -1, + const QString &fileName = QString(), + int lineNumber = 1); // Return the QML global "scope" object for the \a ctxt context and \a scope object. inline v8::Local<v8::Object> qmlScope(QDeclarativeContextData *ctxt, QObject *scope); |