aboutsummaryrefslogtreecommitdiffstats
path: root/main.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2012-06-26 15:36:03 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2012-06-26 15:36:03 +0200
commita1eb099a4a7fda46cc1b5e0ecb34cbde27ebaf30 (patch)
tree39ea381888b87683e2578570d086c3913b796f1d /main.cpp
parent48a0b3c96b67ab2afd8c7f23c0afd946dabdca73 (diff)
Initial work on `eval'.
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/main.cpp b/main.cpp
index c9afd49914..6f337178a9 100644
--- a/main.cpp
+++ b/main.cpp
@@ -42,6 +42,9 @@ static inline bool protect(const void *addr, size_t size)
return mprotect(reinterpret_cast<void*>(roundAddr), size + (iaddr - roundAddr), mode) == 0;
}
+static void evaluate(QQmlJS::VM::Context *ctx, const QString &fileName, const QString &source,
+ QQmlJS::Codegen::Mode mode = QQmlJS::Codegen::GlobalCode);
+
namespace builtins {
using namespace QQmlJS::VM;
@@ -62,6 +65,17 @@ struct Print: FunctionObject
}
};
+struct Eval: FunctionObject
+{
+ Eval(Context *scope): FunctionObject(scope) {}
+
+ virtual void call(Context *ctx)
+ {
+ const QString code = ctx->argument(0).toString(ctx)->toQString();
+ evaluate(ctx, QStringLiteral("eval code"), code, QQmlJS::Codegen::EvalCode);
+ }
+};
+
} // builtins
#ifndef QMLJS_NO_LLVM
@@ -172,10 +186,12 @@ int evaluateCompiledCode(const QStringList &files)
#endif
-void evaluate(QQmlJS::VM::ExecutionEngine *vm, const QString &fileName, const QString &source)
+static void evaluate(QQmlJS::VM::Context *ctx, const QString &fileName, const QString &source,
+ QQmlJS::Codegen::Mode mode)
{
using namespace QQmlJS;
+ VM::ExecutionEngine *vm = ctx->engine;
IR::Module module;
IR::Function *globalCode = 0;
@@ -203,7 +219,7 @@ void evaluate(QQmlJS::VM::ExecutionEngine *vm, const QString &fileName, const QS
Program *program = AST::cast<Program *>(parser.rootNode());
Codegen cg;
- globalCode = cg(program, &module);
+ globalCode = cg(program, &module, mode);
if (useMoth) {
Moth::InstructionSelection isel(vm, &module, code);
@@ -223,8 +239,13 @@ void evaluate(QQmlJS::VM::ExecutionEngine *vm, const QString &fileName, const QS
return;
}
- VM::Context *ctx = vm->rootContext;
ctx->hasUncaughtException = false;
+ if (! ctx->activation.isObject())
+ __qmljs_init_object(&ctx->activation, new QQmlJS::VM::Object());
+
+ foreach (const QString *local, globalCode->locals) {
+ ctx->activation.objectValue->setProperty(ctx, *local, QQmlJS::VM::Value::undefinedValue());
+ }
if (useMoth) {
Moth::VME vme;
@@ -272,13 +293,16 @@ int main(int argc, char *argv[])
globalObject->setProperty(ctx, vm.identifier(QStringLiteral("print")),
QQmlJS::VM::Value::fromObject(new builtins::Print(ctx)));
+ globalObject->setProperty(ctx, vm.identifier(QStringLiteral("eval")),
+ QQmlJS::VM::Value::fromObject(new builtins::Eval(ctx)));
+
foreach (const QString &fn, args) {
QFile file(fn);
if (file.open(QFile::ReadOnly)) {
const QString code = QString::fromUtf8(file.readAll());
file.close();
- evaluate(&vm, fn, code);
+ evaluate(vm.rootContext, fn, code);
}
}
}