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;
140 return it.value().content;
150 return m_changedRegister;
157 lookups[lookupIndex] = { content,
false,
false };
159 m_changedRegister = std::move(content);
160 m_changedRegisterIndex = registerIndex;
179 target.affectedBySideEffects =
source.affectedBySideEffects;
190 m_readRegisters = std::move(readReagisters);
196 return m_readRegisters[registerIndex].content;
201 auto it = m_readRegisters.
find(registerIndex);
202 return it != m_readRegisters.
end() &&
it->second.canMove;
207 auto it = m_readRegisters.
find(registerIndex);
208 return it != m_readRegisters.
end() &&
it->second.affectedBySideEffects;
225 return m_readRegisters.
contains(registerIndex);
237 it.value().affectedBySideEffects =
true;
240 it.value().affectedBySideEffects =
true;
255 return m_readRegisters.
begin().key();
262 bool m_hasSideEffects =
false;
263 bool m_isRename =
false;
306 for (
int i = 0,
end = function->argumentTypes.size();
i <
end; ++
i) {
310 for (
int i = 0,
end = function->registerTypes.size();
i !=
end; ++
i)
335 if (instruction == annotations.
constEnd())
338 newState.markSideEffects(instruction->second.hasSideEffects);
339 newState.setReadRegisters(instruction->second.readRegisters);
340 newState.setIsRename(instruction->second.isRename);
342 for (
auto it = instruction->second.typeConversions.
begin(),
343 end = instruction->second.typeConversions.end();
it !=
end; ++
it) {
349 newState.setRegister(instruction->second.changedRegisterIndex,
350 instruction->second.changedRegister);
361 auto item = std::lower_bound(entries.begin(), entries.end(), instructionOffset,
365 return item->location;
391 case Type::PopContext:
392 case Type::PopScriptContext:
393 case Type::CreateCallContext:
394 case Type::CreateCallContext_Wide:
395 case Type::PushCatchContext:
396 case Type::PushCatchContext_Wide:
397 case Type::PushWithContext:
398 case Type::PushWithContext_Wide:
399 case Type::PushBlockContext:
400 case Type::PushBlockContext_Wide:
401 case Type::CloneBlockContext:
402 case Type::CloneBlockContext_Wide:
403 case Type::PushScriptContext:
404 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_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
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
QFlatMap< int, InstructionAnnotation > InstructionAnnotations
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
InstructionAnnotations m_annotations
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_IteratorClose() 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_IteratorNextForYieldStar(int, int, 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
BasicBlocks m_basicBlocks
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
QQmlJSCompilePass(const QV4::Compiler::JSUnitGenerator *jsUnitGenerator, const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger, BasicBlocks basicBlocks={}, InstructionAnnotations annotations={})
void generate_LoadSuperConstructor() override
int resultLookupIndex() 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.
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint GLsizei const GLchar * message
GLenum GLuint GLintptr offset
GLsizei GLsizei GLchar * source
QList< int > readRegisters
QList< QQmlJSScope::ConstPtr > readTypes
InstructionAnnotations annotations
QList< QQmlJSRegisterContent > argumentTypes
QQmlJSScopesById addressableScopes
QQmlJSScope::ConstPtr qmlScope
const SourceLocationTable * sourceLocations
QQmlJSRegisterContent returnType
QList< QQmlJSRegisterContent > registerTypes
VirtualRegisters readRegisters
VirtualRegisters typeConversions
QQmlJSRegisterContent changedRegister
int renameSourceRegisterIndex() const
const QQmlJSRegisterContent & accumulatorIn() const
The accumulatorIn is the input register of the current instruction.
VirtualRegisters registers
void addReadAccumulator(const QQmlJSRegisterContent ®)
void clearChangedRegister()
int changedRegisterIndex() const
VirtualRegisters takeReadRegisters() const
bool canMoveReadRegister(int registerIndex) const
void markSideEffects(bool hasSideEffects)
bool isRegisterAffectedBySideEffects(int registerIndex) const
void setReadRegisters(VirtualRegisters readReagisters)
bool readsRegister(int registerIndex) const
QQmlJSRegisterContent readRegister(int registerIndex) const
const QQmlJSRegisterContent & changedRegister() const
void applySideEffects(bool hasSideEffects)
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
The readAccumulator is the register content expected by the current instruction.
const QQmlJSRegisterContent & accumulatorOut() const
The accumulatorOut is the output register of the current instruction.
friend bool operator==(const VirtualRegister &a, const VirtualRegister &b)
bool affectedBySideEffects
QQmlJSRegisterContent content