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