55#include " ../scratchconfiguration.h"
66#include " iblocksection.h"
77#include " compiler.h"
8+ #include " script.h"
89#include < cassert>
910#include < iostream>
1011#include < thread>
@@ -76,16 +77,16 @@ void Engine::compile()
7677 if (block->topLevel ()) {
7778 auto section = blockSection (block->opcode ());
7879 if (section) {
79- auto vm = std::make_shared<VirtualMachine >(target.get (), this );
80- m_scripts[block] = vm ;
80+ auto script = std::make_shared<Script >(target.get (), this );
81+ m_scripts[block] = script ;
8182
8283 compiler.compile (block);
8384
84- vm ->setFunctions (m_functions);
85- vm ->setBytecode (compiler.bytecode ());
85+ script ->setFunctions (m_functions);
86+ script ->setBytecode (compiler.bytecode ());
8687 if (block->opcode () == " procedures_definition" ) {
8788 auto b = block->inputAt (block->findInput (" custom_block" ))->valueBlock ();
88- procedureBytecodeMap[b->mutationPrototype ()->procCode ()] = vm ->bytecode ();
89+ procedureBytecodeMap[b->mutationPrototype ()->procCode ()] = script ->bytecode ();
8990 }
9091 } else
9192 std::cout << " warning: unsupported top level block: " << block->opcode () << std::endl;
@@ -122,25 +123,26 @@ void Engine::frame()
122123 m_breakFrame = false ;
123124
124125 do {
125- std::string opcode;
126- for (auto const &[key, value] : m_scripts) {
127- if (value.get () == script)
128- opcode = key->opcode ();
129- }
130126 auto ret = script->run (m_scriptPositions[i]);
131127 if (script->savePos ())
132128 m_scriptPositions[i] = ret;
133129 if (script->atEnd ()) {
134130 for (auto &[key, value] : m_broadcastMap)
135- value.erase (std::remove (value.begin (), value.end (), script), value.end ());
136- m_scriptsToRemove.push_back (script);
131+ value.erase (std::remove (value.begin (), value.end (), script-> script () ), value.end ());
132+ m_scriptsToRemove.push_back (script. get () );
137133 }
138134 } while (!script->atEnd () && !m_breakFrame);
139135 }
140136
141137 for (auto script : m_scriptsToRemove) {
142- auto it = std::find (m_runningScripts.begin (), m_runningScripts.end (), script);
143- auto index = it - m_runningScripts.begin ();
138+ size_t index = -1 ;
139+ for (size_t i = 0 ; i < m_runningScripts.size (); i++) {
140+ if (m_runningScripts[i].get () == script) {
141+ index = i;
142+ break ;
143+ }
144+ }
145+ assert (index != -1 );
144146 m_runningScripts.erase (m_runningScripts.begin () + index);
145147 m_scriptPositions.erase (m_scriptPositions.begin () + index);
146148 }
@@ -182,27 +184,32 @@ void Engine::startScript(std::shared_ptr<Block> topLevelBlock, std::shared_ptr<T
182184 }
183185
184186 if (topLevelBlock->next ()) {
185- auto vm = m_scripts[topLevelBlock]. get () ;
186- m_runningScripts.push_back (vm );
187- m_scriptPositions.push_back (vm ->bytecode ());
187+ auto script = m_scripts[topLevelBlock];
188+ m_runningScripts.push_back (script-> start () );
189+ m_scriptPositions.push_back (script ->bytecode ());
188190 }
189191}
190192
191193/* ! Starts the script of the broadcast with the given index. */
192194void libscratchcpp::Engine::broadcast (unsigned int index, VirtualMachine *sourceScript)
193195{
194- const std::vector<VirtualMachine *> &scripts = m_broadcastMap[index];
195- for (auto vm : scripts) {
196- auto it = std::find (m_runningScripts.begin (), m_runningScripts.end (), vm);
197- if (it != m_runningScripts.end ()) {
196+ const std::vector<Script *> &scripts = m_broadcastMap[index];
197+ for (auto script : scripts) {
198+ size_t index = -1 ;
199+ for (size_t i = 0 ; i < m_runningScripts.size (); i++) {
200+ if (m_runningScripts[i]->script () == script) {
201+ index = i;
202+ break ;
203+ }
204+ }
205+ if (index != -1 ) {
198206 // Reset the script if it's already running
199- auto i = it - m_runningScripts.begin ();
200- m_scriptPositions[i] = m_runningScripts[i]->bytecode ();
201- if (vm == sourceScript)
202- vm->stop (false , true );
207+ m_scriptPositions[index] = m_runningScripts[index]->bytecode ();
208+ if (script == sourceScript->script ())
209+ sourceScript->stop (false , true );
203210 } else {
204- m_runningScripts.push_back (vm );
205- m_scriptPositions.push_back (vm ->bytecode ());
211+ m_runningScripts.push_back (script-> start () );
212+ m_scriptPositions.push_back (script ->bytecode ());
206213 }
207214 }
208215}
@@ -223,8 +230,8 @@ void Engine::stopTarget(Target *target, VirtualMachine *exceptScript)
223230{
224231 std::vector<VirtualMachine *> scripts;
225232 for (auto script : m_runningScripts) {
226- if ((script->target () == target) && (script != exceptScript))
227- scripts.push_back (script);
233+ if ((script->target () == target) && (script. get () != exceptScript))
234+ scripts.push_back (script. get () );
228235 }
229236
230237 for (auto script : scripts)
@@ -352,7 +359,7 @@ void libscratchcpp::Engine::addBroadcastScript(std::shared_ptr<Block> whenReceiv
352359{
353360 auto id = findBroadcast (broadcast->name ());
354361 if (m_broadcastMap.count (id) == 1 ) {
355- std::vector<VirtualMachine *> &scripts = m_broadcastMap[id];
362+ std::vector<Script *> &scripts = m_broadcastMap[id];
356363 scripts.push_back (m_scripts[whenReceivedBlock].get ());
357364 } else
358365 m_broadcastMap[id] = { m_scripts[whenReceivedBlock].get () };
0 commit comments