diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2012-12-04 13:40:18 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@digia.com> | 2012-12-08 04:47:53 +0100 |
commit | 5f22fbd7fc4ca6a7f4629cbd34e0fc2e3c1b1cee (patch) | |
tree | 31a606540d68674315fbc2c71c76592be2ae3dc8 /main.cpp | |
parent | 3b3f3bebcd24073455de9f4abf2f0c7712a1c1ee (diff) |
Add a MemoryManager, which does GC for the interpreter.
Todo:
- stack walking for MASM
- fix all TODOs/FIXMEs and hidden treasures (bugs).
Change-Id: I36f8cdc3a545df7287ce1df17b3570a9c017865e
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'main.cpp')
-rw-r--r-- | main.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -53,6 +53,7 @@ #include "qv4syntaxchecker_p.h" #include "qv4ecmaobjects_p.h" #include "qv4isel_p.h" +#include "qv4mm_moth.h" #include <QtCore> #include <private/qqmljsengine_p.h> @@ -144,12 +145,12 @@ int executeLLVMCode(void *codePtr) void (*code)(VM::ExecutionContext *) = (void (*)(VM::ExecutionContext *)) codePtr; QScopedPointer<QQmlJS::EvalISelFactory> iSelFactory(new QQmlJS::Moth::ISelFactory); - VM::ExecutionEngine vm(iSelFactory.data()); + VM::ExecutionEngine vm(0, iSelFactory.data()); VM::ExecutionContext *ctx = vm.rootContext; QQmlJS::VM::Object *globalObject = vm.globalObject.objectValue(); globalObject->__put__(ctx, vm.identifier(QStringLiteral("print")), - QQmlJS::VM::Value::fromObject(new builtins::Print(ctx))); + QQmlJS::VM::Value::fromObject(new (ctx->engine->memoryManager) builtins::Print(ctx))); void * buf = __qmljs_create_exception_handler(ctx); if (setjmp(*(jmp_buf *)buf)) { @@ -318,13 +319,17 @@ int main(int argc, char *argv[]) #endif // QMLJS_NO_LLVM case use_masm: case use_moth: { + QScopedPointer<QQmlJS::VM::MemoryManager> mm; QScopedPointer<QQmlJS::EvalISelFactory> iSelFactory; - if (mode == use_moth) + if (mode == use_moth) { + mm.reset(new QQmlJS::Moth::MemoryManager); iSelFactory.reset(new QQmlJS::Moth::ISelFactory); - else + } else { + mm.reset(new QQmlJS::VM::MemoryManagerWithoutGC); iSelFactory.reset(new QQmlJS::MASM::ISelFactory); + } - QQmlJS::VM::ExecutionEngine vm(iSelFactory.data()); + QQmlJS::VM::ExecutionEngine vm(mm.data(), iSelFactory.data()); QScopedPointer<QQmlJS::Debugging::Debugger> debugger; if (enableDebugging) @@ -335,12 +340,12 @@ int main(int argc, char *argv[]) QQmlJS::VM::Object *globalObject = vm.globalObject.objectValue(); globalObject->__put__(ctx, vm.identifier(QStringLiteral("print")), - QQmlJS::VM::Value::fromObject(new builtins::Print(ctx))); + QQmlJS::VM::Value::fromObject(new (ctx->engine->memoryManager) builtins::Print(ctx))); bool errorInTestHarness = false; if (!qgetenv("IN_TEST_HARNESS").isEmpty()) globalObject->__put__(ctx, vm.identifier(QStringLiteral("$ERROR")), - QQmlJS::VM::Value::fromObject(new builtins::TestHarnessError(ctx, errorInTestHarness))); + QQmlJS::VM::Value::fromObject(new (ctx->engine->memoryManager) builtins::TestHarnessError(ctx, errorInTestHarness))); foreach (const QString &fn, args) { QFile file(fn); @@ -354,7 +359,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - QQmlJS::IR::Function *f = QQmlJS::VM::EvalFunction::parseSource(ctx, fn, code, QQmlJS::Codegen::GlobalCode); + QScopedPointer<QQmlJS::IR::Function> f(QQmlJS::VM::EvalFunction::parseSource(ctx, fn, code, QQmlJS::Codegen::GlobalCode)); if (!f) continue; @@ -376,6 +381,8 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } } + + mm->dumpStats(); } return EXIT_SUCCESS; } } |