diff options
-rw-r--r-- | src/imports/localstorage/plugin.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject.cpp | 77 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject_p.h | 15 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4globalobject.cpp | 28 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 9 |
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()) |