void Codegen::throwReferenceError(const SourceLocation &loc, const QString &detail)
{
if (_context)
- _context->throwReferenceError(QV4::Value::fromString(_context, detail));
+ _context->throwReferenceError(QV4::Value::fromString(_context, detail), _fileName, loc.startLine);
else if (_errorHandler)
throwSyntaxError(loc, detail);
else
throwError(Value::fromObject(engine->newReferenceErrorObject(msg)));
}
+void ExecutionContext::throwReferenceError(Value value, const QString &fileName, int line)
+{
+ String *s = value.toString(this);
+ QString msg = s->toQString() + QStringLiteral(" is not defined");
+ throwError(Value::fromObject(engine->newReferenceErrorObject(msg, fileName, line)));
+}
+
void ExecutionContext::throwRangeError(Value value)
{
String *s = value.toString(this);
void Q_NORETURN throwTypeError();
void Q_NORETURN throwTypeError(const QString &message);
void Q_NORETURN throwReferenceError(Value value);
+ void Q_NORETURN throwReferenceError(Value value, const QString &fileName, int line);
void Q_NORETURN throwRangeError(Value value);
void Q_NORETURN throwURIError(Value msg);
void Q_NORETURN throwUnimplemented(const QString &message);
return new (memoryManager) ReferenceErrorObject(this, message);
}
+Object *ExecutionEngine::newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber)
+{
+ return new (memoryManager) ReferenceErrorObject(this, message, fileName, lineNumber);
+}
+
+
Object *ExecutionEngine::newTypeErrorObject(const QString &message)
{
return new (memoryManager) TypeErrorObject(this, message);
Object *newSyntaxErrorObject(ExecutionContext *ctx, DiagnosticMessage *message);
Object *newSyntaxErrorObject(const QString &message);
Object *newReferenceErrorObject(const QString &message);
+ Object *newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber);
Object *newTypeErrorObject(const QString &message);
Object *newRangeErrorObject(const QString &message);
Object *newURIErrorObject(Value message);
defineDefaultProperty(engine, QStringLiteral("name"), Value::fromString(engine, className()));
stackTrace = engine->stackTrace();
+ if (!stackTrace.isEmpty()) {
+ defineDefaultProperty(engine, QStringLiteral("fileName"), Value::fromString(engine, stackTrace.at(0).source));
+ defineDefaultProperty(engine, QStringLiteral("lineNumber"), Value::fromInt32(stackTrace.at(0).line));
+ }
stack = Value::emptyValue();
}
{
vtbl = &static_vtbl;
prototype = ctx->engine->syntaxErrorPrototype;
+ if (message) {
+ defineDefaultProperty(ctx->engine, QStringLiteral("fileName"), Value::fromString(ctx, message->fileName));
+ defineDefaultProperty(ctx->engine, QStringLiteral("lineNumber"), Value::fromInt32(message->startLine));
+ }
}
prototype = engine->referenceErrorPrototype;
}
+ReferenceErrorObject::ReferenceErrorObject(ExecutionEngine *engine, const QString &msg, const QString &fileName, int lineNumber)
+ : ErrorObject(engine, Value::fromString(engine, msg), ReferenceError)
+{
+ prototype = engine->referenceErrorPrototype;
+ defineDefaultProperty(engine, QStringLiteral("fileName"), Value::fromString(engine->rootContext, fileName));
+ defineDefaultProperty(engine, QStringLiteral("lineNumber"), Value::fromInt32(lineNumber));
+}
+
TypeErrorObject::TypeErrorObject(ExecutionEngine *engine, const Value &message)
: ErrorObject(engine, message, TypeError)
{
struct ReferenceErrorObject: ErrorObject {
ReferenceErrorObject(ExecutionEngine *engine, const Value &message);
ReferenceErrorObject(ExecutionEngine *engine, const QString &msg);
+ ReferenceErrorObject(ExecutionEngine *engine, const QString &msg, const QString &fileName, int lineNumber);
};
struct SyntaxErrorObject: ErrorObject {
ret = eng.evaluate(code);
QCOMPARE(ret.isError(), expectHadError);
if (ret.isError()) {
- QEXPECT_FAIL("", "we have no more lineNumber property ", Continue);
QVERIFY(ret.property("lineNumber").strictlyEquals(eng.toScriptValue(expectErrorLineNumber)));
}
}
QJSValue ret = eng.evaluate(code);
QVERIFY(ret.isError());
QVERIFY(ret.toString().startsWith(name));
- //QTBUG-6138: JSC doesn't assign lineNumber when errors are not thrown
- QEXPECT_FAIL("", "we have no more lineNumber property ", Continue);
QCOMPARE(ret.property("lineNumber").toInt(), i+2);
}
}