Skip to content

Commit 233c37b

Browse files
committed
Add lockFrame method to Engine
1 parent 28d0993 commit 233c37b

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

include/scratchcpp/iengine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ class LIBSCRATCHCPP_EXPORT IEngine
9797
*/
9898
virtual void skipFrame() = 0;
9999

100+
/*! Call this from a block implementation to ignore calls to skipFrame() until the current frame ends. */
101+
virtual void lockFrame() = 0;
102+
100103
/*!
101104
* Registers the given block section.
102105
* \see <a href="blockSections.html">Block sections</a>

src/engine/engine.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ void Engine::compile()
119119

120120
void Engine::frame()
121121
{
122+
m_lockFrame = false;
123+
122124
for (int i = 0; i < m_runningScripts.size(); i++) {
123125
auto script = m_runningScripts[i];
124126
m_breakFrame = false;
@@ -310,8 +312,16 @@ bool libscratchcpp::Engine::breakingCurrentFrame()
310312

311313
void Engine::skipFrame()
312314
{
313-
breakFrame();
314-
m_skipFrame = true;
315+
if (!m_lockFrame) {
316+
breakFrame();
317+
m_skipFrame = true;
318+
}
319+
}
320+
321+
void Engine::lockFrame()
322+
{
323+
m_skipFrame = false;
324+
m_lockFrame = true;
315325
}
316326

317327
void Engine::registerSection(std::shared_ptr<IBlockSection> section)

src/engine/engine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class Engine : public IEngine
4141
bool breakingCurrentFrame() override;
4242

4343
void skipFrame() override;
44+
void lockFrame() override;
4445

4546
void registerSection(std::shared_ptr<IBlockSection> section) override;
4647
unsigned int functionIndex(BlockFunc f) override;
@@ -92,6 +93,7 @@ class Engine : public IEngine
9293

9394
bool m_breakFrame = false;
9495
bool m_skipFrame = false;
96+
bool m_lockFrame = false;
9597
};
9698

9799
} // namespace libscratchcpp

test/mocks/enginemock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class EngineMock : public IEngine
2929
MOCK_METHOD(bool, breakingCurrentFrame, (), (override));
3030

3131
MOCK_METHOD(void, skipFrame, (), (override));
32+
MOCK_METHOD(void, lockFrame, (), (override));
3233

3334
MOCK_METHOD(void, registerSection, (std::shared_ptr<IBlockSection>), (override));
3435
MOCK_METHOD(unsigned int, functionIndex, (BlockFunc), (override));

0 commit comments

Comments
 (0)