Make CodeGen usable without a context.

When running with the LLVM backend, there is no VM context.

Change-Id: Ib4e95a3c3b92f20118269da1a9430a9278beb349
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Erik Verbruggen 2013-01-16 13:36:14 +01:00 committed by Lars Knoll
parent 1387a9abb3
commit 43a43352fe
3 changed files with 57 additions and 5 deletions

View File

@ -54,6 +54,7 @@
#include "qv4ecmaobjects_p.h"
#include "qv4isel_p.h"
#include "qv4mm.h"
#include "qmljs_environment.h"
#include <QtCore>
#include <private/qqmljsengine_p.h>
@ -189,8 +190,10 @@ int compile(const QString &fileName, const QString &source, QQmlJS::LLVMOutputTy
const bool parsed = parser.parseProgram();
foreach (const DiagnosticMessage &m, parser.diagnosticMessages()) {
std::cerr << qPrintable(fileName) << ':' << m.loc.startLine << ':' << m.loc.startColumn
<< ": error: " << qPrintable(m.message) << std::endl;
std::cerr << qPrintable(fileName) << ':'
<< m.loc.startLine << ':'
<< m.loc.startColumn << ": error: "
<< qPrintable(m.message) << std::endl;
}
if (!parsed)
@ -199,7 +202,20 @@ int compile(const QString &fileName, const QString &source, QQmlJS::LLVMOutputTy
using namespace AST;
Program *program = AST::cast<Program *>(parser.rootNode());
Codegen cg(0);
class MyErrorHandler: public ErrorHandler {
public:
virtual void syntaxError(QQmlJS::VM::DiagnosticMessage *message) {
for (; message; message = message->next) {
std::cerr << qPrintable(message->fileName) << ':'
<< message->startLine << ':'
<< message->startColumn << ": "
<< (message->type == QQmlJS::VM::DiagnosticMessage::Error ? "error" : "warning") << ": "
<< qPrintable(message->message) << std::endl;
}
}
} errorHandler;
Codegen cg(&errorHandler, false);
// FIXME: if the program is empty, we should we generate an empty %entry, or give an error?
/*IR::Function *globalCode =*/ cg(fileName, program, &module);

View File

@ -204,7 +204,7 @@ public:
{
Environment *e = _cg->newEnvironment(node, _env);
if (!e->isStrict)
e->isStrict = _cg->_context->strictMode;
e->isStrict = _cg->_strictMode;
_envStack.append(e);
_env = e;
}
@ -413,7 +413,28 @@ Codegen::Codegen(VM::ExecutionContext *context)
, _labelledStatement(0)
, _tryCleanup(0)
, _context(context)
, _strictMode(context->strictMode)
, _debugger(context->engine->debugger)
, _errorHandler(0)
{
}
Codegen::Codegen(ErrorHandler *errorHandler, bool strictMode)
: _module(0)
, _function(0)
, _block(0)
, _exitBlock(0)
, _throwBlock(0)
, _returnAddress(0)
, _mode(GlobalCode)
, _env(0)
, _loop(0)
, _labelledStatement(0)
, _tryCleanup(0)
, _context(0)
, _strictMode(strictMode)
, _debugger(0)
, _errorHandler(errorHandler)
{
}
@ -2490,5 +2511,10 @@ void Codegen::throwSyntaxError(const SourceLocation &loc, const QString &detail)
msg->startLine = loc.startLine;
msg->startColumn = loc.startColumn;
msg->message = detail;
_context->throwSyntaxError(msg);
if (_context)
_context->throwSyntaxError(msg);
else if (_errorHandler)
_errorHandler->syntaxError(msg);
else
Q_ASSERT(!"No error handler available.");
}

View File

@ -52,6 +52,7 @@ class UiParameterList;
}
namespace VM {
struct DiagnosticMessage;
struct ExecutionContext;
}
@ -59,10 +60,17 @@ namespace Debugging {
class Debugger;
} // namespace Debugging
class ErrorHandler
{
public:
virtual void syntaxError(VM::DiagnosticMessage *message) = 0;
};
class Codegen: protected AST::Visitor
{
public:
Codegen(VM::ExecutionContext *ctx);
Codegen(ErrorHandler *errorHandler, bool strictMode);
enum Mode {
GlobalCode,
@ -391,7 +399,9 @@ private:
QHash<AST::Node *, Environment *> _envMap;
QHash<AST::FunctionExpression *, int> _functionMap;
VM::ExecutionContext *_context;
bool _strictMode;
Debugging::Debugger *_debugger;
ErrorHandler *_errorHandler;
class ScanFunctions;
};