bool QScriptValueImpl::hasInstance(const QScriptValueImpl &value) const { Q_ASSERT(isObject()); if (QScriptClassData *odata = classInfo()->data()) { if (odata->implementsHasInstance(*this)) return odata->hasInstance(*this, value); } if (!isFunction()) return false; // [[HasInstance] for function objects if (!value.isObject()) return false; QScriptEnginePrivate *eng = engine(); QScriptValueImpl proto = property(eng->idTable()->id_prototype); if (!proto.isObject()) { QScriptContextPrivate *ctx = eng->currentContext(); ctx->throwTypeError(QLatin1String("instanceof: 'prototype' property is not an object")); return false; } QScriptObject *target = proto.m_object_value; QScriptValueImpl v = value; while (true) { v = v.prototype(); if (!v.isObject()) break; if (target == v.m_object_value) return true; } return false; }
bool FunctionClassData::get(const QScriptValueImpl &object, const Member &member, QScriptValueImpl *result) { if (object.classInfo() != classInfo()) return false; QScriptEnginePrivate *eng = QScriptEnginePrivate::get(object.engine()); if (! member.isNativeProperty()) return false; if (member.nameId() == eng->idTable()->id_length) { eng->newNumber(result, object.toFunction()->length); return true; } else if (member.nameId() == eng->idTable()->id_arguments) { eng->newNull(result); return true; } return false; }
bool FunctionClassData::resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, QScript::Member *member, QScriptValueImpl *base) { if (object.classInfo() != classInfo()) return false; QScriptEnginePrivate *eng = QScriptEnginePrivate::get(object.engine()); if ((nameId == eng->idTable()->id_length) || (nameId == eng->idTable()->id_arguments)) { member->native(nameId, /*id=*/ 0, QScriptValue::Undeletable | QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration); *base = object; return true; } return false; }