aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljscompilepass_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljscompilepass_p.h')
-rw-r--r--src/qmlcompiler/qqmljscompilepass_p.h38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/qmlcompiler/qqmljscompilepass_p.h b/src/qmlcompiler/qqmljscompilepass_p.h
index 7a01d20b16..7a56494744 100644
--- a/src/qmlcompiler/qqmljscompilepass_p.h
+++ b/src/qmlcompiler/qqmljscompilepass_p.h
@@ -55,6 +55,19 @@ public:
// map from register index to expected type
using VirtualRegisters = QFlatMap<int, VirtualRegister>;
+ struct BasicBlock
+ {
+ QList<int> jumpOrigins;
+ QList<int> readRegisters;
+ QList<QQmlJSScope::ConstPtr> readTypes;
+ int jumpTarget = -1;
+ bool jumpIsUnconditional = false;
+ bool isReturnBlock = false;
+ bool isThrowBlock = false;
+ };
+
+ using BasicBlocks = QFlatMap<int, BasicBlock>;
+
struct InstructionAnnotation
{
// Registers explicit read as part of the instruction.
@@ -70,6 +83,11 @@ public:
};
using InstructionAnnotations = QFlatMap<int, InstructionAnnotation>;
+ struct BlocksAndAnnotations
+ {
+ BasicBlocks basicBlocks;
+ InstructionAnnotations annotations;
+ };
struct Function
{
@@ -86,6 +104,19 @@ public:
bool isFullyTyped = false;
};
+ struct ObjectOrArrayDefinition
+ {
+ enum {
+ ArrayClassId = -1,
+ ArrayConstruct1ArgId = -2,
+ };
+
+ int instructionOffset = -1;
+ int internalClassId = ArrayClassId;
+ int argc = 0;
+ int argv = -1;
+ };
+
struct State
{
VirtualRegisters registers;
@@ -233,10 +264,13 @@ public:
};
QQmlJSCompilePass(const QV4::Compiler::JSUnitGenerator *jsUnitGenerator,
- const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger)
+ const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger,
+ BasicBlocks basicBlocks = {}, InstructionAnnotations annotations = {})
: m_jsUnitGenerator(jsUnitGenerator)
, m_typeResolver(typeResolver)
, m_logger(logger)
+ , m_basicBlocks(basicBlocks)
+ , m_annotations(annotations)
{}
protected:
@@ -245,6 +279,8 @@ protected:
QQmlJSLogger *m_logger = nullptr;
const Function *m_function = nullptr;
+ BasicBlocks m_basicBlocks;
+ InstructionAnnotations m_annotations;
QQmlJS::DiagnosticMessage *m_error = nullptr;
int firstRegisterIndex() const