4#ifndef QQMLJSCOMPILEPASS_P_H
5#define QQMLJSCOMPILEPASS_P_H
18#include <private/qqmljslogger_p.h>
19#include <private/qqmljsregistercontent_p.h>
20#include <private/qqmljsscope_p.h>
21#include <private/qqmljstyperesolver_p.h>
22#include <private/qv4bytecodehandler_p.h>
23#include <private/qv4compiler_p.h>
24#include <private/qflatmap_p.h>
50 return a.content ==
b.content &&
a.canMove ==
b.canMove
51 &&
a.affectedBySideEffects ==
b.affectedBySideEffects;
97 return it.value().content;
103 return m_changedRegister;
108 m_changedRegister = std::move(content);
109 m_changedRegisterIndex = registerIndex;
128 target.affectedBySideEffects =
source.affectedBySideEffects;
139 m_readRegisters = std::move(readReagisters);
145 return m_readRegisters[registerIndex].content;
150 auto it = m_readRegisters.
find(registerIndex);
151 return it != m_readRegisters.
end() &&
it->second.canMove;
156 auto it = m_readRegisters.
find(registerIndex);
157 return it != m_readRegisters.
end() &&
it->second.affectedBySideEffects;
167 return m_readRegisters.
contains(registerIndex);
177 it.value().affectedBySideEffects =
true;
187 return m_readRegisters.
begin().key();
194 bool m_hasSideEffects =
false;
195 bool m_isRename =
false;
257 if (instruction == annotations.
constEnd())
260 newState.setHasSideEffects(instruction->second.hasSideEffects);
261 newState.setReadRegisters(instruction->second.readRegisters);
262 newState.setIsRename(instruction->second.isRename);
264 for (
auto it = instruction->second.typeConversions.
begin(),
265 end = instruction->second.typeConversions.end();
it !=
end; ++
it) {
271 newState.setRegister(instruction->second.changedRegisterIndex,
272 instruction->second.changedRegister);
283 auto item = std::lower_bound(entries.begin(), entries.end(), instructionOffset,
287 return item->location;
313 case Type::PopContext:
314 case Type::PopScriptContext:
315 case Type::CreateCallContext:
316 case Type::CreateCallContext_Wide:
317 case Type::PushCatchContext:
318 case Type::PushCatchContext_Wide:
319 case Type::PushWithContext:
320 case Type::PushWithContext_Wide:
321 case Type::PushBlockContext:
322 case Type::PushBlockContext_Wide:
323 case Type::CloneBlockContext:
324 case Type::CloneBlockContext_Wide:
325 case Type::PushScriptContext:
326 case Type::PushScriptContext_Wide:
bool contains(const Key &key) const
iterator find(const Key &key)
const_iterator constEnd() const
size_type size() const noexcept
qsizetype size() const noexcept
void generate_YieldStar() override
void generate_CallValue(int, int, int) override
void generate_LoadRuntimeString(int) override
void generate_GetOptionalLookup(int, int) override
void generate_LoadImport(int) override
void generate_IteratorNextForYieldStar(int, int) override
void generate_LoadName(int) override
void generate_Yield() override
int firstRegisterIndex() const
void generate_DeleteName(int) override
void generate_DeleteProperty(int, int) override
void generate_CreateUnmappedArgumentsObject() override
void generate_IteratorClose(int) override
QQmlJSCompilePass(const QV4::Compiler::JSUnitGenerator *jsUnitGenerator, const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger)
const QV4::Compiler::JSUnitGenerator * m_jsUnitGenerator
void generate_CmpEqNull() override
bool isArgument(int registerIndex) const
void generate_BitAndConst(int) override
void generate_CmpEq(int) override
void generate_UnwindToLabel(int, int) override
static bool instructionManipulatesContext(QV4::Moth::Instr::Type type)
void generate_MoveRegExp(int, int) override
void generate_PopScriptContext() override
QQmlJS::SourceLocation sourceLocation(int instructionOffset) const
void generate_UCompl() override
void generate_LoadFalse() override
void generate_CallGlobalLookup(int, int, int) override
void generate_UShrConst(int) override
void generate_CmpStrictNotEqual(int) override
void generate_CallPossiblyDirectEval(int, int) override
void generate_CmpLt(int) override
void generate_LoadQmlContextPropertyLookup(int) override
const Function * m_function
void generate_CloneBlockContext() override
void generate_UNot() override
void generate_Shl(int) override
void generate_LoadZero() override
void generate_Increment() override
void generate_CheckException() override
const QQmlJSTypeResolver * m_typeResolver
QQmlJS::DiagnosticMessage * m_error
void generate_SetUnwindHandler(int) override
void generate_InitializeBlockDeadTemporalZone(int, int) override
void generate_CreateClass(int, int, int) override
void generate_LoadClosure(int) override
void generate_TypeofValue() override
void generate_ConstructWithSpread(int, int, int) override
void generate_JumpTrue(int) override
void generate_StoreProperty(int, int) override
void generate_JumpFalse(int) override
void setError(const QString &message)
void generate_IteratorNext(int, int) override
void generate_UnwindDispatch() override
void generate_As(int) override
void generate_SetLookup(int, int) override
void generate_LoadTrue() override
void generate_ShlConst(int) override
void generate_CallWithSpread(int, int, int, int) override
void generate_LoadProperty(int) override
void generate_BitXor(int) override
void generate_StoreReg(int) override
void generate_LoadUndefined() override
State initialState(const Function *function)
void generate_Sub(int) override
void generate_LoadScopedLocal(int, int) override
void generate_StoreNameStrict(int) override
void generate_CreateCallContext() override
void generate_CmpGe(int) override
void generate_LoadConst(int) override
void generate_ToObject() override
void generate_SetException() override
void generate_CmpLe(int) override
void generate_Resume(int) override
void generate_StoreNameSloppy(int) override
void generate_Construct(int, int, int) override
void generate_Jump(int) override
void generate_CreateRestParameter(int) override
void generate_LoadReg(int) override
void generate_LoadGlobalLookup(int) override
void generate_StoreElement(int, int) override
void generate_Add(int) override
void generate_UMinus() override
void generate_CallName(int, int, int) override
void generate_Decrement() override
void generate_PushScriptContext(int) override
void generate_GetException() override
void generate_PushBlockContext(int) override
void generate_LoadInt(int) override
void generate_LoadElement(int) override
void generate_CallQmlContextPropertyLookup(int, int, int) override
void generate_Shr(int) override
void generate_PushWithContext() override
void generate_TypeofName(int) override
void generate_CallWithReceiver(int, int, int, int) override
void generate_BitXorConst(int) override
State nextStateFromAnnotations(const State &oldState, const InstructionAnnotations &annotations)
void generate_LoadLocal(int) override
void generate_CmpNeInt(int) override
QQmlJS::SourceLocation currentSourceLocation() const
void generate_MoveReg(int, int) override
void generate_Debug() override
void generate_StoreLocal(int) override
void generate_CmpNe(int) override
void generate_GetIterator(int) override
void generate_CmpGt(int) override
void generate_UPlus() override
void generate_CmpNeNull() override
void generate_DestructureRestElement() override
void generate_GetTemplateObject(int) override
void generate_CallProperty(int, int, int, int) override
void generate_StoreSuperProperty(int) override
void generate_BitOrConst(int) override
void generate_Exp(int) override
void generate_UShr(int) override
void generate_ShrConst(int) override
void generate_StoreScopedLocal(int, int) override
void generate_GetLookup(int) override
void generate_DefineArray(int, int) override
void generate_LoadSuperProperty(int) override
void generate_JumpNotUndefined(int) override
void generate_CmpStrictEqual(int) override
void generate_CreateMappedArgumentsObject() override
void generate_BitOr(int) override
void generate_Ret() override
void generate_PushCatchContext(int, int) override
void generate_MoveConst(int, int) override
void generate_ThrowException() override
void generate_TailCall(int, int, int, int) override
void generate_DeadTemporalZoneCheck(int) override
void generate_ThrowOnNullOrUndefined() override
void generate_JumpNoException(int) override
void generate_PopContext() override
void generate_LoadNull() override
void generate_BitAnd(int) override
void generate_ConvertThisToObject() override
void generate_Mod(int) override
void generate_CmpIn(int) override
void generate_CmpInstanceOf(int) override
void setError(const QString &message, int instructionOffset)
void generate_CmpEqInt(int) override
void generate_Mul(int) override
void generate_DefineObjectLiteral(int, int, int) override
QQmlJSRegisterContent argumentType(int registerIndex) const
void generate_CallPropertyLookup(int, int, int, int) override
void generate_DeclareVar(int, int) override
void generate_Div(int) override
void generate_LoadOptionalProperty(int, int) override
void generate_LoadSuperConstructor() override
bool isConversion() const
\macro QT_RESTRICTED_CAST_FROM_ASCII
int currentInstructionOffset() const
QSet< QString >::iterator it
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction function
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint GLsizei const GLchar * message
GLenum GLuint GLintptr offset
GLsizei GLsizei GLchar * source
QList< QQmlJSRegisterContent > argumentTypes
QQmlJSScopesById addressableScopes
QQmlJSScope::ConstPtr qmlScope
const SourceLocationTable * sourceLocations
QQmlJSScope::ConstPtr returnType
QList< QQmlJSRegisterContent > registerTypes
VirtualRegisters readRegisters
VirtualRegisters typeConversions
QQmlJSRegisterContent changedRegister
int renameSourceRegisterIndex() const
const QQmlJSRegisterContent & accumulatorIn() const
VirtualRegisters registers
void addReadAccumulator(const QQmlJSRegisterContent ®)
void clearChangedRegister()
int changedRegisterIndex() const
VirtualRegisters takeReadRegisters() const
bool canMoveReadRegister(int registerIndex) const
bool isRegisterAffectedBySideEffects(int registerIndex) const
void setReadRegisters(VirtualRegisters readReagisters)
bool readsRegister(int registerIndex) const
QQmlJSRegisterContent readRegister(int registerIndex) const
const QQmlJSRegisterContent & changedRegister() const
void setIsRename(bool isRename)
bool hasSideEffects() const
void setRegister(int registerIndex, QQmlJSRegisterContent content)
void addReadRegister(int registerIndex, const QQmlJSRegisterContent ®)
void setHasSideEffects(bool hasSideEffects)
QQmlJSRegisterContent readAccumulator() const
const QQmlJSRegisterContent & accumulatorOut() const
friend bool operator==(const VirtualRegister &a, const VirtualRegister &b)
bool affectedBySideEffects
QQmlJSRegisterContent content