📄 qscriptecmaarray.cpp
字号:
if (! r2) return QScriptValueImpl(eng, QString()); QString R; QScriptValueImpl r6 = self.property(QLatin1String("0")); if (r6.isValid() && !(r6.isUndefined() || r6.isNull())) R = r6.toString(); for (quint32 k = 1; k < r2; ++k) { R += r4; QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(eng, k).toString()); QScriptValueImpl r12 = self.property(name); if (r12.isValid() && ! (r12.isUndefined() || r12.isNull())) R += r12.toString(); } return QScriptValueImpl(eng, R);}QScriptValueImpl Array::method_pop(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){ QScriptValueImpl self = context->thisObject(); if (Instance *instance = Instance::get(self, classInfo)) { QScriptValueImpl elt = instance->value.pop(); if (! elt.isValid()) elt = eng->undefinedValue(); return elt; } QScriptNameIdImpl *id_length = eng->idTable()->id_length; QScriptValueImpl r1 = self.property(id_length); quint32 r2 = r1.toUInt32(); if (! r2) { self.setProperty(id_length, QScriptValueImpl(eng, 0)); return eng->undefinedValue(); } QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(eng, r2 - 1).toString()); QScriptValueImpl r7 = self.property(r6); self.deleteProperty(r6); self.setProperty(id_length, QScriptValueImpl(eng, r2 - 1)); if (!r7.isValid()) return eng->undefinedValue(); return r7;}QScriptValueImpl Array::method_push(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){ QScriptValueImpl self = context->thisObject(); if (Instance *instance = Instance::get(self, classInfo)) { int pos = instance->value.size(); for (int i = 0; i < context->argumentCount(); ++i) { instance->value.assign(pos++, context->argument(i)); } return QScriptValueImpl(eng, instance->value.size()); } QScriptNameIdImpl *id_length = eng->idTable()->id_length; QScriptValueImpl r1 = self.property(id_length); quint32 n = r1.toUInt32(); for (int index = 0; index < context->argumentCount(); ++index, ++n) { QScriptValueImpl r3 = context->argument(index); QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(eng, n).toString()); self.setProperty(name, r3); } QScriptValueImpl r(eng, n); self.setProperty(id_length, r); return r;}QScriptValueImpl Array::method_reverse(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){ QScriptValueImpl self = context->thisObject(); if (Instance *instance = Instance::get(self, classInfo)) { int lo = 0, hi = instance->value.count () - 1; for (; lo < hi; ++lo, --hi) { QScriptValueImpl tmp = instance->value.at(lo); instance->value.assign(lo, instance->value.at(hi)); instance->value.assign(hi, tmp); } } else { QScriptNameIdImpl *id_length = eng->idTable()->id_length; QScriptValueImpl lengthValue = self.property(id_length); quint32 length = 0; if (lengthValue.isValid()) length = QScriptEnginePrivate::toUint32(lengthValue.toNumber()); const quint32 m = length / 2; for (quint32 i = 0; i < m; ++i) { quint32 j = length - i - 1; QScriptNameIdImpl *iid = eng->nameId(QScriptValueImpl(eng, i).toString()); QScriptNameIdImpl *jid = eng->nameId(QScriptValueImpl(eng, j).toString()); QScript::Member imember; QScriptValueImpl ibase; QScriptValueImpl ival; bool iok = self.resolve(iid, &imember, &ibase, QScriptValue::ResolvePrototype); if (iok) ibase.get(iid, &ival); else ival = eng->undefinedValue(); QScript::Member jmember; QScriptValueImpl jbase; QScriptValueImpl jval; bool jok = self.resolve(jid, &jmember, &jbase, QScriptValue::ResolvePrototype); if (jok) jbase.get(jid, &jval); else jval = eng->undefinedValue(); if (!jok) { if (iok) { if (ibase.strictlyEquals(self)) ibase.removeMember(imember); self.setProperty(jid, ival); } } else if (!iok) { self.setProperty(iid, jval); if (jbase.strictlyEquals(self)) jbase.removeMember(jmember); } else { if (self.strictlyEquals(ibase)) self.put(imember, jval); else self.setProperty(iid, jval); if (self.strictlyEquals(jbase)) self.put(jmember, ival); else self.setProperty(jid, ival); } } } return context->thisObject();}QScriptValueImpl Array::method_shift(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptNameIdImpl *id_length = eng->idTable()->id_length; QScriptValueImpl self = context->thisObject(); quint32 length = self.property(id_length).toUInt32(); if (length == 0) { self.setProperty(id_length, QScriptValueImpl(eng, 0)); return eng->undefinedValue(); } QScript::Member member; QScriptValueImpl base; QScriptValueImpl result = self.property(QLatin1String("0")); if (! result.isValid()) result = eng->undefinedValue(); for (quint32 index = 1; index < length; ++index) { QScriptNameIdImpl *k = eng->nameId(QScriptValueImpl(eng, index).toString()); QScriptNameIdImpl *k1 = eng->nameId(QScriptValueImpl(eng, index - 1).toString()); QScriptValueImpl v = self.property(k); QScriptValueImpl v1 = self.property(k1); if (v.isValid()) self.setProperty(k1, v); else if (v1.isValid() && self.resolve(k1, &member, &base, QScriptValue::ResolveLocal)) self.removeMember(member); } QScriptValueImpl len = QScriptValueImpl(eng, length - 1); if (self.resolve(eng->nameId(len.toString()), &member, &base, QScriptValue::ResolveLocal)) self.removeMember(member); self.setProperty(id_length, len); return (result);}QScriptValueImpl Array::method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScript::Array result; QScriptValueImpl start = context->argument(0); QScriptValueImpl end = context->argument(1); QScriptValueImpl self = context->thisObject(); QScriptNameIdImpl *id_length = eng->idTable()->id_length; qsreal r2 = self.property(id_length).toNumber(); quint32 r3 = QScriptEnginePrivate::toUint32(r2); qint32 r4 = qint32 (start.toInteger()); quint32 r5 = r4 < 0 ? qMax(quint32(r3 + r4), quint32(0)) : qMin(quint32(r4), r3); quint32 k = r5; qint32 r7 = end.isUndefined() ? r3 : qint32 (end.toInteger()); quint32 r8 = r7 < 0 ? qMax(quint32(r3 + r7), quint32(0)) : qMin(quint32(r7), r3); quint32 n = 0; for (; k < r8; ++k) { QString r11 = QScriptValueImpl(eng, k).toString(); QScriptValueImpl v = self.property(r11); if (v.isValid()) result.assign(n++, v); } return eng->newArray(result);}QScriptValueImpl Array::method_sort(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo){ QScriptValueImpl self = context->thisObject(); QScriptValueImpl comparefn = context->argument(0); if (Instance *instance = Instance::get(self, classInfo)) { instance->value.sort(comparefn); return context->thisObject(); } return context->throwNotImplemented(QLatin1String("Array.prototype.sort"));}QScriptValueImpl Array::method_splice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){ if (context->argumentCount() < 2) return eng->undefinedValue(); QScriptValueImpl self = context->thisObject(); qsreal start = context->argument(0).toInteger(); qsreal deleteCount = context->argument(1).toInteger(); QScriptValueImpl arrayCtor = eng->globalObject().property(QLatin1String("Array")); QScriptValueImpl a = arrayCtor.construct(); if (Instance *instance = Instance::get(self, classInfo)) { QVector<QScriptValueImpl> items; for (int i = 2; i < context->argumentCount(); ++i) items << context->argument(i); Instance *otherInstance = Instance::get(a, classInfo); Q_ASSERT(otherInstance); instance->value.splice(start, deleteCount, items, otherInstance->value); return a; } return context->throwNotImplemented(QLatin1String("Array.prototype.splice"));}QScriptValueImpl Array::method_unshift(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){ QScriptValueImpl self = context->thisObject(); QScriptNameIdImpl *id_length = eng->idTable()->id_length; QScriptValueImpl r1 = self.property(id_length); quint32 r2 = r1.isValid() ? QScriptEnginePrivate::toUint32(r1.toNumber()) : 0; quint32 r3 = quint32 (context->argumentCount()); quint32 k = r2; for (; k != 0; --k) { QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(eng, k - 1).toString()); QScriptNameIdImpl *r7 = eng->nameId(QScriptValueImpl(eng, k + r3 - 1).toString()); QScriptValueImpl r8 = self.property(r6); if (r8.isValid()) self.setProperty(r7, r8); else { QScript::Member member; QScriptValueImpl base; if (self.resolve(r7, &member, &base, QScriptValue::ResolveLocal)) self.removeMember(member); } } for (k = 0; k < r3; ++k) { QScriptValueImpl r16 = context->argument(k); QScriptNameIdImpl *r17 = eng->nameId(QScriptValueImpl(eng, k).toString()); self.setProperty(r17, r16); } QScriptValueImpl r(eng, r2 + r3); self.setProperty(id_length, r); return (r);}Array::Instance *Array::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass){ if (! klass || klass == object.classInfo()) return static_cast<Instance*> (object.objectData().data()); return 0;}} } // namespace QScript::Ecma#endif // QT_NO_SCRIPT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -