📄 qscriptcontext_p.cpp
字号:
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 + -