Skip to content

Commit 4b0418a

Browse files
committed
Fix VirtualMachine scripts
1 parent 4a75de2 commit 4b0418a

File tree

3 files changed

+30
-21
lines changed

3 files changed

+30
-21
lines changed

src/engine/engine.cpp

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,13 @@ void Engine::compile()
8383
variables = compiler.variables();
8484
lists = compiler.lists();
8585
constInputValues = compiler.constInputValues();
86-
m_scripts[block] = VirtualMachine(target.get(), this);
87-
VirtualMachine &vm = m_scripts[block];
88-
vm.setFunctions(m_functions);
89-
vm.setConstValues(compiler.constValues());
90-
vm.setVariables(compiler.variablePtrs());
91-
vm.setLists(lists);
92-
vm.setBytecode(compiler.bytecode());
86+
auto vm = std::make_shared<VirtualMachine>(target.get(), this);
87+
vm->setFunctions(m_functions);
88+
vm->setConstValues(compiler.constValues());
89+
vm->setVariables(compiler.variablePtrs());
90+
vm->setLists(lists);
91+
vm->setBytecode(compiler.bytecode());
92+
m_scripts[block] = vm;
9393
} else
9494
std::cout << "warning: unsupported top level block: " << block->opcode() << std::endl;
9595
}
@@ -106,19 +106,22 @@ void Engine::compile()
106106
*/
107107
void Engine::frame()
108108
{
109-
for (VirtualMachine &script : m_runningScripts) {
109+
for (int i = 0; i < m_runningScripts.size(); i++) {
110+
auto script = m_runningScripts[i];
110111
m_breakFrame = false;
111112

112113
do {
113-
script.run();
114-
} while (script.atEnd() && !m_breakFrame);
114+
m_scriptPositions[i] = script->run();
115+
if (script->atEnd())
116+
m_scriptsToRemove.push_back(script);
117+
} while (!script->atEnd() && !m_breakFrame);
115118
}
116119

117120
for (auto script : m_scriptsToRemove) {
118-
auto it = std::find(m_runningScriptPtrs.begin(), m_runningScriptPtrs.end(), script);
119-
auto index = it - m_runningScriptPtrs.begin();
121+
auto it = std::find(m_runningScripts.begin(), m_runningScripts.end(), script);
122+
auto index = it - m_runningScripts.begin();
120123
m_runningScripts.erase(m_runningScripts.begin() + index);
121-
m_runningScriptPtrs.erase(m_runningScriptPtrs.begin() + index);
124+
m_scriptPositions.erase(m_scriptPositions.begin() + index);
122125
scriptCount--;
123126
}
124127
m_scriptsToRemove.clear();
@@ -160,8 +163,9 @@ void Engine::startScript(std::shared_ptr<Block> topLevelBlock, std::shared_ptr<T
160163
}
161164

162165
if (topLevelBlock->next()) {
163-
m_runningScripts.push_back(m_scripts[topLevelBlock]);
164-
m_runningScriptPtrs.push_back(&m_runningScripts.back());
166+
auto vm = m_scripts[topLevelBlock].get();
167+
m_runningScripts.push_back(vm);
168+
m_scriptPositions.push_back(vm->bytecode());
165169
scriptCount++;
166170
}
167171
}
@@ -181,9 +185,9 @@ void Engine::stopScript(VirtualMachine *vm)
181185
void Engine::stopTarget(Target *target, VirtualMachine *exceptScript)
182186
{
183187
std::vector<VirtualMachine *> scripts;
184-
for (VirtualMachine &script : m_runningScripts) {
185-
if ((script.target() == target) && (&script != exceptScript))
186-
scripts.push_back(&script);
188+
for (auto script : m_runningScripts) {
189+
if ((script->target() == target) && (script != exceptScript))
190+
scripts.push_back(script);
187191
}
188192

189193
for (auto script : scripts)

src/engine/engine.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ class LIBSCRATCHCPP_EXPORT Engine
7070
std::vector<std::shared_ptr<Target>> m_targets;
7171
std::vector<std::shared_ptr<Broadcast>> m_broadcasts;
7272
std::vector<std::string> m_extensions;
73-
std::vector<VirtualMachine> m_runningScripts;
74-
std::vector<VirtualMachine *> m_runningScriptPtrs;
73+
std::vector<VirtualMachine *> m_runningScripts;
74+
std::vector<unsigned int *> m_scriptPositions;
7575
std::vector<VirtualMachine *> m_scriptsToRemove;
76-
std::unordered_map<std::shared_ptr<Block>, VirtualMachine> m_scripts;
76+
std::unordered_map<std::shared_ptr<Block>, std::shared_ptr<VirtualMachine>> m_scripts;
7777
std::vector<BlockFunc> m_functions;
7878

7979
bool m_breakFrame = false;

src/engine/virtualmachine.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,19 @@ class LIBSCRATCHCPP_EXPORT VirtualMachine
6565
public:
6666
VirtualMachine();
6767
VirtualMachine(Target *target, Engine *engine);
68+
VirtualMachine(const VirtualMachine &) = delete;
6869
~VirtualMachine();
6970

7071
void setFunctions(const std::vector<BlockFunc> &functions);
7172
void setConstValues(const std::vector<Value> &values);
7273
void setVariables(const std::vector<Value *> &variables);
7374
void setLists(const std::vector<List *> &lists);
75+
7476
void setBytecode(const std::vector<unsigned int> &code);
7577

78+
/*! Returns the bytecode array. */
79+
unsigned int *bytecode() const { return m_bytecode; };
80+
7681
Target *target() const { return m_target; };
7782
Engine *engine() const { return m_engine; };
7883

0 commit comments

Comments
 (0)