diff options
Diffstat (limited to 'src/qml/jsruntime/qv4objectproto.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 7ca790b970..ac19101a29 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -105,9 +105,9 @@ ReturnedValue ObjectCtor::call(Managed *m, CallData *callData) void ObjectPrototype::init(ExecutionEngine *v4, ObjectRef ctor) { Scope scope(v4); - ScopedObject o(scope); + ScopedObject o(scope, this); - ctor->defineReadonlyProperty(v4->id_prototype, (o = this)); + ctor->defineReadonlyProperty(v4->id_prototype, o); ctor->defineReadonlyProperty(v4->id_length, Primitive::fromInt32(1)); ctor->defineDefaultProperty(QStringLiteral("getPrototypeOf"), method_getPrototypeOf, 1); ctor->defineDefaultProperty(QStringLiteral("getOwnPropertyDescriptor"), method_getOwnPropertyDescriptor, 2); @@ -134,9 +134,9 @@ void ObjectPrototype::init(ExecutionEngine *v4, ObjectRef ctor) defineDefaultProperty(QStringLiteral("__defineSetter__"), method_defineSetter, 2); Scoped<String> id_proto(scope, v4->id___proto__); - Property *p = insertMember(StringRef(v4->id___proto__), Attr_Accessor|Attr_NotEnumerable); - p->setGetter(v4->newBuiltinFunction(v4->rootContext, id_proto, method_get_proto)->getPointer()); - p->setSetter(v4->newBuiltinFunction(v4->rootContext, id_proto, method_set_proto)->getPointer()); + Property p = Property::fromAccessor(v4->newBuiltinFunction(v4->rootContext, id_proto, method_get_proto)->getPointer(), + v4->newBuiltinFunction(v4->rootContext, id_proto, method_set_proto)->getPointer()); + insertMember(StringRef(v4->id___proto__), p, Attr_Accessor|Attr_NotEnumerable); } ReturnedValue ObjectPrototype::method_getPrototypeOf(CallContext *ctx) @@ -157,7 +157,7 @@ ReturnedValue ObjectPrototype::method_getOwnPropertyDescriptor(CallContext *ctx) if (!O) return ctx->throwTypeError(); - if (O->isNonStrictArgumentsObject) + if (ArgumentsObject::isNonStrictArgumentsObject(O.getPointer())) Scoped<ArgumentsObject>(scope, O)->fullyCreate(); ScopedValue v(scope, ctx->argument(1)); @@ -271,10 +271,12 @@ ReturnedValue ObjectPrototype::method_seal(CallContext *ctx) o->internalClass = o->internalClass->sealed(); - o->ensureArrayAttributes(); - for (uint i = 0; i < o->arrayDataLen; ++i) { - if (!(o->arrayAttributes[i].isGeneric() || o->arrayData[i].value.isEmpty())) - o->arrayAttributes[i].setConfigurable(false); + if (o->arrayData) { + o->arrayData->ensureAttributes(); + for (uint i = 0; i < o->arrayData->length(); ++i) { + if (!o->arrayData->isEmpty(i)) + o->arrayData->attrs[i].setConfigurable(false); + } } return o.asReturnedValue(); @@ -287,19 +289,21 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx) if (!o) return ctx->throwTypeError(); - if (o->isNonStrictArgumentsObject) + if (ArgumentsObject::isNonStrictArgumentsObject(o.getPointer())) Scoped<ArgumentsObject>(scope, o)->fullyCreate(); o->extensible = false; o->internalClass = o->internalClass->frozen(); - o->ensureArrayAttributes(); - for (uint i = 0; i < o->arrayDataLen; ++i) { - if (!(o->arrayAttributes[i].isGeneric() || o->arrayData[i].value.isEmpty())) - o->arrayAttributes[i].setConfigurable(false); - if (o->arrayAttributes[i].isData()) - o->arrayAttributes[i].setWritable(false); + if (o->arrayData) { + o->arrayData->ensureAttributes(); + for (uint i = 0; i < o->arrayData->length(); ++i) { + if (!o->arrayData->isEmpty(i)) + o->arrayData->attrs[i].setConfigurable(false); + if (o->arrayData->attrs[i].isData()) + o->arrayData->attrs[i].setWritable(false); + } } return o.asReturnedValue(); } @@ -328,15 +332,16 @@ ReturnedValue ObjectPrototype::method_isSealed(CallContext *ctx) if (o->internalClass != o->internalClass->sealed()) return Encode(false); - if (!o->arrayDataLen) + if (!o->arrayData || !o->arrayData->length()) return Encode(true); - if (!o->arrayAttributes) + if (o->arrayData->length() && !o->arrayData->attrs) return Encode(false); - for (uint i = 0; i < o->arrayDataLen; ++i) { - if (!(o->arrayAttributes[i].isGeneric() || o->arrayData[i].value.isEmpty())) - if (o->arrayAttributes[i].isConfigurable()) + for (uint i = 0; i < o->arrayData->length(); ++i) { + // ### Fix for sparse arrays + if (!o->arrayData->isEmpty(i)) + if (o->arrayData->attributes(i).isConfigurable()) return Encode(false); } @@ -356,15 +361,16 @@ ReturnedValue ObjectPrototype::method_isFrozen(CallContext *ctx) if (o->internalClass != o->internalClass->frozen()) return Encode(false); - if (!o->arrayDataLen) + if (!o->arrayData->length()) return Encode(true); - if (!o->arrayAttributes) + if (o->arrayData->length() && !o->arrayData->attrs) return Encode(false); - for (uint i = 0; i < o->arrayDataLen; ++i) { - if (!(o->arrayAttributes[i].isGeneric() || o->arrayData[i].value.isEmpty())) - if (o->arrayAttributes[i].isConfigurable() || o->arrayAttributes[i].isWritable()) + for (uint i = 0; i < o->arrayData->length(); ++i) { + // ### Fix for sparse arrays + if (!o->arrayData->isEmpty(i)) + if (o->arrayData->attributes(i).isConfigurable() || o->arrayData->attributes(i).isWritable()) return Encode(false); } @@ -448,7 +454,7 @@ ReturnedValue ObjectPrototype::method_hasOwnProperty(CallContext *ctx) Scoped<Object> O(scope, ctx->callData->thisObject, Scoped<Object>::Convert); if (scope.engine->hasException) return Encode::undefined(); - bool r = O->__getOwnProperty__(P) != 0; + bool r = O->hasOwnProperty(P); if (!r) r = !O->query(P).isEmpty(); return Encode(r); |