void QScriptValueIteratorImpl::setValue(const QScriptValueImpl &value) { if (!m_member.isValid()) return; if (m_member.isGetterOrSetter()) { // find and call the setter QScriptValueImpl setter; if (m_member.isObjectProperty() && !m_member.isSetter()) { QScript::Member mb; QScriptObject *obj = m_object.m_object_value; mb.object(m_member.nameId(), obj->memberCount(), 0); if (!obj->findSetter(&mb)) return; m_object.get(mb, &setter); } else { m_object.get(m_member, &setter); } setter.call(m_object, QScriptValueImplList() << value); } else { m_object.put(m_member, value); } }
QScriptValueImpl QScriptValueIteratorImpl::value() const { if (!m_member.isValid()) return QScriptValueImpl(); QScriptValueImpl result; m_object.get(m_member, &result); if (m_member.isGetterOrSetter()) { // find and call the getter QScriptValueImpl getter; if (m_member.isObjectProperty() && !m_member.isGetter()) { QScript::Member mb; QScriptObject *obj = m_object.m_object_value; mb.object(m_member.nameId(), obj->memberCount(), 0); if (!obj->findGetter(&mb)) return QScriptValueImpl(); m_object.get(mb, &getter); } else { getter = result; } result = getter.call(m_object); } return result; }
void QScriptValueImpl::setProperty(QScriptNameIdImpl *nameId, const QScriptValueImpl &value, const QScriptValue::PropertyFlags &flags) { if (!isObject()) return; QScriptValueImpl base; QScript::Member member; QScriptValue::ResolveFlags mode = QScriptValue::ResolveLocal; // if we are not setting a setter or getter, look in prototype too if (!(flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter))) mode |= QScriptValue::ResolvePrototype; if (resolve(nameId, &member, &base, mode, QScript::ReadWrite)) { // we resolved an existing property with that name if (flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter)) { // setting the getter or setter of a property in this object if (member.isNativeProperty()) { if (value.isValid()) { qWarning("QScriptValue::setProperty() failed: " "cannot set getter or setter of native property `%s'", qPrintable(nameId->s)); } return; } if (member.isSetter()) { // the property we resolved is a setter if (!(flags & QScriptValue::PropertySetter) && !member.isGetter()) { // find the getter, if not, create one if (!m_object_value->findGetter(&member)) { if (!value.isValid()) return; // don't create property for invalid value createMember(nameId, &member, flags); } } } else if (member.isGetter()) { // the property we resolved is a getter if (!(flags & QScriptValue::PropertyGetter)) { // find the setter, if not, create one if (!m_object_value->findSetter(&member)) { if (!value.isValid()) return; // don't create property for invalid value createMember(nameId, &member, flags); } } } else { // the property is a normal property -- change the flags uint newFlags = flags & ~QScript::Member::InternalRange; newFlags |= QScript::Member::ObjectProperty; member.resetFlags(newFlags); base.m_object_value->m_members[member.id()].resetFlags(newFlags); } Q_ASSERT(member.isValid()); if (!value.isValid()) { // remove the property removeMember(member); return; } } else { // setting the value if (member.isGetterOrSetter()) { // call the setter QScriptValueImpl setter; if (member.isObjectProperty() && !member.isSetter()) { if (!base.m_object_value->findSetter(&member)) { qWarning("QScriptValue::setProperty() failed: " "property '%s' has a getter but no setter", qPrintable(nameId->s)); return; } } base.get(member, &setter); setter.call(*this, QScriptValueImplList() << value); return; } else { if (base.m_object_value != m_object_value) { if (!value.isValid()) return; // don't create property for invalid value createMember(nameId, &member, flags); base = *this; } else { if (!value.isValid()) { // remove the property removeMember(member); return; } } if (flags != QScriptValue::KeepExistingFlags) { // change flags if (member.isNativeProperty()) { qWarning("QScriptValue::setProperty(%s): " "cannot change flags of a native property", qPrintable(nameId->s)); } else { uint newFlags = member.flags() & QScript::Member::InternalRange; newFlags |= flags & ~QScript::Member::InternalRange; base.m_object_value->m_members[member.id()].resetFlags(newFlags); } } } } } else { // property does not exist if (!value.isValid()) return; // don't create property for invalid value createMember(nameId, &member, flags & ~QScript::Member::InternalRange); base = *this; } base.put(member, value); }