@@ -72,6 +72,8 @@ void Engine::compile()
7272 std::vector<Variable *> variables;
7373 std::vector<List *> lists;
7474 std::vector<InputValue *> constInputValues;
75+ std::vector<std::string> procedures;
76+ std::unordered_map<std::string, unsigned int *> procedureBytecodeMap;
7577 auto blocks = target->blocks ();
7678 for (auto block : blocks) {
7779 if (block->topLevel ()) {
@@ -81,21 +83,37 @@ void Engine::compile()
8183 compiler.setConstInputValues (constInputValues);
8284 compiler.setVariables (variables);
8385 compiler.setLists (lists);
86+ compiler.setProcedures (procedures);
8487 compiler.compile ();
8588 variables = compiler.variables ();
8689 lists = compiler.lists ();
8790 constInputValues = compiler.constInputValues ();
91+ procedures = compiler.procedures ();
92+
8893 auto vm = std::make_shared<VirtualMachine>(target.get (), this );
8994 vm->setFunctions (m_functions);
9095 vm->setConstValues (compiler.constValues ());
9196 vm->setVariables (compiler.variablePtrs ());
9297 vm->setLists (lists);
9398 vm->setBytecode (compiler.bytecode ());
99+ if (block->opcode () == " procedures_definition" ) {
100+ auto b = block->inputAt (block->findInput (" custom_block" ))->valueBlock ();
101+ procedureBytecodeMap[b->mutationPrototype ()->procCode ()] = vm->bytecode ();
102+ }
94103 m_scripts[block] = vm;
95104 } else
96105 std::cout << " warning: unsupported top level block: " << block->opcode () << std::endl;
97106 }
98107 }
108+
109+ std::vector<unsigned int *> procedureBytecodes;
110+ for (const std::string &code : procedures)
111+ procedureBytecodes.push_back (procedureBytecodeMap[code]);
112+
113+ for (auto block : blocks) {
114+ if (m_scripts.count (block) == 1 )
115+ m_scripts[block]->setProcedures (procedureBytecodes);
116+ }
99117 }
100118}
101119
0 commit comments