19void Lookup::resolveProtoGetter(PropertyKey name,
const Heap::Object *proto)
22 auto index = proto->internalClass->findValueOrGetter(name);
23 if (index.isValid()) {
24 PropertyAttributes attrs = index.attrs;
25 protoLookup.data = proto->propertyData(index.index);
27 call = Call::GetterProto;
29 call = Call::GetterProtoAccessor;
33 proto = proto->prototype();
36 call = Call::GetterQObjectPropertyFallback;
44ReturnedValue Lookup::resolvePrimitiveGetter(ExecutionEngine *engine,
const Value &object)
47 Q_ASSERT(engine->isInitialized);
49 primitiveLookup.type = object.type();
50 switch (primitiveLookup.type) {
51 case Value::Undefined_Type:
52 case Value::Null_Type: {
54 ScopedString name(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]);
55 const QString message = QStringLiteral(
"Cannot read property '%1' of %2").arg(name->toQString())
56 .arg(QLatin1String(primitiveLookup.type == Value::Undefined_Type ?
"undefined" :
"null"));
57 return engine->throwTypeError(message);
59 case Value::Boolean_Type:
60 primitiveLookup.proto.set(engine, engine->booleanPrototype()->d());
62 case Value::Managed_Type: {
64 Q_ASSERT(object.isStringOrSymbol());
65 primitiveLookup.proto.set(engine,
static_cast<
const Managed &>(object).internalClass()->prototype);
66 Q_ASSERT(primitiveLookup.proto);
68 ScopedString name(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]);
69 if (object.isString() && name->equals(engine->id_length())) {
71 call = Call::GetterStringLength;
72 return stringLengthGetter(
this, engine, object);
76 case Value::Integer_Type:
78 primitiveLookup.proto.set(engine, engine->numberPrototype()->d());
81 PropertyKey name = engine->identifierTable->asPropertyKey(engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]);
82 protoLookup.protoId = primitiveLookup.proto->internalClass->protoId;
83 resolveProtoGetter(name, primitiveLookup.proto);
86 case Call::GetterProto:
87 call = Call::GetterProtoPrimitive;
89 case Call::GetterProtoAccessor:
90 call = Call::GetterAccessorPrimitive;
96 return getter(engine, object);
99ReturnedValue Lookup::resolveGlobalGetter(ExecutionEngine *engine)
102 Q_ASSERT(engine->isInitialized);
104 Object *o = engine->globalObject;
105 PropertyKey name = engine->identifierTable->asPropertyKey(engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]);
106 protoLookup.protoId = o->internalClass()->protoId;
107 resolveProtoGetter(name, o->d());
110 case Call::GetterProto:
111 call = Call::GlobalGetterProto;
113 case Call::GetterProtoAccessor:
114 call = Call::GlobalGetterProtoAccessor;
117 call = Call::GlobalGetterGeneric;
119 ScopedString n(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]);
120 return engine->throwReferenceError(n);
123 return globalGetter(engine);
126ReturnedValue Lookup::getterGeneric(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
128 if (
const Object *o = object.as<Object>())
129 return lookup->resolveGetter(engine, o);
130 return lookup->resolvePrimitiveGetter(engine, object);
135 Heap::InternalClass *ic1 = first.objectLookup.ic;
136 const uint offset1 = first.objectLookup.offset;
137 Heap::InternalClass *ic2 = second.objectLookup.ic;
138 const uint offset2 = second.objectLookup.offset;
139 auto engine = ic1->engine;
141 lookup->objectLookupTwoClasses.ic.set(engine, ic1);
142 lookup->objectLookupTwoClasses.ic2.set(engine, ic2);
143 lookup->objectLookupTwoClasses.offset = offset1;
144 lookup->objectLookupTwoClasses.offset2 = offset2;
149 const quintptr protoId1 = first.protoLookup.protoId;
150 const Value *data1 = first.protoLookup.data;
151 const quintptr protoId2 = second.protoLookup.protoId;
152 const Value *data2 = second.protoLookup.data;
154 lookup->protoLookupTwoClasses.protoId = protoId1;
155 lookup->protoLookupTwoClasses.protoId2 = protoId2;
156 lookup->protoLookupTwoClasses.data = data1;
157 lookup->protoLookupTwoClasses.data2 = data2;
160ReturnedValue Lookup::getterTwoClasses(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
162 if (
const Object *o = object.as<Object>()) {
166 memset(&second, 0,
sizeof(Lookup));
167 second.nameIndex = lookup->nameIndex;
168 second.forCall = lookup->forCall;
169 second.call = Call::GetterGeneric;
170 const ReturnedValue result = second.resolveGetter(engine, o);
172 switch (lookup->call) {
173 case Call::Getter0Inline: {
174 switch (second.call) {
175 case Call::Getter0Inline:
176 setupObjectLookupTwoClasses(lookup, *lookup, second);
177 lookup->call = Call::Getter0InlineGetter0Inline;
179 case Call::Getter0MemberData:
180 setupObjectLookupTwoClasses(lookup, *lookup, second);
181 lookup->call = Call::Getter0InlineGetter0MemberData;
188 case Call::Getter0MemberData:
189 switch (second.call) {
190 case Call::Getter0Inline:
192 setupObjectLookupTwoClasses(lookup, second, *lookup);
193 lookup->call = Call::Getter0InlineGetter0MemberData;
195 case Call::Getter0MemberData:
196 setupObjectLookupTwoClasses(lookup, *lookup, second);
197 lookup->call = Call::Getter0MemberDataGetter0MemberData;
203 case Call::GetterProto:
204 switch (second.call) {
205 case Call::GetterProto:
206 setupProtoLookupTwoClasses(lookup, *lookup, second);
207 lookup->call = Call::GetterProtoTwoClasses;
213 case Call::GetterProtoAccessor:
214 switch (second.call) {
215 case Call::GetterProtoAccessor:
216 setupProtoLookupTwoClasses(lookup, *lookup, second);
217 lookup->call = Call::GetterProtoAccessorTwoClasses;
228 second.releasePropertyCache();
231 lookup->call = Call::GetterQObjectPropertyFallback;
232 return getterFallback(lookup, engine, object);
235ReturnedValue Lookup::getterFallback(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
237 QV4::Scope scope(engine);
238 QV4::ScopedObject o(scope, object.toObject(scope.engine));
240 return Encode::undefined();
241 ScopedString name(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[lookup->nameIndex]);
245ReturnedValue Lookup::getter0MemberData(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
249 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
251 if (lookup->objectLookup.ic == o->internalClass)
252 return o->memberData->values.data()[lookup->objectLookup.offset].asReturnedValue();
254 return getterTwoClasses(lookup, engine, object);
257ReturnedValue Lookup::getter0Inline(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
261 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
263 if (lookup->objectLookup.ic == o->internalClass)
264 return o->inlinePropertyDataWithOffset(lookup->objectLookup.offset)->asReturnedValue();
266 return getterTwoClasses(lookup, engine, object);
269ReturnedValue Lookup::getterProto(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
272 Q_ASSERT(engine->isInitialized);
276 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
278 if (lookup->protoLookup.protoId == o->internalClass->protoId)
279 return lookup->protoLookup.data->asReturnedValue();
281 return getterTwoClasses(lookup, engine, object);
284ReturnedValue Lookup::getter0Inlinegetter0Inline(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
288 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
290 if (lookup->objectLookupTwoClasses.ic == o->internalClass)
291 return o->inlinePropertyDataWithOffset(lookup->objectLookupTwoClasses.offset)->asReturnedValue();
292 if (lookup->objectLookupTwoClasses.ic2 == o->internalClass)
293 return o->inlinePropertyDataWithOffset(lookup->objectLookupTwoClasses.offset2)->asReturnedValue();
295 lookup->call = Call::GetterQObjectPropertyFallback;
296 return getterFallback(lookup, engine, object);
299ReturnedValue Lookup::getter0Inlinegetter0MemberData(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
303 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
305 if (lookup->objectLookupTwoClasses.ic == o->internalClass)
306 return o->inlinePropertyDataWithOffset(lookup->objectLookupTwoClasses.offset)->asReturnedValue();
307 if (lookup->objectLookupTwoClasses.ic2 == o->internalClass)
308 return o->memberData->values.data()[lookup->objectLookupTwoClasses.offset2].asReturnedValue();
310 lookup->call = Call::GetterQObjectPropertyFallback;
311 return getterFallback(lookup, engine, object);
314ReturnedValue Lookup::getter0MemberDatagetter0MemberData(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
318 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
320 if (lookup->objectLookupTwoClasses.ic == o->internalClass)
321 return o->memberData->values.data()[lookup->objectLookupTwoClasses.offset].asReturnedValue();
322 if (lookup->objectLookupTwoClasses.ic2 == o->internalClass)
323 return o->memberData->values.data()[lookup->objectLookupTwoClasses.offset2].asReturnedValue();
325 lookup->call = Call::GetterQObjectPropertyFallback;
326 return getterFallback(lookup, engine, object);
329ReturnedValue Lookup::getterProtoTwoClasses(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
332 Q_ASSERT(engine->isInitialized);
336 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
338 if (lookup->protoLookupTwoClasses.protoId == o->internalClass->protoId)
339 return lookup->protoLookupTwoClasses.data->asReturnedValue();
340 if (lookup->protoLookupTwoClasses.protoId2 == o->internalClass->protoId)
341 return lookup->protoLookupTwoClasses.data2->asReturnedValue();
342 return getterFallback(lookup, engine, object);
344 lookup->call = Call::GetterQObjectPropertyFallback;
345 return getterFallback(lookup, engine, object);
348ReturnedValue Lookup::getterAccessor(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
352 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
354 if (lookup->objectLookup.ic == o->internalClass) {
355 const Value *getter = o->propertyData(lookup->objectLookup.offset);
356 if (!getter->isFunctionObject())
357 return Encode::undefined();
359 return checkedResult(engine,
static_cast<
const FunctionObject *>(getter)->call(
360 &object,
nullptr, 0));
363 lookup->call = Call::GetterQObjectPropertyFallback;
364 return getterFallback(lookup, engine, object);
367ReturnedValue Lookup::getterProtoAccessor(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
370 Q_ASSERT(engine->isInitialized);
374 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
375 if (o && lookup->protoLookup.protoId == o->internalClass->protoId) {
376 const Value *getter = lookup->protoLookup.data;
377 if (!getter->isFunctionObject())
378 return Encode::undefined();
380 return checkedResult(engine,
static_cast<
const FunctionObject *>(getter)->call(
381 &object,
nullptr, 0));
383 return getterTwoClasses(lookup, engine, object);
386ReturnedValue Lookup::getterProtoAccessorTwoClasses(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
389 Q_ASSERT(engine->isInitialized);
393 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
395 const Value *getter =
nullptr;
396 if (lookup->protoLookupTwoClasses.protoId == o->internalClass->protoId)
397 getter = lookup->protoLookupTwoClasses.data;
398 else if (lookup->protoLookupTwoClasses.protoId2 == o->internalClass->protoId)
399 getter = lookup->protoLookupTwoClasses.data2;
401 if (!getter->isFunctionObject())
402 return Encode::undefined();
404 return checkedResult(engine,
static_cast<
const FunctionObject *>(getter)->call(
405 &object,
nullptr, 0));
408 lookup->call = Call::GetterQObjectPropertyFallback;
409 return getterFallback(lookup, engine, object);
412ReturnedValue Lookup::getterIndexed(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
414 Object *o = object.objectValue();
416 Heap::Object *ho = o->d();
417 if (ho->arrayData && ho->arrayData->type == Heap::ArrayData::Simple) {
418 Heap::SimpleArrayData *s = ho->arrayData.cast<Heap::SimpleArrayData>();
419 if (lookup->indexedLookup.index < s->values.size)
420 if (!s->data(lookup->indexedLookup.index).isEmpty())
421 return s->data(lookup->indexedLookup.index).asReturnedValue();
423 return o->get(lookup->indexedLookup.index);
425 lookup->call = Call::GetterQObjectPropertyFallback;
426 return getterFallback(lookup, engine, object);
429ReturnedValue Lookup::getterQObject(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
431 const auto revertLookup = [lookup, engine, &object]() {
432 lookup->qobjectLookup.propertyCache->release();
433 lookup->qobjectLookup.propertyCache =
nullptr;
434 lookup->call = Call::GetterGeneric;
435 return Lookup::getterGeneric(lookup, engine, object);
438 const QObjectWrapper::Flags flags = lookup->forCall
439 ? QObjectWrapper::AllowOverride
440 : (QObjectWrapper::AllowOverride | QObjectWrapper::AttachMethods);
442 return QObjectWrapper::lookupPropertyGetterImpl(lookup, engine, object, flags, revertLookup);
445ReturnedValue Lookup::getterQObjectMethod(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
447 const auto revertLookup = [lookup, engine, &object]() {
448 lookup->qobjectMethodLookup.propertyCache->release();
449 lookup->qobjectMethodLookup.propertyCache =
nullptr;
450 lookup->call = Call::GetterGeneric;
451 return Lookup::getterGeneric(lookup, engine, object);
454 const QObjectWrapper::Flags flags = lookup->forCall
455 ? QObjectWrapper::AllowOverride
456 : (QObjectWrapper::AllowOverride | QObjectWrapper::AttachMethods);
458 return QObjectWrapper::lookupMethodGetterImpl(lookup, engine, object, flags, revertLookup);
461ReturnedValue Lookup::getterFallbackMethod(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
463 const auto revertLookup = [lookup, engine, &object]() {
464 lookup->call = Call::GetterGeneric;
465 return Lookup::getterGeneric(lookup, engine, object);
468 const Object *o = object.as<Object>();
469 if (!o || o->internalClass() != lookup->qobjectMethodLookup.ic)
470 return revertLookup();
472 const QObjectWrapper *This =
static_cast<
const QObjectWrapper *>(o);
473 QObject *qobj = This->d()->object();
474 if (QQmlData::wasDeleted(qobj))
475 return QV4::Encode::undefined();
480 engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[lookup->nameIndex]);
482 QV4::ScopedValue result(
483 scope, QObjectWrapper::getMethodFallback(
484 engine, This->d(), qobj, name,
485 lookup->forCall ? QObjectWrapper::NoFlag : QObjectWrapper::AttachMethods));
489 if (QObjectMethod *method = result->as<QV4::QObjectMethod>())
490 lookup->qobjectMethodLookup.method.set(engine, method->d());
492 return result->asReturnedValue();
495ReturnedValue Lookup::getterValueType(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
497 const auto revertLookup = [lookup, engine, &object]() {
498 lookup->qgadgetLookup.metaObject = quintptr(0);
499 lookup->call = Call::GetterGeneric;
500 return Lookup::getterGeneric(lookup, engine, object);
505 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
506 if (!o || o->internalClass != lookup->qgadgetLookup.ic)
507 return revertLookup();
509 Heap::QQmlValueTypeWrapper *valueTypeWrapper =
510 const_cast<Heap::QQmlValueTypeWrapper*>(
static_cast<
const Heap::QQmlValueTypeWrapper *>(o));
511 if (valueTypeWrapper->metaObject() !=
reinterpret_cast<
const QMetaObject *>(lookup->qgadgetLookup.metaObject - 1))
512 return revertLookup();
514 if (valueTypeWrapper->isReference() && !valueTypeWrapper->readReference())
515 return Encode::undefined();
517 return QQmlValueTypeWrapper::getGadgetProperty(
518 engine, valueTypeWrapper, QMetaType(lookup->qgadgetLookup.metaType),
519 lookup->qgadgetLookup.coreIndex, lookup->qgadgetLookup.isFunction,
520 lookup->qgadgetLookup.isEnum);
523ReturnedValue Lookup::primitiveGetterProto(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
526 Q_ASSERT(engine->isInitialized);
528 if (object.type() == lookup->primitiveLookup.type && !object.isObject()) {
529 Heap::Object *o = lookup->primitiveLookup.proto;
530 if (lookup->primitiveLookup.protoId == o->internalClass->protoId)
531 return lookup->primitiveLookup.data->asReturnedValue();
533 lookup->call = Call::GetterGeneric;
534 return getterGeneric(lookup, engine, object);
537ReturnedValue Lookup::primitiveGetterAccessor(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
540 Q_ASSERT(engine->isInitialized);
542 if (object.type() == lookup->primitiveLookup.type && !object.isObject()) {
543 Heap::Object *o = lookup->primitiveLookup.proto;
544 if (lookup->primitiveLookup.protoId == o->internalClass->protoId) {
545 const Value *getter = lookup->primitiveLookup.data;
546 if (!getter->isFunctionObject())
547 return Encode::undefined();
549 return checkedResult(engine,
static_cast<
const FunctionObject *>(getter)->call(
550 &object,
nullptr, 0));
553 lookup->call = Call::GetterGeneric;
554 return getterGeneric(lookup, engine, object);
557ReturnedValue Lookup::stringLengthGetter(Lookup *lookup, ExecutionEngine *engine,
const Value &object)
559 if (
const String *s = object.as<String>())
560 return Encode(s->d()->length());
562 lookup->call = Call::GetterGeneric;
563 return getterGeneric(lookup, engine, object);
571ReturnedValue Lookup::globalGetterProto(Lookup *lookup, ExecutionEngine *engine)
574 Q_ASSERT(engine->isInitialized);
576 Heap::Object *o = engine->globalObject->d();
577 if (lookup->protoLookup.protoId == o->internalClass->protoId)
578 return lookup->protoLookup.data->asReturnedValue();
579 lookup->call = Call::GlobalGetterGeneric;
580 return globalGetterGeneric(lookup, engine);
583ReturnedValue Lookup::globalGetterProtoAccessor(Lookup *lookup, ExecutionEngine *engine)
586 Q_ASSERT(engine->isInitialized);
588 Heap::Object *o = engine->globalObject->d();
589 if (lookup->protoLookup.protoId == o->internalClass->protoId) {
590 const Value *getter = lookup->protoLookup.data;
591 if (!getter->isFunctionObject())
592 return Encode::undefined();
594 return checkedResult(engine,
static_cast<
const FunctionObject *>(getter)->call(
595 engine->globalObject,
nullptr, 0));
598 lookup->call = Call::GlobalGetterGeneric;
599 return globalGetterGeneric(lookup, engine);
607bool Lookup::setterGeneric(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
609 if (object.isObject())
610 return lookup->resolveSetter(engine,
static_cast<Object *>(&object), value);
612 if (engine->currentStackFrame->v4Function->isStrict())
616 ScopedObject o(scope, RuntimeHelpers::convertToObject(scope.engine, object));
619 ScopedString name(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[lookup->nameIndex]);
620 return o->put(name, value);
623bool Lookup::setterTwoClasses(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
626 Q_ASSERT(lookup->call == Call::Setter0MemberData || lookup->call == Call::Setter0Inline);
628 if (object.isObject()) {
631 Heap::InternalClass *ic = lookup->objectLookup.ic;
632 const uint index = lookup->objectLookup.index;
634 if (!lookup->resolveSetter(engine,
static_cast<Object *>(&object), value)) {
635 lookup->call = Call::SetterQObjectPropertyFallback;
639 if (lookup->call == Call::Setter0MemberData || lookup->call == Call::Setter0Inline) {
640 auto engine = ic->engine;
641 lookup->objectLookupTwoClasses.ic.set(engine, ic);
642 lookup->objectLookupTwoClasses.ic2.set(engine, ic);
643 lookup->objectLookupTwoClasses.offset = index;
644 lookup->objectLookupTwoClasses.offset2 = index;
645 lookup->call = Call::Setter0Setter0;
649 lookup->releasePropertyCache();
652 lookup->call = Call::SetterQObjectPropertyFallback;
653 return setterFallback(lookup, engine, object, value);
656bool Lookup::setterFallback(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
658 QV4::Scope scope(engine);
659 QV4::ScopedObject o(scope, object.toObject(scope.engine));
663 ScopedString name(scope, engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[lookup->nameIndex]);
664 return o->put(name, value);
667bool Lookup::setter0MemberData(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
669 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
670 if (o && o->internalClass == lookup->objectLookup.ic) {
671 o->memberData->values.set(engine, lookup->objectLookup.offset, value);
675 return setterTwoClasses(lookup, engine, object, value);
678bool Lookup::setter0Inline(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
680 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
681 if (o && o->internalClass == lookup->objectLookup.ic) {
682 o->setInlinePropertyWithOffset(engine, lookup->objectLookup.offset, value);
686 return setterTwoClasses(lookup, engine, object, value);
689bool Lookup::setter0setter0(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
691 Heap::Object *o =
static_cast<Heap::Object *>(object.heapObject());
693 if (o->internalClass == lookup->objectLookupTwoClasses.ic) {
694 o->setProperty(engine, lookup->objectLookupTwoClasses.offset, value);
697 if (o->internalClass == lookup->objectLookupTwoClasses.ic2) {
698 o->setProperty(engine, lookup->objectLookupTwoClasses.offset2, value);
703 lookup->call = Call::SetterQObjectPropertyFallback;
704 return setterFallback(lookup, engine, object, value);
707bool Lookup::setterInsert(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &value)
710 Q_ASSERT(engine->isInitialized);
712 Object *o =
static_cast<Object *>(object.managed());
713 if (o && o->internalClass()->protoId == lookup->insertionLookup.protoId) {
714 o->setInternalClass(lookup->insertionLookup.newClass);
715 o->d()->setProperty(engine, lookup->insertionLookup.offset, value);
719 lookup->call = Call::SetterQObjectPropertyFallback;
720 return setterFallback(lookup, engine, object, value);
723bool Lookup::setterQObject(Lookup *lookup, ExecutionEngine *engine, Value &object,
const Value &v)
727 return setterFallback(lookup, engine, object, v);
730bool Lookup::arrayLengthSetter(Lookup *, ExecutionEngine *engine, Value &object,
const Value &value)
732 Q_ASSERT(object.isObject() &&
static_cast<Object &>(object).isArrayObject());
734 uint len = value.asArrayLength(&ok);
736 engine->throwRangeError(value);
739 ok =
static_cast<Object &>(object).setArrayLength(len);