Skip to content

Commit 7aadd10

Browse files
committed
fix #545: Add variables and lists to edge-activated hats
1 parent 6082b82 commit 7aadd10

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/engine/script.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ void Script::setHatPredicateBytecode(const std::vector<unsigned int> &code)
5858
impl->hatPredicateVm = std::make_shared<VirtualMachine>(impl->engine->stage(), impl->engine, this);
5959
impl->hatPredicateVm->setBytecode(impl->hatPredicateBytecodeVector.data());
6060
impl->hatPredicateVm->setConstValues(impl->constValues);
61+
impl->hatPredicateVm->setVariables(impl->variableValues.data());
62+
impl->hatPredicateVm->setLists(impl->lists.data());
6163
}
6264
}
6365

@@ -174,12 +176,18 @@ void Script::setVariables(const std::vector<Variable *> &variables)
174176

175177
for (const auto &var : variables)
176178
impl->variableValues.push_back(var->valuePtr());
179+
180+
if (impl->hatPredicateVm)
181+
impl->hatPredicateVm->setVariables(impl->variableValues.data());
177182
}
178183

179184
/*! Sets the list of lists. */
180185
void Script::setLists(const std::vector<List *> &lists)
181186
{
182187
impl->lists = lists;
188+
189+
if (impl->hatPredicateVm)
190+
impl->hatPredicateVm->setLists(impl->lists.data());
183191
}
184192

185193
BlockFunc *Script::getFunctions() const

test/script/script_test.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ TEST_F(ScriptTest, Bytecode)
4545
static Target *stageTest = nullptr;
4646
static IEngine *engineTest = nullptr;
4747
static Script *scriptTest = nullptr;
48+
static Value **variablesTest = nullptr;
49+
static List **listsTest = nullptr;
4850

4951
TEST_F(ScriptTest, HatPredicate)
5052
{
@@ -60,6 +62,8 @@ TEST_F(ScriptTest, HatPredicate)
6062
stageTest = vm->target();
6163
engineTest = vm->engine();
6264
scriptTest = vm->script();
65+
variablesTest = vm->variables();
66+
listsTest = vm->lists();
6367
return 0;
6468
};
6569

@@ -71,16 +75,28 @@ TEST_F(ScriptTest, HatPredicate)
7175
stageTest = vm->target();
7276
engineTest = vm->engine();
7377
scriptTest = vm->script();
78+
variablesTest = vm->variables();
79+
listsTest = vm->lists();
7480
return 0;
7581
};
7682

7783
std::vector<BlockFunc> functions1 = { f1 };
7884
std::vector<BlockFunc> functions2 = { f1, f2, f3 };
7985

86+
Variable var1("", "var1", "a");
87+
Variable var2("", "var2", 4);
88+
script.setVariables({ &var1, &var2 });
89+
90+
List list1("", "list1");
91+
List list2("", "list2");
92+
script.setLists({ &list1, &list2 });
93+
8094
EXPECT_CALL(m_engine, blockFunctions()).WillOnce(ReturnRef(functions1));
8195
stageTest = nullptr;
8296
engineTest = nullptr;
8397
scriptTest = nullptr;
98+
variablesTest = nullptr;
99+
listsTest = nullptr;
84100
script.setConstValues({ "test" });
85101
script.setHatPredicateBytecode({ vm::OP_START, vm::OP_CONST, 0, vm::OP_PRINT, vm::OP_EXEC, 0, vm::OP_HALT });
86102
testing::internal::CaptureStdout();
@@ -89,11 +105,19 @@ TEST_F(ScriptTest, HatPredicate)
89105
ASSERT_EQ(stageTest, &stage);
90106
ASSERT_EQ(engineTest, &m_engine);
91107
ASSERT_EQ(scriptTest, &script);
108+
ASSERT_TRUE(variablesTest);
109+
ASSERT_EQ(variablesTest[0], var1.valuePtr());
110+
ASSERT_EQ(variablesTest[1], var2.valuePtr());
111+
ASSERT_TRUE(listsTest);
112+
ASSERT_EQ(listsTest[0], &list1);
113+
ASSERT_EQ(listsTest[1], &list2);
92114

93115
EXPECT_CALL(m_engine, blockFunctions()).WillOnce(ReturnRef(functions2));
94116
stageTest = nullptr;
95117
engineTest = nullptr;
96118
scriptTest = nullptr;
119+
variablesTest = nullptr;
120+
listsTest = nullptr;
97121
script.setHatPredicateBytecode({ vm::OP_START, vm::OP_CONST, 0, vm::OP_PRINT, vm::OP_EXEC, 1, vm::OP_HALT });
98122
script.setConstValues({ 5 });
99123
testing::internal::CaptureStdout();
@@ -107,6 +131,8 @@ TEST_F(ScriptTest, HatPredicate)
107131
stageTest = nullptr;
108132
engineTest = nullptr;
109133
scriptTest = nullptr;
134+
variablesTest = nullptr;
135+
listsTest = nullptr;
110136
script.setHatPredicateBytecode({ vm::OP_START, vm::OP_EXEC, 2, vm::OP_HALT });
111137
ASSERT_FALSE(script.runHatPredicate());
112138
ASSERT_EQ(stageTest, &stage);

0 commit comments

Comments
 (0)