Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmljsbasicblocks_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
5#ifndef QQMLJSBASICBLOCKS_P_H
6#define QQMLJSBASICBLOCKS_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17
18
19#include <private/qflatmap_p.h>
20#include <private/qqmljscompilepass_p.h>
21#include <private/qqmljscompiler_p.h>
22
24
25class Q_QMLCOMPILER_EXPORT QQmlJSBasicBlocks : public QQmlJSCompilePass
26{
27public:
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 }
32 {
33 }
34
35 ~QQmlJSBasicBlocks() = default;
36
37 QQmlJSCompilePass::BlocksAndAnnotations run(const Function *function,
38 QQmlJSAotCompiler::Flags compileFlags,
39 bool &basicBlocksValidationFailed);
40
41 struct BasicBlocksValidationResult { bool success = true; QString errorMessage; };
42 BasicBlocksValidationResult basicBlocksValidation();
43
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);
48
49 QList<ObjectOrArrayDefinition> objectAndArrayDefinitions() const;
50
51private:
52 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type type) override;
53 void endInstruction(QV4::Moth::Instr::Type type) override;
54
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;
62
63 void generate_Ret() override;
64 void generate_ThrowException() override;
65
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;
69
70 enum JumpMode { Unconditional, Conditional };
71 void processJump(int offset, JumpMode mode);
72
73 void dumpBasicBlocks();
74 void dumpDOTGraph();
75
76 const QV4::Compiler::Context *m_context;
77 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;
78 bool m_skipUntilNextLabel = false;
79 bool m_hadBackJumps = false;
80};
81
82QT_END_NAMESPACE
83
84#endif // QQMLJSBASICBLOCKS_P_H