void Enumeration::Instance::next(QScriptContextPrivate *context, QScriptValueImpl *result) { QScriptEnginePrivate *eng = context->engine(); Q_ASSERT(it != 0); it->next(); QScript::Member *member = it->member(); if (member->isObjectProperty() || member->nameId()) eng->newNameId(result, member->nameId()); else if (member->isNativeProperty() && !member->nameId()) *result = QScriptValueImpl(uint(member->id())); else *result = eng->undefinedValue(); }
/*! Returns the name of the last property that was jumped over using next() or previous(). \sa value(), flags() */ QString QScriptValueIterator::name() const { Q_D(const QScriptValueIterator); if (d->index == -1) return QString(); QScript::Member member; QScriptValuePrivate::valueOf(d->object).member(d->index, &member); if (member.isObjectProperty() || member.nameId()) return member.nameId()->s; else if (member.isNativeProperty()) return QScriptEnginePrivate::toString(member.id()); return QString(); }
bool QScriptValueIteratorImpl::acceptsMember(const QScriptValueImpl &o, const QScript::Member &m) const { if (!m.isValid() || (!m_ignoresDontEnum && m.dontEnum()) || (m.isSetter() && !m.isGetter())) { return false; } if (!m_enumerateProto || QScriptEnginePrivate::strictlyEquals(o, m_frontObject)) return true; // make sure it's not a shadowed property QScript::Member dummy; QScriptValueImpl base; QScriptNameIdImpl *id; if (m.nameId()) { id = m.nameId(); } else { QScriptEnginePrivate *eng_p = m_frontObject.engine(); id = eng_p->nameId(QScript::numberToString(m.id())); } m_frontObject.resolve(id, &dummy, &base, QScriptValue::ResolvePrototype, QScript::Read); return QScriptEnginePrivate::strictlyEquals(base, o); }
QDebug &operator<<(QDebug &d, const QScriptValueImpl &object) { d.nospace() << "QScriptValue("; switch (object.type()) { case QScript::InvalidType: d.nospace() << "Invalid)"; return d; case QScript::BooleanType: d.nospace() << "bool=" << object.toBoolean(); break; case QScript::IntegerType: d.nospace() << "int=" << object.toInt32(); break; case QScript::NumberType: d.nospace() << "qsreal=" << object.toNumber(); break; case QScript::LazyStringType: case QScript::StringType: d.nospace() << "string=" << object.toString(); break; case QScript::ReferenceType: d.nospace() << "reference"; break; case QScript::NullType: d.nospace() << "null"; break; case QScript::UndefinedType: d.nospace() << "undefined"; break; case QScript::PointerType: d.nospace() << "pointer"; break; case QScript::ObjectType: d.nospace() << object.classInfo()->name() << ",{"; QScriptObject *od = object.objectValue(); for (int i=0; i<od->memberCount(); ++i) { if (i != 0) d << ","; QScript::Member m; od->member(i, &m); if (m.isValid() && m.isObjectProperty()) { d << object.engine()->toString(m.nameId()); QScriptValueImpl o; od->get(m, &o); d.nospace() << QLatin1String(":") << (o.classInfo() ? o.classInfo()->name() : QLatin1String("?")); } } d.nospace() << "} scope={"; QScriptValueImpl scope = object.scope(); while (scope.isValid()) { Q_ASSERT(scope.isObject()); d.nospace() << " " << scope.objectValue(); scope = scope.scope(); } d.nospace() << "}"; break; } d << ")"; return d; }