📄 qscriptvalueimpl_p.h
字号:
inline bool QScriptValueImpl::resolve(QScriptNameIdImpl *nameId, QScript::Member *member, QScriptValueImpl *object, QScriptValue::ResolveFlags mode) const{ Q_ASSERT(isValid()); Q_ASSERT(isObject()); Q_ASSERT(member); Q_ASSERT(object); Q_ASSERT(nameId->unique); QScriptObject *object_data = m_object_value; // Search in properties... if (object_data->findMember(nameId, member)) { *object = *this; return true; } return resolve_helper(nameId, member, object, mode);}inline void QScriptValueImpl::get(const QScript::Member &member, QScriptValueImpl *obj) const{ Q_ASSERT(obj); Q_ASSERT(isObject()); Q_ASSERT(member.isValid()); if (! member.isObjectProperty()) { get_helper(member, obj); return; } Q_ASSERT(member.id() >= 0); Q_ASSERT(member.id() < m_object_value->memberCount()); Q_ASSERT(member.nameId()); Q_ASSERT(member.nameId()->unique); m_object_value->get(member, obj);}inline void QScriptValueImpl::get(QScriptNameIdImpl *nameId, QScriptValueImpl *out){ QScript::Member m; QScriptValueImpl o; if (resolve(nameId, &m, &o, QScriptValue::ResolvePrototype)) o.get(m, out); else QScriptEnginePrivate::get(engine())->newUndefined(out);}inline void QScriptValueImpl::get_helper(const QScript::Member &member, QScriptValueImpl *obj) const{ QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); if (member.nameId() == eng->idTable()->id___proto__) { *obj = prototype(); if (!obj->isValid()) eng->newUndefined(obj); return; } if (QScriptClassData *data = classInfo()->data()) { if (data->get(*this, member, obj)) return; } obj->invalidate(); if (! isFunction()) { return; } else if (member.nameId() == eng->idTable()->id_length) { QScriptFunction *foo = eng->convertToNativeFunction(*this); Q_ASSERT(foo != 0); eng->newNumber(obj, foo->length); } else if (member.nameId() == eng->idTable()->id_arguments) { eng->newNull(obj); }/* else if (member.nameId() == eng->idTable()->id___fileName__) { QScriptFunction *foo = eng->convertToNativeFunction(*this); Q_ASSERT(foo != 0); return eng->newString(obj, foo->fileName()); }*/}inline void QScriptValueImpl::put(const QScript::Member &member, const QScriptValueImpl &object){ Q_ASSERT(isObject()); Q_ASSERT(member.isValid()); // Q_ASSERT(member.isWritable()); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); if (member.isObjectProperty()) { Q_ASSERT(member.nameId()->unique); Q_ASSERT(member.id() >= 0); Q_ASSERT(member.id() < m_object_value->memberCount()); m_object_value->put(member, object); } else if (member.nameId() == eng_p->idTable()->id___proto__) { if (object.isNull()) // only Object.prototype.__proto__ can be null setPrototype(eng_p->undefinedValue()); else { QScriptValueImpl was = prototype(); setPrototype(object); if (detectedCycle()) { eng_p->currentContext()->throwError(QLatin1String("cycle in prototype chain")); setPrototype(was); } } } else { Q_ASSERT(classInfo()->data()); classInfo()->data()->put(this, member, object); }}inline void QScriptValueImpl::setQObjectValue(QObject *object){#ifndef QT_NO_QOBJECT Q_ASSERT(isQObject()); QScript::ExtQObject *ctor = QScriptEnginePrivate::get(engine())->qobjectConstructor; Q_ASSERT(ctor != 0); QScript::ExtQObject::Instance *data = ctor->get(*this); Q_ASSERT(data != 0); data->value = object;#else Q_UNUSED(object);#endif}inline QVariant &QScriptValueImpl::variantValue() const{ Q_ASSERT(isVariant()); QScript::Ext::Variant *ctor = QScriptEnginePrivate::get(engine())->variantConstructor; Q_ASSERT(ctor != 0); QScript::Ext::Variant::Instance *data = ctor->get(*this); Q_ASSERT(data != 0); return data->value;}inline void QScriptValueImpl::setVariantValue(const QVariant &value){ if (!isVariant()) return; QScript::Ext::Variant *ctor = QScriptEnginePrivate::get(engine())->variantConstructor; Q_ASSERT(ctor != 0); QScript::Ext::Variant::Instance *data = ctor->get(*this); Q_ASSERT(data != 0); data->value = value;}inline QScriptValueImpl QScriptValueImpl::internalValue() const{ Q_ASSERT(isObject()); return m_object_value->m_internalValue;}inline void QScriptValueImpl::setInternalValue(const QScriptValueImpl &internalValue){ Q_ASSERT(isObject()); m_object_value->m_internalValue = internalValue;}inline void QScriptValueImpl::removeMember(const QScript::Member &member){ if (member.isObjectProperty()) m_object_value->removeMember(member); else if (QScriptClassData *data = m_class->data()) data->removeMember(*this, member);}inline void QScriptValueImpl::createMember(QScriptNameIdImpl *nameId, QScript::Member *member, uint flags){ Q_ASSERT(isObject()); QScriptObject *object_data = m_object_value; object_data->createMember(nameId, member, flags); Q_ASSERT(member->isObjectProperty());}inline QScriptValueImpl QScriptValueImpl::scope() const{ Q_ASSERT(isObject()); return m_object_value->m_scope;}inline void QScriptValueImpl::setScope(const QScriptValueImpl &scope){ Q_ASSERT(isObject()); m_object_value->m_scope = scope;}inline int QScriptValueImpl::memberCount() const{ Q_ASSERT(isObject()); int count = m_object_value->memberCount(); if (m_class->data()) count += m_class->data()->extraMemberCount(*this); return count;}inline void QScriptValueImpl::member(int index, QScript::Member *member) const{ Q_ASSERT(isObject()); if (QScriptClassData *data = m_class->data()) { int extra = data->extraMemberCount(*this); if (index < extra) { data->extraMember(*this, index, member); return; } index -= extra; } m_object_value->member(index, member);}inline QScriptFunction *QScriptValueImpl::toFunction() const{ if (!isFunction()) return 0; return QScriptEnginePrivate::get(engine())->convertToNativeFunction(*this);}inline QScriptValueImpl QScriptValueImpl::property(QScriptNameIdImpl *nameId, const QScriptValue::ResolveFlags &mode) const{ if (!isObject()) return QScriptValueImpl(); QScriptValueImpl base; QScript::Member member; if (! resolve(nameId, &member, &base, mode)) return QScriptValueImpl(); QScriptValueImpl value; base.get(nameId, &value); if (member.isGetterOrSetter()) { QScriptValueImpl getter; if (member.isObjectProperty() && !member.isGetter()) { if (!base.m_object_value->findGetter(&member)) return QScriptValueImpl(); } base.get(member, &getter); value = getter.call(*this); } return value;}inline void QScriptValueImpl::setProperty(const QString &name, const QScriptValueImpl &value, const QScriptValue::PropertyFlags &flags){ if (!isObject()) return; QScriptNameIdImpl *nameId = QScriptEnginePrivate::get(engine())->nameId(name); setProperty(nameId, value, flags);}inline QScriptValueImpl QScriptValueImpl::property(const QString &name, const QScriptValue::ResolveFlags &mode) const{ if (!isObject()) return QScriptValueImpl(); QScriptNameIdImpl *nameId = QScriptEnginePrivate::get(engine())->nameId(name); return property(nameId, mode);}inline QScriptValueImpl QScriptValueImpl::property(quint32 arrayIndex, const QScriptValue::ResolveFlags &mode) const{ if (!isObject()) return QScriptValueImpl(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this); if (instance) return instance->value.at(arrayIndex); QScriptValueImpl id; eng_p->newNumber(&id, arrayIndex); return property(id.toString(), mode);}inline void QScriptValueImpl::setProperty(quint32 arrayIndex, const QScriptValueImpl &value, const QScriptValue::PropertyFlags &flags){ if (!isObject()) return; QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this); if (instance) { instance->value.assign(arrayIndex, value); return; } QScriptValueImpl id; eng_p->newNumber(&id, arrayIndex); setProperty(id.toString(), value, flags);}inline QScriptValue::PropertyFlags QScriptValueImpl::propertyFlags(const QString &name, const QScriptValue::ResolveFlags &mode) const{ if (!isObject()) return 0; QScriptNameIdImpl *nameId = QScriptEnginePrivate::get(engine())->nameId(name); QScriptValueImpl base; QScript::Member member; if (! resolve(nameId, &member, &base, mode)) return 0; return QScriptValue::PropertyFlags(member.flags() & ~QScript::Member::InternalRange);}inline bool QScriptValueImpl::deleteProperty(QScriptNameIdImpl *nameId, const QScriptValue::ResolveFlags &mode){ if (!isObject()) return true; QScript::Member member; QScriptValueImpl base; if (resolve(nameId, &member, &base, mode)) { if (!member.isDeletable()) return false; base.removeMember(member); if (member.isGetterOrSetter() && (member.isGetter() != member.isSetter())) { // delete the "other half" of the property too (getter or setter) return deleteProperty(nameId, mode); } } return true;}inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject, const QScriptValueImplList &args){ if (!isFunction()) return QScriptValueImpl(); QScriptEngine *eng = engine(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(eng); return eng_p->call(*this, thisObject, args, /*asConstructor=*/false);}inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject, const QScriptValueImpl &args){ if (!isFunction()) return QScriptValueImpl(); QScriptEngine *eng = engine(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(eng); return eng_p->call(*this, thisObject, args, /*asConstructor=*/false);}inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImplList &args){ if (!isFunction()) return QScriptValueImpl(); QScriptEngine *eng = engine(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(eng); QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal); QScriptValueImpl object; eng_p->newObject(&object, proto); QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true); if (result.isObject()) return result; return object;}inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImpl &args){ if (!isFunction()) return QScriptValueImpl(); QScriptEngine *eng = engine(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(eng); QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal); QScriptValueImpl object; eng_p->newObject(&object, proto); QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true); if (result.isObject()) return result; return object;}inline void QScriptValueImpl::mark(int generation) const{ if (! isValid()) return; else if (isString()) QScriptEnginePrivate::get(engine())->markString(m_string_value, generation); else if (isObject()) QScriptEnginePrivate::get(engine())->markObject(*this, generation);}inline bool QScriptValueImpl::lessThan(const QScriptValueImpl &other) const{ if (!isValid() || !other.isValid()) return false; QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); return eng_p->lessThan(*this, other);}inline bool QScriptValueImpl::equals(const QScriptValueImpl &other) const{ if (!isValid() || !other.isValid()) return isValid() == other.isValid(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); return eng_p->equals(*this, other);}inline bool QScriptValueImpl::strictlyEquals(const QScriptValueImpl &other) const{ if (!isValid() || !other.isValid()) return isValid() == other.isValid(); QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); return eng_p->strictlyEquals(*this, other);}#endif // QT_NO_SCRIPT#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -