Fix Value usage in ErrorObjects

Change-Id: Iaa14ad5a8d3f085843e49195f8f4bb7bb020b9b6
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
This commit is contained in:
Lars Knoll 2013-09-25 22:42:58 +02:00 committed by The Qt Project
parent 150731fc68
commit 18d4794e3f
11 changed files with 107 additions and 60 deletions

View File

@ -66,7 +66,7 @@ using namespace QV4;
#define V4THROW_SQL(error, desc) { \
QV4::Scoped<String> v(scope, Value::fromString(ctx, desc)); \
QV4::Scoped<Object> ex(scope, ctx->engine->newErrorObject(v.asValue())); \
QV4::Scoped<Object> ex(scope, ctx->engine->newErrorObject(v)); \
ex->put(QV4::ScopedString(scope, ctx->engine->newIdentifier(QStringLiteral("code"))), QV4::ScopedValue(scope, Primitive::fromInt32(error))); \
ctx->throwError(ex); \
}

View File

@ -273,8 +273,10 @@ ReturnedValue ArrayPrototype::method_push(SimpleCallContext *ctx)
double newLen = l + ctx->callData->argc;
if (!instance->isArrayObject())
instance->put(ctx->engine->id_length, ScopedValue(scope, Primitive::fromDouble(newLen)));
else
ctx->throwRangeError(Value::fromString(ctx, QStringLiteral("Array.prototype.push: Overflow")));
else {
ScopedString str(scope, ctx->engine->newString(QStringLiteral("Array.prototype.push: Overflow")));
ctx->throwRangeError(str);
}
return Primitive::fromDouble(newLen).asReturnedValue();
}

View File

@ -662,19 +662,19 @@ void ExecutionContext::throwReferenceError(const QString &message, const QString
throwError(error);
}
void ExecutionContext::throwRangeError(Value value)
void ExecutionContext::throwRangeError(const ValueRef value)
{
Scope scope(this);
Scoped<String> s(scope, value.toString(this));
ScopedString s(scope, value->toString(this));
QString msg = s->toQString() + QStringLiteral(" out of range");
Scoped<Object> error(scope, engine->newRangeErrorObject(msg));
ScopedObject error(scope, engine->newRangeErrorObject(msg));
throwError(error);
}
void ExecutionContext::throwURIError(Value msg)
void ExecutionContext::throwURIError(const ValueRef msg)
{
Scope scope(this);
Scoped<Object> error(scope, engine->newURIErrorObject(msg));
ScopedObject error(scope, engine->newURIErrorObject(msg));
throwError(error);
}

View File

@ -133,8 +133,8 @@ struct Q_QML_EXPORT ExecutionContext
void Q_NORETURN throwTypeError(const QString &message);
void Q_NORETURN throwReferenceError(const ValueRef value);
void Q_NORETURN throwReferenceError(const QString &value, const QString &fileName, int line, int column);
void Q_NORETURN throwRangeError(Value value);
void Q_NORETURN throwURIError(Value msg);
void Q_NORETURN throwRangeError(const ValueRef value);
void Q_NORETURN throwURIError(const ValueRef msg);
void Q_NORETURN throwUnimplemented(const QString &message);
void setProperty(const StringRef name, const ValueRef value);

View File

@ -475,7 +475,7 @@ Returned<RegExpObject> *ExecutionEngine::newRegExpObject(const QRegExp &re)
return object->asReturned<RegExpObject>();
}
Returned<Object> *ExecutionEngine::newErrorObject(const Value &value)
Returned<Object> *ExecutionEngine::newErrorObject(const ValueRef value)
{
ErrorObject *object = new (memoryManager) ErrorObject(errorClass, value);
return object->asReturned<Object>();
@ -483,7 +483,9 @@ Returned<Object> *ExecutionEngine::newErrorObject(const Value &value)
Returned<Object> *ExecutionEngine::newSyntaxErrorObject(const QString &message)
{
Object *error = new (memoryManager) SyntaxErrorObject(this, Value::fromString(this, message));
Scope scope(this);
ScopedString s(scope, newString(message));
Object *error = new (memoryManager) SyntaxErrorObject(this, s);
return error->asReturned<Object>();
}
@ -519,7 +521,7 @@ Returned<Object> *ExecutionEngine::newRangeErrorObject(const QString &message)
return o->asReturned<Object>();
}
Returned<Object> *ExecutionEngine::newURIErrorObject(Value message)
Returned<Object> *ExecutionEngine::newURIErrorObject(const ValueRef message)
{
Object *o = new (memoryManager) URIErrorObject(this, message);
return o->asReturned<Object>();

View File

@ -290,14 +290,14 @@ struct Q_QML_EXPORT ExecutionEngine
Returned<RegExpObject> *newRegExpObject(RegExp* re, bool global);
Returned<RegExpObject> *newRegExpObject(const QRegExp &re);
Returned<Object> *newErrorObject(const Value &value);
Returned<Object> *newErrorObject(const ValueRef value);
Returned<Object> *newSyntaxErrorObject(const QString &message, const QString &fileName, int line, int column);
Returned<Object> *newSyntaxErrorObject(const QString &message);
Returned<Object> *newReferenceErrorObject(const QString &message);
Returned<Object> *newReferenceErrorObject(const QString &message, const QString &fileName, int lineNumber, int columnNumber);
Returned<Object> *newTypeErrorObject(const QString &message);
Returned<Object> *newRangeErrorObject(const QString &message);
Returned<Object> *newURIErrorObject(Value message);
Returned<Object> *newURIErrorObject(const ValueRef message);
Returned<Object> *newVariantObject(const QVariant &v);

View File

@ -85,7 +85,7 @@ ErrorObject::ErrorObject(InternalClass *ic)
defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, "Error"));
}
ErrorObject::ErrorObject(InternalClass *ic, const Value &message, ErrorType t)
ErrorObject::ErrorObject(InternalClass *ic, const ValueRef message, ErrorType t)
: Object(ic)
, stack(0)
{
@ -98,8 +98,32 @@ ErrorObject::ErrorObject(InternalClass *ic, const Value &message, ErrorType t)
defineAccessorProperty(QStringLiteral("stack"), ErrorObject::method_get_stack, 0);
if (!message.isUndefined())
defineDefaultProperty(QStringLiteral("message"), message);
if (!message->isUndefined())
defineDefaultProperty(QStringLiteral("message"), *message);
defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, className()));
stackTrace = ic->engine->stackTrace();
if (!stackTrace.isEmpty()) {
defineDefaultProperty(QStringLiteral("fileName"), Value::fromString(ic->engine, stackTrace.at(0).source));
defineDefaultProperty(QStringLiteral("lineNumber"), Primitive::fromInt32(stackTrace.at(0).line));
}
}
ErrorObject::ErrorObject(InternalClass *ic, const QString &message, ErrorObject::ErrorType t)
: Object(ic)
, stack(0)
{
type = Type_ErrorObject;
vtbl = &static_vtbl;
subtype = t;
Scope scope(engine());
ScopedValue protectThis(scope, this);
defineAccessorProperty(QStringLiteral("stack"), ErrorObject::method_get_stack, 0);
ScopedValue v(scope, ic->engine->newString(message));
defineDefaultProperty(QStringLiteral("message"), v);
defineDefaultProperty(QStringLiteral("name"), Value::fromString(ic->engine, className()));
stackTrace = ic->engine->stackTrace();
@ -175,7 +199,7 @@ DEFINE_MANAGED_VTABLE(ErrorObject);
DEFINE_MANAGED_VTABLE(SyntaxErrorObject);
SyntaxErrorObject::SyntaxErrorObject(ExecutionEngine *engine, const Value &msg)
SyntaxErrorObject::SyntaxErrorObject(ExecutionEngine *engine, const ValueRef msg)
: ErrorObject(engine->syntaxErrorClass, msg, SyntaxError)
{
vtbl = &static_vtbl;
@ -187,28 +211,28 @@ SyntaxErrorObject::SyntaxErrorObject(ExecutionEngine *engine, const QString &msg
vtbl = &static_vtbl;
}
EvalErrorObject::EvalErrorObject(ExecutionEngine *engine, const Value &message)
EvalErrorObject::EvalErrorObject(ExecutionEngine *engine, const ValueRef message)
: ErrorObject(engine->evalErrorClass, message, EvalError)
{
}
RangeErrorObject::RangeErrorObject(ExecutionEngine *engine, const Value &message)
RangeErrorObject::RangeErrorObject(ExecutionEngine *engine, const ValueRef message)
: ErrorObject(engine->rangeErrorClass, message, RangeError)
{
}
RangeErrorObject::RangeErrorObject(ExecutionEngine *engine, const QString &message)
: ErrorObject(engine->rangeErrorClass, Value::fromString(engine, message), RangeError)
: ErrorObject(engine->rangeErrorClass, message, RangeError)
{
}
ReferenceErrorObject::ReferenceErrorObject(ExecutionEngine *engine, const Value &message)
ReferenceErrorObject::ReferenceErrorObject(ExecutionEngine *engine, const ValueRef message)
: ErrorObject(engine->referenceErrorClass, message, ReferenceError)
{
}
ReferenceErrorObject::ReferenceErrorObject(ExecutionEngine *engine, const QString &message)
: ErrorObject(engine->referenceErrorClass, Value::fromString(engine, message), ReferenceError)
: ErrorObject(engine->referenceErrorClass, message, ReferenceError)
{
}
@ -217,17 +241,17 @@ ReferenceErrorObject::ReferenceErrorObject(ExecutionEngine *engine, const QStrin
{
}
TypeErrorObject::TypeErrorObject(ExecutionEngine *engine, const Value &message)
TypeErrorObject::TypeErrorObject(ExecutionEngine *engine, const ValueRef message)
: ErrorObject(engine->typeErrorClass, message, TypeError)
{
}
TypeErrorObject::TypeErrorObject(ExecutionEngine *engine, const QString &message)
: ErrorObject(engine->typeErrorClass, Value::fromString(engine, message), TypeError)
: ErrorObject(engine->typeErrorClass, message, TypeError)
{
}
URIErrorObject::URIErrorObject(ExecutionEngine *engine, const Value &message)
URIErrorObject::URIErrorObject(ExecutionEngine *engine, const ValueRef message)
: ErrorObject(engine->uriErrorClass, message, URIError)
{
}
@ -254,7 +278,9 @@ ErrorCtor::ErrorCtor(ExecutionContext *scope, const QString &name)
ReturnedValue ErrorCtor::construct(Managed *m, CallData *callData)
{
return Encode(m->engine()->newErrorObject(callData->argc ? callData->args[0] : Primitive::undefinedValue()));
Scope scope(m->engine());
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return Encode(m->engine()->newErrorObject(v));
}
ReturnedValue ErrorCtor::call(Managed *that, CallData *callData)
@ -270,8 +296,9 @@ EvalErrorCtor::EvalErrorCtor(ExecutionContext *scope)
ReturnedValue EvalErrorCtor::construct(Managed *m, CallData *callData)
{
return Value::fromObject(new (m->engine()->memoryManager) EvalErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()))
.asReturnedValue();
Scope scope(m->engine());
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) EvalErrorObject(m->engine(), v))->asReturnedValue();
}
RangeErrorCtor::RangeErrorCtor(ExecutionContext *scope)
@ -283,8 +310,8 @@ RangeErrorCtor::RangeErrorCtor(ExecutionContext *scope)
ReturnedValue RangeErrorCtor::construct(Managed *m, CallData *callData)
{
Scope scope(m->engine());
ScopedValue v(scope, new (m->engine()->memoryManager) RangeErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()));
return v.asReturnedValue();
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) RangeErrorObject(scope.engine, v))->asReturnedValue();
}
ReferenceErrorCtor::ReferenceErrorCtor(ExecutionContext *scope)
@ -296,8 +323,8 @@ ReferenceErrorCtor::ReferenceErrorCtor(ExecutionContext *scope)
ReturnedValue ReferenceErrorCtor::construct(Managed *m, CallData *callData)
{
Scope scope(m->engine());
ScopedValue v(scope, new (m->engine()->memoryManager) ReferenceErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()));
return v.asReturnedValue();
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) ReferenceErrorObject(scope.engine, v))->asReturnedValue();
}
SyntaxErrorCtor::SyntaxErrorCtor(ExecutionContext *scope)
@ -309,8 +336,8 @@ SyntaxErrorCtor::SyntaxErrorCtor(ExecutionContext *scope)
ReturnedValue SyntaxErrorCtor::construct(Managed *m, CallData *callData)
{
Scope scope(m->engine());
ScopedValue v(scope, new (m->engine()->memoryManager) SyntaxErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()));
return v.asReturnedValue();
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) SyntaxErrorObject(scope.engine, v))->asReturnedValue();
}
TypeErrorCtor::TypeErrorCtor(ExecutionContext *scope)
@ -322,8 +349,8 @@ TypeErrorCtor::TypeErrorCtor(ExecutionContext *scope)
ReturnedValue TypeErrorCtor::construct(Managed *m, CallData *callData)
{
Scope scope(m->engine());
ScopedValue v(scope, new (m->engine()->memoryManager) TypeErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()));
return v.asReturnedValue();
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) TypeErrorObject(scope.engine, v))->asReturnedValue();
}
URIErrorCtor::URIErrorCtor(ExecutionContext *scope)
@ -335,8 +362,8 @@ URIErrorCtor::URIErrorCtor(ExecutionContext *scope)
ReturnedValue URIErrorCtor::construct(Managed *m, CallData *callData)
{
Scope scope(m->engine());
ScopedValue v(scope, new (m->engine()->memoryManager) URIErrorObject(m->engine(), callData->argc ? callData->args[0] : Primitive::undefinedValue()));
return v.asReturnedValue();
ScopedValue v(scope, callData->argc ? callData->args[0] : Primitive::undefinedValue());
return (new (m->engine()->memoryManager) URIErrorObject(scope.engine, v))->asReturnedValue();
}
void ErrorPrototype::init(ExecutionEngine *engine, const Value &ctor, Object *obj)

View File

@ -64,7 +64,8 @@ struct ErrorObject: Object {
};
ErrorObject(InternalClass *ic);
ErrorObject(InternalClass *ic, const Value &message, ErrorType t = Error);
ErrorObject(InternalClass *ic, const ValueRef message, ErrorType t = Error);
ErrorObject(InternalClass *ic, const QString &message, ErrorType t = Error);
ErrorObject(InternalClass *ic, const QString &message, const QString &fileName, int line, int column, ErrorType t = Error);
SyntaxErrorObject *asSyntaxError();
@ -83,33 +84,33 @@ inline ErrorObject *value_cast(const Value &v) {
}
struct EvalErrorObject: ErrorObject {
EvalErrorObject(ExecutionEngine *engine, const Value &message);
EvalErrorObject(ExecutionEngine *engine, const ValueRef message);
};
struct RangeErrorObject: ErrorObject {
RangeErrorObject(ExecutionEngine *engine, const Value &message);
RangeErrorObject(ExecutionEngine *engine, const ValueRef message);
RangeErrorObject(ExecutionEngine *engine, const QString &msg);
};
struct ReferenceErrorObject: ErrorObject {
ReferenceErrorObject(ExecutionEngine *engine, const Value &message);
ReferenceErrorObject(ExecutionEngine *engine, const ValueRef message);
ReferenceErrorObject(ExecutionEngine *engine, const QString &msg);
ReferenceErrorObject(ExecutionEngine *engine, const QString &msg, const QString &fileName, int lineNumber, int columnNumber);
};
struct SyntaxErrorObject: ErrorObject {
Q_MANAGED
SyntaxErrorObject(ExecutionEngine *engine, const Value &msg);
SyntaxErrorObject(ExecutionEngine *engine, const ValueRef msg);
SyntaxErrorObject(ExecutionEngine *engine, const QString &msg, const QString &fileName, int lineNumber, int columnNumber);
};
struct TypeErrorObject: ErrorObject {
TypeErrorObject(ExecutionEngine *engine, const Value &message);
TypeErrorObject(ExecutionEngine *engine, const ValueRef message);
TypeErrorObject(ExecutionEngine *engine, const QString &msg);
};
struct URIErrorObject: ErrorObject {
URIErrorObject(ExecutionEngine *engine, const Value &message);
URIErrorObject(ExecutionEngine *engine, const ValueRef message);
};
struct ErrorCtor: FunctionObject

View File

@ -599,8 +599,11 @@ ReturnedValue GlobalFunctions::method_decodeURI(SimpleCallContext *context)
QString uriString = context->callData->args[0].toString(context)->toQString();
bool ok;
QString out = decode(uriString, DecodeNonReserved, &ok);
if (!ok)
context->throwURIError(Value::fromString(context, QStringLiteral("malformed URI sequence")));
if (!ok) {
Scope scope(context);
ScopedString s(scope, context->engine->newString(QStringLiteral("malformed URI sequence")));
context->throwURIError(s);
}
return Value::fromString(context, out).asReturnedValue();
}
@ -614,8 +617,11 @@ ReturnedValue GlobalFunctions::method_decodeURIComponent(SimpleCallContext *cont
QString uriString = context->callData->args[0].toString(context)->toQString();
bool ok;
QString out = decode(uriString, DecodeAll, &ok);
if (!ok)
context->throwURIError(Value::fromString(context, QStringLiteral("malformed URI sequence")));
if (!ok) {
Scope scope(context);
ScopedString s(scope, context->engine->newString(QStringLiteral("malformed URI sequence")));
context->throwURIError(s);
}
return Value::fromString(context, out).asReturnedValue();
}
@ -629,8 +635,11 @@ ReturnedValue GlobalFunctions::method_encodeURI(SimpleCallContext *context)
QString uriString = context->callData->args[0].toString(context)->toQString();
bool ok;
QString out = encode(uriString, uriUnescapedReserved, &ok);
if (!ok)
context->throwURIError(Value::fromString(context, QStringLiteral("malformed URI sequence")));
if (!ok) {
Scope scope(context);
ScopedString s(scope, context->engine->newString(QStringLiteral("malformed URI sequence")));
context->throwURIError(s);
}
return Value::fromString(context, out).asReturnedValue();
}
@ -644,8 +653,11 @@ ReturnedValue GlobalFunctions::method_encodeURIComponent(SimpleCallContext *cont
QString uriString = context->callData->args[0].toString(context)->toQString();
bool ok;
QString out = encode(uriString, uriUnescaped, &ok);
if (!ok)
context->throwURIError(Value::fromString(context, QStringLiteral("malformed URI sequence")));
if (!ok) {
Scope scope(context);
ScopedString s(scope, context->engine->newString(QStringLiteral("malformed URI sequence")));
context->throwURIError(s);
}
return Value::fromString(context, out).asReturnedValue();
}

View File

@ -212,7 +212,7 @@ ReturnedValue NumberPrototype::method_toExponential(SimpleCallContext *ctx)
int fdigits = ctx->callData->args[0].toInt32();
if (fdigits < 0 || fdigits > 20) {
ScopedString error(scope, ctx->engine->newString(QStringLiteral("Number.prototype.toExponential: fractionDigits out of range")));
ctx->throwRangeError(error.asValue());
ctx->throwRangeError(error);
}
}
@ -236,7 +236,7 @@ ReturnedValue NumberPrototype::method_toPrecision(SimpleCallContext *ctx)
double precision = ctx->callData->args[0].toInt32();
if (precision < 1 || precision > 21) {
ScopedString error(scope, ctx->engine->newString(QStringLiteral("Number.prototype.toPrecision: precision out of range")));
ctx->throwRangeError(error.asValue());
ctx->throwRangeError(error);
}
char str[100];

View File

@ -743,7 +743,7 @@ void Object::internalPut(const StringRef name, const ValueRef value)
bool ok;
uint l = value->asArrayLength(&ok);
if (!ok)
engine()->current->throwRangeError(*value);
engine()->current->throwRangeError(value);
ok = setArrayLength(l);
if (!ok)
goto reject;
@ -927,6 +927,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name,
name->makeIdentifier();
Scope scope(ctx);
Property *current;
PropertyAttributes *cattrs;
@ -942,8 +943,10 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name,
if (attrs.type() == PropertyAttributes::Data) {
bool ok;
uint l = p.value.asArrayLength(&ok);
if (!ok)
ctx->throwRangeError(p.value);
if (!ok) {
ScopedValue v(scope, p.value);
ctx->throwRangeError(v);
}
succeeded = setArrayLength(l);
}
if (attrs.hasWritable() && !attrs.isWritable())