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 basicBlockForInstruction(BasicBlocks &blocks, int offset)
45 {
46 return findBasicBlockForInstruction(blocks, offset);
47 }
48 static BasicBlocks::const_iterator constBasicBlockForInstruction(const BasicBlocks &blocks,
49 int offset)
50 {
51 return findBasicBlockForInstruction(blocks, offset);
52 }
53
54 QList<ObjectOrArrayDefinition> objectAndArrayDefinitions() const;
55
56private:
57 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type type) override;
58 void endInstruction(QV4::Moth::Instr::Type type) override;
59
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;
67
68 void generate_Ret() override;
69 void generate_ThrowException() override;
70
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;
74
75 enum JumpMode { Unconditional, Conditional };
76 void processJump(int offset, JumpMode mode);
77
78 void dumpBasicBlocks();
79 void dumpDOTGraph();
80
81 template <typename Container, typename Iterator = decltype(Container().lower_bound(1))>
82 static Iterator findBasicBlockForInstruction(Container &container, int instructionOffset)
83 {
84 auto block = container.lower_bound(instructionOffset);
85 if (block == container.end() || block->first != instructionOffset)
86 --block;
87 return block;
88 }
89
90 const QV4::Compiler::Context *m_context;
91 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;
92 bool m_skipUntilNextLabel = false;
93 bool m_hadBackJumps = false;
94};
95
96QT_END_NAMESPACE
97
98#endif // QQMLJSBASICBLOCKS_P_H
Combined button and popup list for selecting options.