Skip to content

Commit 4f55c6f

Browse files
committed
fix #578: Wait for broadcasts with different case
1 parent a5eda26 commit 4f55c6f

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

src/engine/internal/engine.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ void Engine::step()
539539

540540
// Resolve stopped broadcast scripts
541541
std::vector<Broadcast *> resolved;
542+
std::vector<Thread *> resolvedThreads;
542543

543544
for (const auto &[broadcast, senderThread] : m_broadcastSenders) {
544545
std::unordered_map<Broadcast *, std::vector<Script *>> *broadcastMap = nullptr;
@@ -566,13 +567,21 @@ void Engine::step()
566567
}
567568
}
568569

569-
if (!found) {
570+
if (found) {
571+
// If a broadcast with the same name but different case
572+
// was considered stopped before, restore the promise.
573+
if (std::find(resolvedThreads.begin(), resolvedThreads.end(), senderThread) != resolvedThreads.end()) {
574+
senderThread->promise();
575+
resolvedThreads.erase(std::remove(resolvedThreads.begin(), resolvedThreads.end(), senderThread), resolvedThreads.end());
576+
}
577+
} else {
570578
Thread *th = senderThread;
571579

572580
if (std::find_if(m_threads.begin(), m_threads.end(), [th](std::shared_ptr<Thread> thread) { return thread.get() == th; }) != m_threads.end())
573581
th->resolvePromise();
574582

575583
resolved.push_back(broadcast);
584+
resolvedThreads.push_back(th);
576585
}
577586
}
578587

test/engine/engine_test.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -2249,3 +2249,20 @@ TEST(EngineTest, BroadcastStopsWaitBlocks)
22492249
ASSERT_VAR(stage, "backdrop_passed");
22502250
ASSERT_TRUE(GET_VAR(stage, "backdrop_passed")->value().toBool());
22512251
}
2252+
2253+
TEST(EngineTest, BroadcastAndWaitCaseInsensitive)
2254+
{
2255+
// Regtest for #578
2256+
Project p("regtest_projects/578_broadcast_and_wait_case_insensitive.sb3");
2257+
ASSERT_TRUE(p.load());
2258+
2259+
auto engine = p.engine();
2260+
2261+
Stage *stage = engine->stage();
2262+
ASSERT_TRUE(stage);
2263+
2264+
engine->run();
2265+
2266+
ASSERT_VAR(stage, "passed");
2267+
ASSERT_TRUE(GET_VAR(stage, "passed")->value().toBool());
2268+
}
Binary file not shown.

0 commit comments

Comments
 (0)