diff options
Diffstat (limited to 'src/qml/compiler/qv4compilercontrolflow_p.h')
-rw-r--r-- | src/qml/compiler/qv4compilercontrolflow_p.h | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/qml/compiler/qv4compilercontrolflow_p.h b/src/qml/compiler/qv4compilercontrolflow_p.h index 1884b33588..e7f3a18a6d 100644 --- a/src/qml/compiler/qv4compilercontrolflow_p.h +++ b/src/qml/compiler/qv4compilercontrolflow_p.h @@ -188,33 +188,42 @@ struct ControlFlowUnwind : public ControlFlow } }; -struct ControlFlowLoop : public ControlFlowUnwind +struct ControlFlowUnwindCleanup : public ControlFlowUnwind { - QString loopLabel; - BytecodeGenerator::Label *breakLabel = nullptr; - BytecodeGenerator::Label *continueLabel = nullptr; - std::function<void()> unwind = nullptr; + std::function<void()> cleanup = nullptr; - ControlFlowLoop(Codegen *cg, BytecodeGenerator::Label *breakLabel, BytecodeGenerator::Label *continueLabel = nullptr, std::function<void()> unwind = nullptr) - : ControlFlowUnwind(cg, Loop), loopLabel(ControlFlow::loopLabel()), breakLabel(breakLabel), continueLabel(continueLabel), unwind(unwind) + ControlFlowUnwindCleanup(Codegen *cg, std::function<void()> cleanup, Type type = Block) + : ControlFlowUnwind(cg, type), cleanup(cleanup) { - if (unwind != nullptr) { + if (cleanup) { setupUnwindHandler(); generator()->setUnwindHandler(&unwindLabel); } } - ~ControlFlowLoop() { - if (unwind != nullptr) { + ~ControlFlowUnwindCleanup() { + if (cleanup) { unwindLabel.link(); generator()->setUnwindHandler(parentUnwindHandler()); - unwind(); + cleanup(); emitUnwindHandler(); } } bool requiresUnwind() override { - return unwind != nullptr; + return cleanup != nullptr; + } +}; + +struct ControlFlowLoop : public ControlFlowUnwindCleanup +{ + QString loopLabel; + BytecodeGenerator::Label *breakLabel = nullptr; + BytecodeGenerator::Label *continueLabel = nullptr; + + ControlFlowLoop(Codegen *cg, BytecodeGenerator::Label *breakLabel, BytecodeGenerator::Label *continueLabel = nullptr, std::function<void()> cleanup = nullptr) + : ControlFlowUnwindCleanup(cg, cleanup, Loop), loopLabel(ControlFlow::loopLabel()), breakLabel(breakLabel), continueLabel(continueLabel) + { } BytecodeGenerator::Label getUnwindTarget(UnwindType type, const QString &label) override { |