aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/localstorage/plugin.cpp2
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp6
-rw-r--r--src/qml/jsruntime/qv4context.cpp10
-rw-r--r--src/qml/jsruntime/qv4context_p.h4
-rw-r--r--src/qml/jsruntime/qv4engine.cpp8
-rw-r--r--src/qml/jsruntime/qv4engine_p.h4
-rw-r--r--src/qml/jsruntime/qv4errorobject.cpp77
-rw-r--r--src/qml/jsruntime/qv4errorobject_p.h15
-rw-r--r--src/qml/jsruntime/qv4globalobject.cpp28
-rw-r--r--src/qml/jsruntime/qv4numberobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4object.cpp9
11 files changed, 107 insertions, 60 deletions
diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp
index 1e0247cc54..3cb0141986 100644
--- a/src/imports/localstorage/plugin.cpp
+++ b/src/imports/localstorage/plugin.cpp
@@ -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); \
}
diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp
index 02b83428fa..ea4d174bb7 100644
--- a/src/qml/jsruntime/qv4arrayobject.cpp
+++ b/src/qml/jsruntime/qv4arrayobject.cpp
@@ -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();
}
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp
index 75f7f9eb9a..d8990bf8be 100644
--- a/src/qml/jsruntime/qv4context.cpp
+++ b/src/qml/jsruntime/qv4context.cpp
@@ -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);
}
diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h
index 4171d9e73d..f8d5620ec6 100644
--- a/src/qml/jsruntime/qv4context_p.h
+++ b/src/qml/jsruntime/qv4context_p.h
@@ -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);
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index e2f5ed4515..0e0b1300d7 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -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>();
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index ecc29e7427..32dcac4512 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -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);
diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp
index 024068eed0..21917a94f0 100644
--- a/src/qml/jsruntime/qv4errorobject.cpp
+++ b/src/qml/jsruntime/qv4errorobject.cpp
@@ -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)
diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h
index 1592ec791e..dbe33d0bd8 100644
--- a/src/qml/jsruntime/qv4errorobject_p.h
+++ b/src/qml/jsruntime/qv4errorobject_p.h
@@ -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
diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp
index 014d97a146..4cb351eeb0 100644
--- a/src/qml/jsruntime/qv4globalobject.cpp
+++ b/src/qml/jsruntime/qv4globalobject.cpp
@@ -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();
}
diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp
index 396dc33fd5..9bf0d506f4 100644
--- a/src/qml/jsruntime/qv4numberobject.cpp
+++ b/src/qml/jsruntime/qv4numberobject.cpp
@@ -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];
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index a785e5b13b..05dc24e5e4 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -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())