{
assert(node);
- _fileName = fileName;
_module = module;
_env = 0;
+ _module->setFileName(fileName);
+
ScanFunctions scan(this, sourceCode);
scan(node);
AST::FunctionExpression *ast,
V4IR::Module *module)
{
- _fileName = fileName;
_module = module;
+ _module->setFileName(fileName);
_env = 0;
ScanFunctions scan(this, sourceCode);
enterEnvironment(ast);
V4IR::Function *function = _module->newFunction(name, _function);
- function->sourceFile = _fileName;
V4IR::BasicBlock *entryBlock = function->newBasicBlock(groupStartBlock());
V4IR::BasicBlock *exitBlock = function->newBasicBlock(groupStartBlock(), V4IR::Function::DontInsertBlock);
void Codegen::throwSyntaxError(const SourceLocation &loc, const QString &detail)
{
QV4::DiagnosticMessage *msg = new QV4::DiagnosticMessage;
- msg->fileName = _fileName;
+ msg->fileName = _module->fileName;
msg->offset = loc.begin();
msg->startLine = loc.startLine;
msg->startColumn = loc.startColumn;
void Codegen::throwReferenceError(const SourceLocation &loc, const QString &detail)
{
if (_context)
- _context->throwReferenceError(QV4::Value::fromString(_context, detail), _fileName, loc.startLine);
+ _context->throwReferenceError(QV4::Value::fromString(_context, detail), _module->fileName, loc.startLine);
else if (_errorHandler)
throwSyntaxError(loc, detail);
else
void throwReferenceError(const AST::SourceLocation &loc, const QString &detail);
private:
- QString _fileName;
Result _expr;
QString _property;
UiMember _uiMember;
uint functionTableSize;
uint offsetToFunctionTable;
uint indexOfRootFunction;
+ quint32 sourceFileIndex;
const String *stringAt(int idx) const {
const uint *offsetTable = reinterpret_cast<const uint*>((reinterpret_cast<const char *>(this)) + offsetToStringTable);
QV4::Value (*code)(ExecutionContext *, const uchar *);
quint32 index; // in CompilationUnit's function table
quint32 nameIndex;
- quint32 sourceFileIndex;
qint64 flags;
quint32 nFormals;
quint32 formalsOffset;
int refCount;
Unit *data;
+ QString fileName() const { return data->stringAt(data->sourceFileIndex)->qString(); }
+
QV4::String **runtimeIdentifiers; // Array
QV4::Function *linkToEngine(QV4::ExecutionEngine *engine);
QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit()
{
+ registerString(irModule->fileName);
foreach (QQmlJS::V4IR::Function *f, irModule->functions) {
registerString(*f->name);
- registerString(f->sourceFile);
for (int i = 0; i < f->formals.size(); ++i)
registerString(*f->formals.at(i));
for (int i = 0; i < f->locals.size(); ++i)
unit->offsetToStringTable = sizeof(QV4::CompiledData::Unit);
unit->functionTableSize = irModule->functions.size();
unit->offsetToFunctionTable = unit->offsetToStringTable + unit->stringTableSize * sizeof(uint);
+ unit->sourceFileIndex = getStringId(irModule->fileName);
// write strings and string table
uint *stringTable = (uint *)(data + unit->offsetToStringTable);
QV4::CompiledData::Function *function = (QV4::CompiledData::Function *)f;
function->index = index;
function->nameIndex = getStringId(*irFunction->name);
- function->sourceFileIndex = getStringId(irFunction->sourceFile);
function->flags = 0;
if (irFunction->hasDirectEval)
function->flags |= CompiledData::Function::HasDirectEval;
}
}
+void Module::setFileName(const QString &name)
+{
+ if (fileName.isEmpty())
+ fileName = name;
+ else {
+ Q_ASSERT(fileName == name);
+ }
+}
+
Function::~Function()
{
// destroy the Stmt::Data blocks manually, because memory pool cleanup won't
MemoryPool pool;
QVector<Function *> functions;
Function *rootFunction;
+ QString fileName;
Function *newFunction(const QString &name, Function *outer);
Module() : rootFunction(0) {}
~Module();
+
+ void setFileName(const QString &name);
};
struct Function {
QVector<Function *> nestedFunctions;
Function *outer;
- QString sourceFile;
-
int insideWithOrCatch;
uint hasDirectEval: 1;
nestedFunctions.append(f);
}
- inline QString sourceFile() const { return compilationUnit->data->stringAt(compiledFunction->sourceFileIndex)->qString(); }
+ inline QString sourceFile() const { return compilationUnit->fileName(); }
inline bool usesArgumentsObject() const { return compiledFunction->flags & CompiledData::Function::UsesArgumentsObject; }
inline bool isStrict() const { return compiledFunction->flags & CompiledData::Function::IsStrict; }