Skip to content

Commit ebd7882

Browse files
committed
fix #445: Create undefined monitor variables and lists
1 parent d7e05e2 commit ebd7882

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

src/engine/internal/engine.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,23 @@ void Engine::resolveIds()
161161
}
162162

163163
// TODO: Move field information out of Engine
164-
if (field->name() == "VARIABLE")
165-
field->setValuePtr(target->variableAt(target->findVariable(field->value().toString())));
166-
else if (field->name() == "LIST")
167-
field->setValuePtr(target->listAt(target->findList(field->value().toString())));
164+
if (field->name() == "VARIABLE") {
165+
std::string name = field->value().toString();
166+
int index = target->findVariable(name);
167+
168+
if (index == -1)
169+
index = target->addVariable(std::make_shared<Variable>(monitor->id(), name));
170+
171+
field->setValuePtr(target->variableAt(index));
172+
} else if (field->name() == "LIST") {
173+
std::string name = field->value().toString();
174+
int index = target->findList(name);
175+
176+
if (index == -1)
177+
index = target->addList(std::make_shared<List>(monitor->id(), name));
178+
179+
field->setValuePtr(target->listAt(index));
180+
}
168181
}
169182

170183
block->updateInputMap();

test/engine/engine_test.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,3 +1702,27 @@ TEST(EngineTest, StopBeforeStarting)
17021702
ASSERT_VAR(stage, "test");
17031703
ASSERT_TRUE(GET_VAR(stage, "test")->value().toBool());
17041704
}
1705+
1706+
TEST(EngineTest, NoCrashWhenLoadingUndefinedVariableOrListMonitor)
1707+
{
1708+
// Regtest for #445
1709+
Project p("regtest_projects/445_undefined_variable_or_list_monitor_crash.sb3");
1710+
ASSERT_TRUE(p.load());
1711+
1712+
auto engine = p.engine();
1713+
1714+
// The undefined variable and list should now be defined
1715+
Stage *stage = engine->stage();
1716+
ASSERT_TRUE(stage);
1717+
ASSERT_VAR(stage, "test");
1718+
auto var = GET_VAR(stage, "test");
1719+
ASSERT_EQ(var->id(), "E,r`5qYWCdXa~yj7nDS]");
1720+
ASSERT_EQ(var->value(), Value());
1721+
1722+
Target *sprite = engine->targetAt(engine->findTarget("Sprite1"));
1723+
ASSERT_TRUE(sprite);
1724+
ASSERT_LIST(sprite, "test");
1725+
auto list = GET_LIST(sprite, "test");
1726+
ASSERT_EQ(list->id(), "7a5rAs|X2_[1APT7@B1V");
1727+
ASSERT_TRUE(list->empty());
1728+
}
Binary file not shown.

0 commit comments

Comments
 (0)