When running with the LLVM backend, there is no VM context.
Change-Id: Ib4e95a3c3b92f20118269da1a9430a9278beb349
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
#include "qv4ecmaobjects_p.h"
#include "qv4isel_p.h"
#include "qv4mm.h"
+#include "qmljs_environment.h"
#include <QtCore>
#include <private/qqmljsengine_p.h>
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)
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);
{
Environment *e = _cg->newEnvironment(node, _env);
if (!e->isStrict)
- e->isStrict = _cg->_context->strictMode;
+ e->isStrict = _cg->_strictMode;
_envStack.append(e);
_env = e;
}
, _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)
{
}
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.");
}
}
namespace VM {
+struct DiagnosticMessage;
struct ExecutionContext;
}
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,
QHash<AST::Node *, Environment *> _envMap;
QHash<AST::FunctionExpression *, int> _functionMap;
VM::ExecutionContext *_context;
+ bool _strictMode;
Debugging::Debugger *_debugger;
+ ErrorHandler *_errorHandler;
class ScanFunctions;
};