@@ -13,6 +13,7 @@ ControlBlocks::ControlBlocks()
1313 addCompileFunction (" control_forever" , &compileRepeatForever);
1414 addCompileFunction (" control_repeat" , &compileRepeat);
1515 addCompileFunction (" control_repeat_until" , &compileRepeatUntil);
16+ addCompileFunction (" control_for_each" , &compileRepeatForEach);
1617 addCompileFunction (" control_if" , &compileIfStatement);
1718 addCompileFunction (" control_if_else" , &compileIfElseStatement);
1819 addCompileFunction (" control_stop" , &compileStop);
@@ -25,9 +26,11 @@ ControlBlocks::ControlBlocks()
2526 addInput (" TIMES" , TIMES);
2627 addInput (" CONDITION" , CONDITION);
2728 addInput (" DURATION" , DURATION);
29+ addInput (" VALUE" , VALUE);
2830
2931 // Fields
3032 addField (" STOP_OPTION" , STOP_OPTION);
33+ addField (" VARIABLE" , VARIABLE);
3134
3235 // Field values
3336 addFieldValue (" all" , StopAll);
@@ -79,6 +82,19 @@ void ControlBlocks::compileRepeatWhile(Compiler *compiler)
7982 }
8083}
8184
85+ void ControlBlocks::compileRepeatForEach (Compiler *compiler)
86+ {
87+ compiler->addInput (VALUE);
88+ auto substack = compiler->inputBlock (SUBSTACK);
89+ if (substack) {
90+ compiler->addInstruction (vm::OP_REPEAT_LOOP);
91+ compiler->addInstruction (vm::OP_REPEAT_LOOP_INDEX1);
92+ compiler->addInstruction (vm::OP_SET_VAR, { compiler->variableIndex (compiler->field (VARIABLE)->valuePtr ()) });
93+ compiler->moveToSubstack (substack, Compiler::SubstackType::Loop);
94+ } else
95+ compiler->addInstruction (vm::OP_SET_VAR, { compiler->variableIndex (compiler->field (VARIABLE)->valuePtr ()) });
96+ }
97+
8298void ControlBlocks::compileIfStatement (Compiler *compiler)
8399{
84100 auto substack = compiler->inputBlock (SUBSTACK);
0 commit comments