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

📄 qscriptcontext_p.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        qint32 v1 = eng->convertToNativeInt32(lhs);        qint32 v2 = eng->convertToNativeInt32(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, v1 << v2);        END_INPLACE_OPERATOR    }   Next();    I(InplaceMod):    {        BEGIN_INPLACE_OPERATOR        qsreal v1 = eng->convertToNativeDouble(lhs);        qsreal v2 = eng->convertToNativeDouble(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, fmod (v1, v2));        END_INPLACE_OPERATOR    }   Next();    I(InplaceMul):    {        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(InplaceOr):    {        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(InplaceRightShift):    {        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(InplaceURightShift):    {        BEGIN_INPLACE_OPERATOR        quint32 v1 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(lhs));        qint32 v2 = eng->convertToNativeInt32(rhs);        stackPtr -= 3;        eng->newNumber(stackPtr, v1 >> v2);        END_INPLACE_OPERATOR    }   Next();    I(InplaceXor):    {        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(MakeReference):    {        CHECK_TEMPSTACK(1);        eng->newReference(++stackPtr, QScriptValue::ResolveLocal);        ++iPtr;    }   Next();    I(TypeOf):    {        QScriptValueImpl object;        bool isReference = stackPtr[0].isReference();        if (! isReference) { // we have a value            object = stackPtr[0];        } else if (resolveField(eng, &stackPtr[-1], &object)) {            stackPtr -= 2;            if (hasUncaughtException()) {                stackPtr -= 1;                HandleException();            }        } else {            object = undefined;            stackPtr -= 2;        }        QString typeName;        switch (object.type()) {        case QScript::UndefinedType:            typeName = QLatin1String("undefined");            break;        case QScript::NullType:            typeName = QLatin1String("object");            break;        case QScript::ActivationType: // ### checkme            typeName = QLatin1String("global");            break;        case QScript::BooleanType:            typeName = QLatin1String("boolean");            break;        case QScript::IntegerType:        case QScript::NumberType:            typeName = QLatin1String("number");            break;        case QScript::StringType:            typeName = QLatin1String("string");            break;        case QScript::FunctionType:            typeName = QLatin1String("function");            break;        case QScript::VariantType:            typeName = QLatin1String("variant");            break;        default:            if (!stackPtr->isObject())                typeName = QLatin1String("undefined");            else                typeName = QLatin1String("object");            break;        }        eng->newString(stackPtr, typeName);        ++iPtr;    }   Next();    I(Line):    {        eng->maybeGC();        eng->maybeProcessEvents();        currentLine = iPtr->operand[0].m_int_value;        currentColumn = iPtr->operand[1].m_int_value;        ++iPtr;    }   Next();    I(Delete):    {        bool result;        if (! stackPtr[0].isReference())            result = true;        else {            QScriptValueImpl object = stackPtr[-2];            if (!object.isObject())                object = eng->toObject(object);            QScriptNameIdImpl *nameId = 0;            if (stackPtr[-1].isString())                nameId = stackPtr[-1].m_string_value;            else                nameId = eng->nameId(eng->convertToNativeString(stackPtr[-1]),                                     /*persistent=*/false);            result = object.deleteProperty(nameId, QScriptValue::ResolveScope);            stackPtr -= 2;        }        eng->newBoolean(stackPtr, result);        ++iPtr;    }   Next();    I(NewEnumeration): {        QScriptValueImpl e;        QScriptValueImpl object = eng->toObject(stackPtr[0]);        if (! object.isValid()) {            stackPtr -= 1;            throwTypeError(QLatin1String("QScript.VM.NewEnumeration"));            HandleException();        }        eng->enumerationConstructor->newEnumeration(&e, object);        *stackPtr = e;        ++iPtr;    }   Next();    I(ToFirstElement): {        QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]);        Q_ASSERT(e != 0);        e->toFirst();        --stackPtr;        ++iPtr;    }   Next();    I(HasNextElement): {        QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]);        Q_ASSERT(e != 0);        e->hasNext(this, stackPtr);        ++iPtr;    }   Next();    I(NextElement): {        // the Enumeration should be located below the result of I(Resolve)        if (! stackPtr[0].isReference()) {            throwTypeError(QLatin1String("QScript.VM.NextElement"));            HandleException();        }        QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[-3]);        if (! e) {            throwTypeError(QLatin1String("QScript.VM.NextElement"));            HandleException();        }        e->next(this, ++stackPtr);        ++iPtr;    }   Next();    I(Pop):    {        --stackPtr;        ++iPtr;    }   Next();    I(Sync):    {        m_result = *stackPtr;        --stackPtr;        ++iPtr;    }   Next();    I(Throw):    {        Q_ASSERT(stackPtr->isValid());        m_result = *stackPtr--;        m_state = QScriptContext::ExceptionState;    }   HandleException();    I(Ret):    {//        if (eng->context()->activationObject().m_object_value == eng->globalObject.m_object_value) {//            throwSyntaxError("return not in function");//            HandleException();//        }        Q_ASSERT(stackPtr->isValid());        m_result = *stackPtr--;        ++iPtr;    }   Done();    I(Halt):    {        ++iPtr;    }   Done();    I(EnterWith):    {        QScriptValueImpl object = eng->toObject(*stackPtr--);        if (! object.isValid()) {            throwTypeError(QLatin1String("value has no properties"));            HandleException();        }        QScriptValueImpl withObject;        eng->newObject(&withObject, object, eng->m_class_with);        withObject.m_object_value->m_scope = m_scopeChain;        m_scopeChain = withObject;        ++iPtr;    }   Next();    I(LeaveWith):    {        QScriptValueImpl withObject = m_scopeChain;        m_scopeChain = withObject.m_object_value->m_scope;        ++iPtr;    }   Next();    I(BeginCatch):    {        // result contains the thrown object        QScriptValueImpl object;        eng->newObject(&object, undefined); // ### prototype        QScript::Member member;        CREATE_MEMBER(object, iPtr->operand[0].m_string_value, &member, /*flags=*/0);        object.put(member, m_result);        // make catch-object head of scopechain        object.m_object_value->m_scope = m_scopeChain;        m_scopeChain = object;        catching = true;        ++iPtr;    }   Next();    I(EndCatch):    {        // remove catch-object from scopechain        QScriptValueImpl object = m_scopeChain;        m_scopeChain = object.m_object_value->m_scope;        catching = false;        ++iPtr;    }   Next();#ifndef Q_SCRIPT_DIRECT_CODE    I(Dummy):    { ; }    } // end switch#endifLhandle_exception:    errorLineNumber = currentLine;Ldone:    Q_ASSERT(m_result.isValid());    if (m_state == QScriptContext::ExceptionState) {        if (catching) {            // exception thrown in catch -- clean up scopechain            QScriptValueImpl object = m_scopeChain;            m_scopeChain = object.m_object_value->m_scope;            catching = false;        }        // see if we have an exception handler in this context        int offset = iPtr - code->firstInstruction;        for (int i = 0; i < code->exceptionHandlers.count(); ++i) {            QScript::ExceptionHandlerDescriptor e = code->exceptionHandlers.at(i);            if (offset >= e.startInstruction() && offset <= e.endInstruction()) {                // go to the handler                iPtr = code->firstInstruction + e.handlerInstruction();                recover();                goto Ltop;            }        }    }    eng->maybeGC();    m_code = oldCode;}QScriptValueImpl QScriptContextPrivate::throwError(QScriptContext::Error error, const QString &text){    QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());    QScript::Ecma::Error *ctor = eng_p->errorConstructor;    switch (error) {    case QScriptContext::ReferenceError:        ctor->newReferenceError(&m_result, text);        break;    case QScriptContext::SyntaxError:        ctor->newSyntaxError(&m_result, text);        break;    case QScriptContext::TypeError:        ctor->newTypeError(&m_result, text);        break;    case QScriptContext::RangeError:        ctor->newRangeError(&m_result, text);        break;    case QScriptContext::URIError:        ctor->newURIError(&m_result, text);        break;    case QScriptContext::UnknownError:    default:        ctor->newError(&m_result, text);    }    setDebugInformation(&m_result);    m_state = QScriptContext::ExceptionState;    return m_result;}QString QScriptContextPrivate::fileName() const{    if (!m_code)        return QString();    return m_code->astPool->fileName();}QString QScriptContextPrivate::functionName() const{    if (!m_callee.isValid())        return QString();    QScriptFunction *fun = m_callee.toFunction();    Q_ASSERT(fun);    return fun->functionName();}void QScriptContextPrivate::setDebugInformation(QScriptValueImpl *error) const{    QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine());    error->setProperty(QLatin1String("lineNumber"), QScriptValueImpl(eng_p, currentLine));    if (!fileName().isEmpty())        error->setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, fileName()));    const QScriptContext *ctx = q_func();    QScriptValueImpl stackArray = eng_p->newArray();    int i = 0;    while (ctx) {        QScriptValueImpl obj = eng_p->newObject();        obj.setProperty(QLatin1String("frame"), QScriptValuePrivate::valueOf(ctx->activationObject()));        const QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(ctx);        obj.setProperty(QLatin1String("lineNumber"), QScriptValueImpl(eng_p, ctx_p->currentLine));        if (!ctx_p->fileName().isEmpty())            obj.setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, ctx_p->fileName()));        if (!ctx_p->functionName().isEmpty())            obj.setProperty(QLatin1String("functionName"), QScriptValueImpl(eng_p, ctx_p->functionName()));        stackArray.setProperty(i, obj);        ctx = ctx->parentContext();        ++i;    }

⌨️ 快捷键说明

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