28 QQmlJSBasicBlocks(
const QV4::Compiler::Context *context,
29 const QV4::Compiler::JSUnitGenerator *unitGenerator,
30 const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger)
31 : QQmlJSCompilePass(unitGenerator, typeResolver, logger), m_context{ context }
35 ~QQmlJSBasicBlocks() =
default;
37 QQmlJSCompilePass::BlocksAndAnnotations run(
const Function *function,
38 QQmlJSAotCompiler::Flags compileFlags,
39 bool &basicBlocksValidationFailed);
41 struct BasicBlocksValidationResult {
bool success =
true; QString errorMessage; };
42 BasicBlocksValidationResult basicBlocksValidation();
44 static BasicBlocks::iterator basicBlockForInstruction(BasicBlocks &blocks,
int offset)
46 return findBasicBlockForInstruction(blocks, offset);
48 static BasicBlocks::const_iterator constBasicBlockForInstruction(
const BasicBlocks &blocks,
51 return findBasicBlockForInstruction(blocks, offset);
54 QList<ObjectOrArrayDefinition> objectAndArrayDefinitions()
const;
57 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type type) override;
58 void endInstruction(QV4::Moth::Instr::Type type) override;
60 void generate_Jump(
int offset) override;
61 void generate_JumpTrue(
int offset) override;
62 void generate_JumpFalse(
int offset) override;
63 void generate_JumpNoException(
int offset) override;
64 void generate_JumpNotUndefined(
int offset) override;
65 void generate_IteratorNext(
int value,
int offset) override;
66 void generate_GetOptionalLookup(
int index,
int offset) override;
68 void generate_Ret() override;
69 void generate_ThrowException() override;
71 void generate_DefineArray(
int argc,
int argv) override;
72 void generate_DefineObjectLiteral(
int internalClassId,
int argc,
int args) override;
73 void generate_Construct(
int func,
int argc,
int argv) override;
75 enum JumpMode { Unconditional, Conditional };
76 void processJump(
int offset, JumpMode mode);
78 void dumpBasicBlocks();
81 template <
typename Container,
typename Iterator =
decltype(Container().lower_bound(1))>
82 static Iterator findBasicBlockForInstruction(Container &container,
int instructionOffset)
84 auto block = container.lower_bound(instructionOffset);
85 if (block == container.end() || block->first != instructionOffset)
90 const QV4::Compiler::Context *m_context;
91 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;
92 bool m_skipUntilNextLabel =
false;
93 bool m_hadBackJumps =
false;