aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml/v8')
-rw-r--r--src/declarative/qml/v8/qv8bindings.cpp6
-rw-r--r--src/declarative/qml/v8/qv8bindings_p.h2
-rw-r--r--src/declarative/qml/v8/qv8engine.cpp24
-rw-r--r--src/declarative/qml/v8/qv8engine_p.h3
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);