aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-05-23 22:56:38 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-05-24 12:39:34 +0200
commit1d62cefbaa23ef96fa4dc36d950cc2d9a2d4b5c3 (patch)
tree114eb77af818b37b05801498f9e4e3e4c482d7e1 /src/qml/qml
parentfa2d572d5d202b05ed1908ea1119a1995960ce1f (diff)
Add support for direct binding evaluation in QV4Script
This way there is no need to rewrite the binding expressions anymore, instead we can directly compile them into a binding function. Change-Id: I91a0c540d066976e363590fe9ccde6a81ee92b1d Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlbinding.cpp33
-rw-r--r--src/qml/qml/qqmlexpression.cpp86
-rw-r--r--src/qml/qml/qqmlexpression.h8
-rw-r--r--src/qml/qml/qqmlexpression_p.h5
-rw-r--r--src/qml/qml/qqmljavascriptexpression.cpp37
-rw-r--r--src/qml/qml/qqmljavascriptexpression_p.h5
-rw-r--r--src/qml/qml/v4/qv4script.cpp173
-rw-r--r--src/qml/qml/v4/qv4script_p.h10
8 files changed, 159 insertions, 198 deletions
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp
index b66f053b0f..936c63f35e 100644
--- a/src/qml/qml/qqmlbinding.cpp
+++ b/src/qml/qml/qqmlbinding.cpp
@@ -108,11 +108,8 @@ QQmlBinding::QQmlBinding(const QString &str, QObject *obj, QQmlContext *ctxt)
QQmlAbstractExpression::setContext(QQmlContextData::get(ctxt));
setScopeObject(obj);
- QQmlRewrite::RewriteBinding rewriteBinding;
- QString code = rewriteBinding(str);
-
m_expression = str.toUtf8();
- v4function = evalFunction(context(), obj, code, QString(), 0);
+ v4function = qmlBinding(context(), obj, str, QString(), 0);
}
QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlContext *ctxt)
@@ -146,11 +143,6 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
}
}
- if (needRewrite) {
- QQmlRewrite::RewriteBinding rewriteBinding;
- code = rewriteBinding(scriptPrivate->script);
- }
-
setNotifyOnValueChanged(true);
QQmlAbstractExpression::setContext(QQmlContextData::get(ctxt ? ctxt : scriptPrivate->context));
setScopeObject(obj ? obj : scriptPrivate->scope);
@@ -159,7 +151,10 @@ QQmlBinding::QQmlBinding(const QQmlScriptString &script, QObject *obj, QQmlConte
m_lineNumber = scriptPrivate->lineNumber;
m_columnNumber = scriptPrivate->columnNumber;
- v4function = evalFunction(context(), scopeObject(), code, QString(), m_lineNumber);
+ if (needRewrite)
+ v4function = qmlBinding(context(), scopeObject(), code, QString(), m_lineNumber);
+ else
+ v4function = evalFunction(context(), scopeObject(), code, QString(), m_lineNumber);
}
QQmlBinding::QQmlBinding(const QString &str, QObject *obj, QQmlContextData *ctxt)
@@ -170,11 +165,8 @@ QQmlBinding::QQmlBinding(const QString &str, QObject *obj, QQmlContextData *ctxt
QQmlAbstractExpression::setContext(ctxt);
setScopeObject(obj);
- QQmlRewrite::RewriteBinding rewriteBinding;
- QString code = rewriteBinding(str);
-
m_expression = str.toUtf8();
- v4function = evalFunction(ctxt, obj, code, QString(), 0);
+ v4function = qmlBinding(ctxt, obj, str, QString(), 0);
}
QQmlBinding::QQmlBinding(const QString &str, bool isRewritten, QObject *obj,
@@ -187,17 +179,12 @@ QQmlBinding::QQmlBinding(const QString &str, bool isRewritten, QObject *obj,
QQmlAbstractExpression::setContext(ctxt);
setScopeObject(obj);
- QString code;
- if (isRewritten) {
- code = str;
- } else {
- QQmlRewrite::RewriteBinding rewriteBinding;
- code = rewriteBinding(str);
- }
-
m_expression = str.toUtf8();
- v4function = evalFunction(ctxt, obj, code, url, m_lineNumber);
+ if (isRewritten)
+ v4function = evalFunction(ctxt, obj, str, url, m_lineNumber);
+ else
+ v4function = qmlBinding(ctxt, obj, str, url, m_lineNumber);
}
/*!
diff --git a/src/qml/qml/qqmlexpression.cpp b/src/qml/qml/qqmlexpression.cpp
index 32dbbb0e6c..419ea86ad9 100644
--- a/src/qml/qml/qqmlexpression.cpp
+++ b/src/qml/qml/qqmlexpression.cpp
@@ -96,42 +96,6 @@ void QQmlExpressionPrivate::init(QQmlContextData *ctxt, const QString &expr,
setScopeObject(me);
}
-void QQmlExpressionPrivate::init(QQmlContextData *ctxt, const QByteArray &expr,
- bool isRewritten, QObject *me, const QString &srcUrl,
- quint16 lineNumber, quint16 columnNumber)
-{
- url = srcUrl;
- line = lineNumber;
- column = columnNumber;
-
- if (isRewritten) {
- expressionFunctionValid = true;
- expressionFunctionRewritten = true;
- v8function = evalFunction(ctxt, me, expr.constData(), expr.length(),
- srcUrl, lineNumber, &v8qmlscope);
- setUseSharedContext(false);
-
- expressionUtf8 = expr;
- } else {
- expression = QString::fromUtf8(expr);
-
- expressionFunctionValid = false;
- expressionFunctionRewritten = isRewritten;
- }
-
- QQmlAbstractExpression::setContext(ctxt);
- setScopeObject(me);
-}
-
-QQmlExpression *
-QQmlExpressionPrivate::create(QQmlContextData *ctxt, QObject *object,
- const QString &expr, bool isRewritten,
- const QString &url, quint16 lineNumber, quint16 columnNumber)
-{
- return new QQmlExpression(ctxt, object, expr, isRewritten, url, lineNumber, columnNumber,
- *new QQmlExpressionPrivate);
-}
-
/*!
\class QQmlExpression
\since 5.0
@@ -174,29 +138,6 @@ QQmlExpression::QQmlExpression()
{
}
-/*! \internal */
-QQmlExpression::QQmlExpression(QQmlContextData *ctxt,
- QObject *object, const QString &expr, bool isRewritten,
- const QString &url, int lineNumber, int columnNumber,
- QQmlExpressionPrivate &dd)
-: QObject(dd, 0)
-{
- Q_D(QQmlExpression);
- d->init(ctxt, expr, isRewritten, object, url, qmlSourceCoordinate(lineNumber), qmlSourceCoordinate(columnNumber));
-}
-
-/*! \internal */
-QQmlExpression::QQmlExpression(QQmlContextData *ctxt,
- QObject *object, const QByteArray &expr,
- bool isRewritten,
- const QString &url, int lineNumber, int columnNumber,
- QQmlExpressionPrivate &dd)
-: QObject(dd, 0)
-{
- Q_D(QQmlExpression);
- d->init(ctxt, expr, isRewritten, object, url, qmlSourceCoordinate(lineNumber), qmlSourceCoordinate(columnNumber));
-}
-
/*!
Create a QQmlExpression object that is a child of \a parent.
@@ -271,15 +212,6 @@ QQmlExpression::QQmlExpression(QQmlContextData *ctxt, QObject *scope,
d->init(ctxt, expression, scope);
}
-/*! \internal */
-QQmlExpression::QQmlExpression(QQmlContextData *ctxt, QObject *scope,
- const QString &expression, QQmlExpressionPrivate &dd)
-: QObject(dd, 0)
-{
- Q_D(QQmlExpression);
- d->init(ctxt, expression, scope);
-}
-
/*!
Destroy the QQmlExpression instance.
*/
@@ -314,11 +246,7 @@ QQmlContext *QQmlExpression::context() const
QString QQmlExpression::expression() const
{
Q_D(const QQmlExpression);
- if (!d->expressionUtf8.isEmpty()) {
- return QString::fromUtf8(d->expressionUtf8);
- } else {
- return d->expression;
- }
+ return d->expression;
}
/*!
@@ -330,7 +258,6 @@ void QQmlExpression::setExpression(const QString &expression)
d->resetNotifyOnValueChanged();
d->expression = expression;
- d->expressionUtf8.clear();
d->expressionFunctionValid = false;
d->expressionFunctionRewritten = false;
}
@@ -339,17 +266,10 @@ void QQmlExpression::setExpression(const QString &expression)
v8::Handle<v8::Value> QQmlExpressionPrivate::v8value(bool *isUndefined)
{
if (!expressionFunctionValid) {
- bool ok = true;
-
- QQmlRewrite::RewriteBinding rewriteBinding;
- rewriteBinding.setName(name);
- QString code;
if (expressionFunctionRewritten)
- code = expression;
+ v8function = evalFunction(context(), scopeObject(), expression, url, line, &v8qmlscope);
else
- code = rewriteBinding(expression, &ok);
-
- if (ok) v8function = evalFunction(context(), scopeObject(), code, url, line, &v8qmlscope);
+ v8function = qmlBinding(context(), scopeObject(), expression, url, line, &v8qmlscope);
setUseSharedContext(false);
expressionFunctionValid = true;
}
diff --git a/src/qml/qml/qqmlexpression.h b/src/qml/qml/qqmlexpression.h
index b04abc1b98..b702a37ee0 100644
--- a/src/qml/qml/qqmlexpression.h
+++ b/src/qml/qml/qqmlexpression.h
@@ -91,14 +91,6 @@ public:
Q_SIGNALS:
void valueChanged();
-protected:
- QQmlExpression(QQmlContextData *, QObject *, const QString &,
- QQmlExpressionPrivate &dd);
- QQmlExpression(QQmlContextData *, QObject *, const QString &, bool,
- const QString &, int, int, QQmlExpressionPrivate &dd);
- QQmlExpression(QQmlContextData *, QObject *, const QByteArray &, bool,
- const QString &, int, int, QQmlExpressionPrivate &dd);
-
private:
QQmlExpression(QQmlContextData *, QObject *, const QString &);
diff --git a/src/qml/qml/qqmlexpression_p.h b/src/qml/qml/qqmlexpression_p.h
index 4577878290..0c407a2367 100644
--- a/src/qml/qml/qqmlexpression_p.h
+++ b/src/qml/qml/qqmlexpression_p.h
@@ -80,7 +80,6 @@ public:
void init(QQmlContextData *, const QString &, QObject *);
void init(QQmlContextData *, const QString &, bool, QObject *, const QString &, quint16, quint16);
- void init(QQmlContextData *, const QByteArray &, bool, QObject *, const QString &, quint16, quint16);
QVariant value(bool *isUndefined = 0);
@@ -91,9 +90,6 @@ public:
void _q_notify();
- static QQmlExpression *create(QQmlContextData *, QObject *, const QString &, bool,
- const QString &, quint16, quint16);
-
bool expressionFunctionValid:1;
bool expressionFunctionRewritten:1;
@@ -103,7 +99,6 @@ public:
virtual void expressionChanged();
QString expression;
- QByteArray expressionUtf8;
QV4::PersistentValue v8qmlscope;
QV4::PersistentValue v8function;
diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp
index b64035b66d..0e733cb1d2 100644
--- a/src/qml/qml/qqmljavascriptexpression.cpp
+++ b/src/qml/qml/qqmljavascriptexpression.cpp
@@ -306,7 +306,6 @@ void QQmlJavaScriptExpression::exceptionToError(const QV4::Exception &e, QQmlErr
error.setDescription(e.value().toQString());
}
-// Callee owns the persistent handle
QV4::PersistentValue
QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scope,
const char *code, int codeLength,
@@ -316,7 +315,6 @@ QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scope,
return evalFunction(ctxt, scope, QString::fromUtf8(code, codeLength), filename, line, qmlscope);
}
-// Callee owns the persistent handle
QV4::PersistentValue
QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scope,
const QString &code, const QString &filename, quint16 line,
@@ -352,6 +350,41 @@ QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scope,
return result;
}
+QV4::PersistentValue QQmlJavaScriptExpression::qmlBinding(QQmlContextData *ctxt, QObject *scope,
+ const QString &code, const QString &filename, quint16 line,
+ QV4::PersistentValue *qmlscope)
+{
+ QQmlEngine *engine = ctxt->engine;
+ QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine);
+
+ QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine());
+ QV4::ExecutionContext *ctx = v4->current;
+
+ QV4::Value scopeObject = ep->v8engine()->qmlScope(ctxt, scope)->v4Value();
+ QV4::Script script(v4, scopeObject.asObject(), code, filename, line);
+ QV4::Value result;
+ try {
+ script.parse();
+ result = script.qmlBinding();
+ } catch (QV4::Exception &e) {
+ e.accept(ctx);
+ QQmlError error;
+ QQmlExpressionPrivate::exceptionToError(e, error);
+ if (error.description().isEmpty())
+ error.setDescription(QLatin1String("Exception occurred during function evaluation"));
+ if (error.line() == -1)
+ error.setLine(line);
+ if (error.url().isEmpty())
+ error.setUrl(QUrl::fromLocalFile(filename));
+ ep->warning(error);
+ return QV4::PersistentValue();
+ }
+ if (qmlscope)
+ *qmlscope = scopeObject;
+ return result;
+}
+
+
void QQmlJavaScriptExpression::clearGuards()
{
while (Guard *g = activeGuards.takeFirst())
diff --git a/src/qml/qml/qqmljavascriptexpression_p.h b/src/qml/qml/qqmljavascriptexpression_p.h
index d7db55d4f6..caf1266415 100644
--- a/src/qml/qml/qqmljavascriptexpression_p.h
+++ b/src/qml/qml/qqmljavascriptexpression_p.h
@@ -155,6 +155,11 @@ public:
const char *code, int codeLength,
const QString &filename, quint16 line,
QV4::PersistentValue *qmlscope = 0);
+ // doesn't require rewriting the expression
+ static QV4::PersistentValue qmlBinding(QQmlContextData *ctxt, QObject *scope,
+ const QString &code,
+ const QString &filename, quint16 line,
+ QV4::PersistentValue *qmlscope = 0);
protected:
~QQmlJavaScriptExpression();
diff --git a/src/qml/qml/v4/qv4script.cpp b/src/qml/qml/v4/qv4script.cpp
index fa63ed33cb..610e80246e 100644
--- a/src/qml/qml/v4/qv4script.cpp
+++ b/src/qml/qml/v4/qv4script.cpp
@@ -58,119 +58,140 @@
using namespace QV4;
-struct FunctionWrapper : FunctionObject
+struct QmlBindingWrapper : FunctionObject
{
- FunctionWrapper(ExecutionContext *scope, Function *f)
+ QmlBindingWrapper(ExecutionContext *scope, Function *f, Object *qml)
: FunctionObject(scope, scope->engine->id_eval)
+ , qml(qml)
{
+ vtbl = &static_vtbl;
function = f;
usesArgumentsObject = function->usesArgumentsObject;
needsActivation = function->needsActivation();
defineReadonlyProperty(scope->engine->id_length, Value::fromInt32(1));
}
+
+ static Value call(Managed *that, ExecutionContext *, const Value &, Value *, int);
+
+protected:
+ static const ManagedVTable static_vtbl;
+
+private:
+ Object *qml;
};
+DEFINE_MANAGED_VTABLE(QmlBindingWrapper);
+
+Value QmlBindingWrapper::call(Managed *that, ExecutionContext *ctx, const Value &, Value *, int)
+{
+ ExecutionEngine *engine = ctx->engine;
+ QmlBindingWrapper *This = static_cast<QmlBindingWrapper *>(that);
+
+ ExecutionContext *qmlScope = engine->newQmlContext(This, This->qml);
+
+ Value result = This->function->code(qmlScope, This->function->codeData);
+
+ engine->popContext();
+
+ return result;
+
+}
+
void Script::parse()
{
using namespace QQmlJS;
+ parsed = true;
+
ExecutionEngine *v4 = scope->engine;
MemoryManager::GCBlocker gcBlocker(v4->memoryManager);
V4IR::Module module;
- Function *globalCode = 0;
- {
- QQmlJS::Engine ee, *engine = &ee;
- Lexer lexer(engine);
- lexer.setCode(sourceCode, 1, false);
- Parser parser(engine);
-
- const bool parsed = parser.parseProgram();
-
- DiagnosticMessage *error = 0, **errIt = &error;
- foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) {
- if (m.isError()) {
- *errIt = new DiagnosticMessage;
- (*errIt)->fileName = sourceFile;
- (*errIt)->offset = m.loc.offset;
- (*errIt)->length = m.loc.length;
- (*errIt)->startLine = m.loc.startLine;
- (*errIt)->startColumn = m.loc.startColumn;
- (*errIt)->type = DiagnosticMessage::Error;
- (*errIt)->message = m.message;
- errIt = &(*errIt)->next;
- } else {
- qWarning() << sourceFile << ':' << m.loc.startLine << ':' << m.loc.startColumn
- << ": warning: " << m.message;
- }
+ QQmlJS::Engine ee, *engine = &ee;
+ Lexer lexer(engine);
+ lexer.setCode(sourceCode, line, false);
+ Parser parser(engine);
+
+ const bool parsed = parser.parseProgram();
+
+ DiagnosticMessage *error = 0, **errIt = &error;
+ foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) {
+ if (m.isError()) {
+ *errIt = new DiagnosticMessage;
+ (*errIt)->fileName = sourceFile;
+ (*errIt)->offset = m.loc.offset;
+ (*errIt)->length = m.loc.length;
+ (*errIt)->startLine = m.loc.startLine;
+ (*errIt)->startColumn = m.loc.startColumn;
+ (*errIt)->type = DiagnosticMessage::Error;
+ (*errIt)->message = m.message;
+ errIt = &(*errIt)->next;
+ } else {
+ qWarning() << sourceFile << ':' << m.loc.startLine << ':' << m.loc.startColumn
+ << ": warning: " << m.message;
}
- if (error)
- scope->throwSyntaxError(error);
-
- if (parsed) {
- using namespace AST;
- Program *program = AST::cast<Program *>(parser.rootNode());
- if (!program) {
- // if parsing was successful, and we have no program, then
- // we're done...:
- functionWrapper = Value::nullValue();
- return;
- }
-
- QStringList inheritedLocals;
- if (inheritContext)
- for (String * const *i = scope->variables(), * const *ei = i + scope->variableCount(); i < ei; ++i)
- inheritedLocals.append(*i ? (*i)->toQString() : QString());
-
- Codegen cg(scope, strictMode);
- V4IR::Function *globalIRCode = cg(sourceFile, sourceCode, program, &module, QQmlJS::Codegen::EvalCode, inheritedLocals);
- QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(v4, &module));
- if (inheritContext)
- isel->setUseFastLookups(false);
- if (globalIRCode)
- globalCode = isel->vmFunction(globalIRCode);
+ }
+ if (error)
+ scope->throwSyntaxError(error);
+
+ if (parsed) {
+ using namespace AST;
+ Program *program = AST::cast<Program *>(parser.rootNode());
+ if (!program) {
+ // if parsing was successful, and we have no program, then
+ // we're done...:
+ return;
}
+
+ QStringList inheritedLocals;
+ if (inheritContext)
+ for (String * const *i = scope->variables(), * const *ei = i + scope->variableCount(); i < ei; ++i)
+ inheritedLocals.append(*i ? (*i)->toQString() : QString());
+
+ Codegen cg(scope, strictMode);
+ V4IR::Function *globalIRCode = cg(sourceFile, sourceCode, program, &module, QQmlJS::Codegen::EvalCode, inheritedLocals);
+ QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(v4, &module));
+ if (inheritContext)
+ isel->setUseFastLookups(false);
+ if (globalIRCode)
+ vmFunction = isel->vmFunction(globalIRCode);
}
- if (!globalCode)
+
+ if (!vmFunction)
// ### FIX file/line number
__qmljs_throw(v4->current, QV4::Value::fromObject(v4->newSyntaxErrorObject(v4->current, 0)), -1);
-
- functionWrapper = Value::fromObject(new (v4->memoryManager) FunctionWrapper(scope, globalCode));
}
Value Script::run()
{
- if (functionWrapper.value().isNull())
- return Value::undefinedValue();
-
- if (functionWrapper.isEmpty())
+ if (!parsed)
parse();
+ if (!vmFunction)
+ return Value::undefinedValue();
QV4::ExecutionEngine *engine = scope->engine;
- QV4::FunctionObject *f = functionWrapper.value().asFunctionObject();
if (engine->debugger)
engine->debugger->aboutToCall(0, scope);
if (!qml) {
- QV4::Function *function = this->function();
- TemporaryAssignment<Function*> savedGlobalCode(engine->globalCode, function);
+ TemporaryAssignment<Function*> savedGlobalCode(engine->globalCode, vmFunction);
bool strict = scope->strictMode;
Lookup *lookups = scope->lookups;
- scope->strictMode = function->isStrict;
- scope->lookups = function->lookups;
+ scope->strictMode = vmFunction->isStrict;
+ scope->lookups = vmFunction->lookups;
if (engine->debugger)
engine->debugger->aboutToCall(0, scope);
QV4::Value result;
try {
- result = function->code(scope, function->codeData);
+ result = vmFunction->code(scope, vmFunction->codeData);
} catch (Exception &e) {
scope->strictMode = strict;
scope->lookups = lookups;
@@ -182,20 +203,24 @@ Value Script::run()
return result;
} else {
- ExecutionContext *ctx = engine->newQmlContext(f, qml);
-
- Value result = f->function->code(ctx, f->function->codeData);
-
- engine->popContext();
-
- return result;
+ FunctionObject *f = new (engine->memoryManager) QmlBindingWrapper(scope, vmFunction, qml);
+ return f->call(Value::undefinedValue(), 0, 0);
}
}
Function *Script::function()
{
- FunctionObject *f = functionWrapper.value().asFunctionObject();
- return f ? f->function : 0;
+ if (!parsed)
+ parse();
+ return vmFunction;
+}
+
+Value Script::qmlBinding()
+{
+ if (!parsed)
+ parse();
+ QV4::ExecutionEngine *v4 = scope->engine;
+ return Value::fromObject(new (v4->memoryManager) QmlBindingWrapper(scope, vmFunction, qml));
}
QV4::Value Script::evaluate(ExecutionEngine *engine, const QString &script, Object *scopeObject)
diff --git a/src/qml/qml/v4/qv4script_p.h b/src/qml/qml/v4/qv4script_p.h
index 17b98c213d..b9d27a6be5 100644
--- a/src/qml/qml/v4/qv4script_p.h
+++ b/src/qml/qml/v4/qv4script_p.h
@@ -53,10 +53,10 @@ struct ExecutionContext;
struct Q_QML_EXPORT Script {
Script(ExecutionContext *scope, const QString &sourceCode, const QString &source = QString(), int line = 0, int column = 0)
: sourceFile(source), line(line), column(column), sourceCode(sourceCode)
- , scope(scope), strictMode(false), inheritContext(false), qml(0) {}
+ , scope(scope), strictMode(false), inheritContext(false), parsed(false), qml(0) {}
Script(ExecutionEngine *engine, Object *qml, const QString &sourceCode, const QString &source = QString(), int line = 0, int column = 0)
: sourceFile(source), line(line), column(column), sourceCode(sourceCode)
- , scope(engine->rootContext), strictMode(true), inheritContext(true), qml(qml) {}
+ , scope(engine->rootContext), strictMode(true), inheritContext(true), parsed(false), qml(qml) {}
QString sourceFile;
int line;
int column;
@@ -64,13 +64,17 @@ struct Q_QML_EXPORT Script {
ExecutionContext *scope;
bool strictMode;
bool inheritContext;
+ bool parsed;
Object *qml;
- PersistentValue functionWrapper;
+ Function *vmFunction;
void parse();
Value run();
+ Value qmlBinding();
+
Function *function();
+
static Value evaluate(ExecutionEngine *engine, const QString &script, Object *scopeObject);
};