⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qscriptcontext_p.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        qsreal v1 = eng->convertToNativeDouble(stackPtr[-1]);        qsreal v2 = eng->convertToNativeDouble(stackPtr[0]);        eng->newNumber(--stackPtr, v1 * v2);        ++iPtr;    }   Next();    I(StrictEqual):    {        bool v = strict_eq_cmp(stackPtr[-1], stackPtr[0]);        eng->newBoolean(--stackPtr, v);        ++iPtr;    }   Next();    I(StrictNotEqual):    {        bool v = ! strict_eq_cmp(stackPtr[-1], stackPtr[0]);        eng->newBoolean(--stackPtr, v);        ++iPtr;    }   Next();    I(Sub):    {        qsreal v1 = eng->convertToNativeDouble(stackPtr[-1]);        qsreal v2 = eng->convertToNativeDouble(stackPtr[0]);        eng->newNumber(--stackPtr, v1 - v2);        ++iPtr;    }   Next();    I(UnaryMinus):    {        qsreal v1 = eng->convertToNativeDouble(*stackPtr);        eng->newNumber(stackPtr, -v1);        ++iPtr;    }   Next();    I(UnaryPlus):    {        qsreal v1 = eng->convertToNativeDouble(*stackPtr);        eng->newNumber(stackPtr, +v1);        ++iPtr;    }   Next();    I(Branch):    {        iPtr += iPtr->operand[0].m_int_value;    }   Next();    I(BranchFalse):    {        if (! eng->convertToNativeBoolean(*stackPtr--))            iPtr += iPtr->operand[0].m_int_value;        else            ++iPtr;    }   Next();    I(BranchTrue):    {        if (eng->convertToNativeBoolean(*stackPtr--))            iPtr += iPtr->operand[0].m_int_value;        else            ++iPtr;    }   Next();    I(NewClosure):    {        CHECK_TEMPSTACK(1);        QScript::AST::FunctionExpression *expr = static_cast<QScript::AST::FunctionExpression *> (iPtr->operand[0].m_ptr_value);#ifndef Q_SCRIPT_NO_JOINED_FUNCTION        if (QScript::Code *code = eng->findCode(functionBody)) {            QScriptValueImpl value = code->value;            if (isValid(value)) {                QScriptObject *instance = value.m_object_value;                Q_ASSERT(instance != 0);                if (instance->m_scope.m_object_value == m_scopeChain.m_object_value)                {                    *++stackPtr = value;                    ++iPtr;                    Next();                }            }        }#endif        QScript::ScriptFunction *function = new QScript::ScriptFunction(expr, code->astPool);        // update the formals        for (QScript::AST::FormalParameterList *it = expr->formals; it != 0; it = it->next) {            function->formals.append(it->name);        }        function->length = function->formals.count();        eng->functionConstructor->newFunction(++stackPtr, function);        QScriptObject *instance = stackPtr->m_object_value;        // initialize [[scope]]        instance->m_scope = m_scopeChain;        // create and initialize `prototype'        QScriptValueImpl proto;        eng->objectConstructor->newObject(&proto);        QScript::Member member;        CREATE_MEMBER(proto, eng->idTable()->id_constructor, &member,                      QScriptValue::Undeletable                      | QScriptValue::SkipInEnumeration);        proto.put(member, *stackPtr);        stackPtr->createMember(eng->idTable()->id_prototype, &member,                                       QScriptValue::Undeletable);        stackPtr->put(member, proto);        ++iPtr;    }   Next();    I(Incr):    {        if (! stackPtr[0].isReference()) {            stackPtr -= 1;            throwSyntaxError(QLatin1String("invalid increment operand"));            HandleException();        }        BEGIN_PREFIX_OPERATOR        qsreal x = eng->convertToNativeDouble(value);        eng->newNumber(&value, x + 1);        END_PREFIX_OPERATOR    }   Next();    I(Decr):    {        if (! stackPtr[0].isReference()) {            stackPtr -= 1;            throwSyntaxError(QLatin1String("invalid decrement operand"));            HandleException();        }        BEGIN_PREFIX_OPERATOR        qsreal x = eng->convertToNativeDouble(value);        eng->newNumber(&value, x - 1);        END_PREFIX_OPERATOR    }   Next();    I(PostIncr):    {        if (! stackPtr[0].isReference()) {            stackPtr -= 1;            throwSyntaxError(QLatin1String("invalid increment operand"));            HandleException();        }        QScriptValue::ResolveFlags mode;        mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value)               | QScriptValue::ResolvePrototype;        --stackPtr;        const QScriptValueImpl &object = stackPtr[-1];        QScriptNameIdImpl *memberName = 0;        if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique)            memberName = stackPtr[0].m_string_value;        else            memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false);        QScript::Member member;        QScriptValueImpl base;        QScriptValueImpl value;        QScriptObject *instance = object.m_object_value;        const bool isMemberAssignment = (instance != m_scopeChain.m_object_value);        if (instance->findMember(memberName, &member)) {            if (!member.isGetterOrSetter()) {                QScriptValueImpl &r = instance->reference(member);                if (r.isNumber()) {                    eng->newNumber(--stackPtr, r.m_number_value);                    r.incr();                    ++iPtr;                    Next();                }            }            base = object;        } else if (!object.resolve_helper(memberName, &member, &base, mode)) {            if (!isMemberAssignment) {                stackPtr -= 2;                throwNotDefined(memberName);                HandleException();            }            base = object;            CREATE_MEMBER(base, memberName, &member, /*flags=*/0);            base.put(member, undefined);        }        QScriptValueImpl getter;        QScriptValueImpl setter;        base.get(member, &value);        if (hasUncaughtException()) {            stackPtr -= 2;            HandleException();        } else if (member.isGetterOrSetter()) {            if (member.isGetter()) {                getter = value;                if (!member.isSetter() && !base.m_object_value->findSetter(&member)) {                    stackPtr -= 2;                    throwError(QLatin1String("No setter defined"));                    HandleException();                }                base.get(member, &setter);            } else {                setter = value;                QScript::Member tmp = member;                if (!base.m_object_value->findGetter(&member)) {                    stackPtr -= 2;                    throwError(QLatin1String("No getter defined"));                    HandleException();                }                base.get(member, &getter);                member = tmp;            }            value = getter.call(object);            if (hasUncaughtException()) {                stackPtr -= 2;                Done();            }        }        qsreal x = eng->convertToNativeDouble(value);        eng->newNumber(&value, x + 1);        if (member.isSetter()) {            setter.call(object, QScriptValueImplList() << value);            if (hasUncaughtException()) {                stackPtr -= 2;                Done();            }        } else {            if (isMemberAssignment && (base.m_object_value != object.m_object_value)) {                base = object;                CREATE_MEMBER(base, memberName, &member, /*flags=*/0);            }            if (member.isWritable()) {                base.put(member, value);                if (hasUncaughtException()) {                    stackPtr -= 2;                    HandleException();                }            }        }        eng->newNumber(--stackPtr, x);        ++iPtr;    }   Next();    I(PostDecr):    {        if (! stackPtr[0].isReference()) {            stackPtr -= 1;            throwSyntaxError(QLatin1String("invalid decrement operand"));            HandleException();        }        QScriptValue::ResolveFlags mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value);        --stackPtr;        const QScriptValueImpl &object = stackPtr[-1];        QScriptNameIdImpl *memberName = 0;        if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique)            memberName = stackPtr[0].m_string_value;        else            memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false);        QScript::Member member;        QScriptValueImpl base;        QScriptValueImpl value;        QScriptObject *instance = object.m_object_value;        const bool isMemberAssignment = (instance != m_scopeChain.m_object_value);        if (instance->findMember(memberName, &member)) {            if (!member.isGetterOrSetter()) {                QScriptValueImpl &r = instance->reference(member);                if (r.isNumber()) {                    eng->newNumber(--stackPtr, r.m_number_value);                    r.decr();                    ++iPtr;                    Next();                }            }            base = object;        } else {            if (! object.resolve_helper(memberName, &member, &base, mode)) {                if (!isMemberAssignment) {                    stackPtr -= 2;                    throwNotDefined(memberName);                    HandleException();                }                base = object;                CREATE_MEMBER(base, memberName, &member, /*flags=*/0);                base.put(member, undefined);            }        }        QScriptValueImpl getter;        QScriptValueImpl setter;        base.get(member, &value);        if (hasUncaughtException()) {            stackPtr -= 2;            HandleException();        } else if (member.isGetterOrSetter()) {            if (member.isGetter()) {                getter = value;                if (!member.isSetter() && !base.m_object_value->findSetter(&member)) {                    stackPtr -= 2;                    throwError(QLatin1String("No setter defined"));                    HandleException();                }                base.get(member, &setter);            } else {                setter = value;                QScript::Member tmp = member;                if (!base.m_object_value->findGetter(&member)) {                    stackPtr -= 2;                    throwError(QLatin1String("No getter defined"));                    HandleException();                }                base.get(member, &getter);                member = tmp;            }            value = getter.call(object);            if (hasUncaughtException()) {                stackPtr -= 2;                Done();            }        }        qsreal x = eng->convertToNativeDouble(value);        eng->newNumber(&value, x - 1);        if (member.isSetter()) {            setter.call(object, QScriptValueImplList() << value);            if (hasUncaughtException()) {                stackPtr -= 2;                Done();            }        } else {            if (isMemberAssignment && (base.m_object_value != object.m_object_value)) {                base = object;                CREATE_MEMBER(base, memberName, &member, /*flags=*/0);            }            if (member.isWritable()) {                base.put(member, value);                if (hasUncaughtException()) {                    stackPtr -= 2;                    HandleException();                }            }        }        eng->newNumber(--stackPtr, x);        ++iPtr;    }   Next();    I(InplaceAdd):    {        BEGIN_INPLACE_OPERATOR        if (lhs.isString() || rhs.isString()) {            if (lhs.isString() && !lhs.m_string_value->unique) {                lhs.m_string_value->s += eng->convertToNativeString(rhs);                stackPtr -= 3;                *stackPtr = lhs;            } else {                QString tmp = eng->convertToNativeString(lhs);                tmp += eng->convertToNativeString(rhs);                stackPtr -= 3;                eng->newString(stackPtr, tmp);            }        } else {            qsreal tmp = eng->convertToNativeDouble(lhs);            tmp += eng->convertToNativeDouble(rhs);            stackPtr -= 3;            eng->newNumber(stackPtr, tmp);        }        END_INPLACE_OPERATOR    }   Next();    I(InplaceSub):    {        BEGIN_INPLACE_OPERATOR        qsreal v1 = eng->convertToNativeDouble(lhs);        qsreal v2 = eng->convertToNativeDouble(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, v1 - v2);        END_INPLACE_OPERATOR    }   Next();    I(InplaceAnd):    {        BEGIN_INPLACE_OPERATOR        qint32 v1 = eng->convertToNativeInt32(lhs);        qint32 v2 = eng->convertToNativeInt32(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, v1 & v2);        END_INPLACE_OPERATOR    }   Next();    I(InplaceDiv):    {        BEGIN_INPLACE_OPERATOR        qsreal v1 = eng->convertToNativeDouble(lhs);        qsreal v2 = eng->convertToNativeDouble(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, v1 / v2);        END_INPLACE_OPERATOR    }   Next();    I(InplaceLeftShift):    {        BEGIN_INPLACE_OPERATOR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -