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
45 basicBlockForInstruction(QFlatMap<
int, BasicBlock> &container,
int instructionOffset);
46 static BasicBlocks::const_iterator
47 basicBlockForInstruction(
const QFlatMap<
int, BasicBlock> &container,
int instructionOffset);
49 QList<ObjectOrArrayDefinition> objectAndArrayDefinitions()
const;
52 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type type) override;
53 void endInstruction(QV4::Moth::Instr::Type type) override;
55 void generate_Jump(
int offset) override;
56 void generate_JumpTrue(
int offset) override;
57 void generate_JumpFalse(
int offset) override;
58 void generate_JumpNoException(
int offset) override;
59 void generate_JumpNotUndefined(
int offset) override;
60 void generate_IteratorNext(
int value,
int offset) override;
61 void generate_GetOptionalLookup(
int index,
int offset) override;
63 void generate_Ret() override;
64 void generate_ThrowException() override;
66 void generate_DefineArray(
int argc,
int argv) override;
67 void generate_DefineObjectLiteral(
int internalClassId,
int argc,
int args) override;
68 void generate_Construct(
int func,
int argc,
int argv) override;
70 enum JumpMode { Unconditional, Conditional };
71 void processJump(
int offset, JumpMode mode);
73 void dumpBasicBlocks();
76 const QV4::Compiler::Context *m_context;
77 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;
78 bool m_skipUntilNextLabel =
false;
79 bool m_hadBackJumps =
false;