Skip to content

Commit 4f854a8

Browse files
committed
ControlBlocks: Add for each loop
1 parent 2852a3f commit 4f854a8

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/blocks/controlblocks.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
8298
void ControlBlocks::compileIfStatement(Compiler *compiler)
8399
{
84100
auto substack = compiler->inputBlock(SUBSTACK);

src/blocks/controlblocks.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ class LIBSCRATCHCPP_EXPORT ControlBlocks : public IBlockSection
1717
SUBSTACK2,
1818
TIMES,
1919
CONDITION,
20-
DURATION
20+
DURATION,
21+
VALUE
2122
};
2223

2324
enum Fields
2425
{
25-
STOP_OPTION
26+
STOP_OPTION,
27+
VARIABLE
2628
};
2729

2830
enum FieldValues
@@ -40,6 +42,7 @@ class LIBSCRATCHCPP_EXPORT ControlBlocks : public IBlockSection
4042
static void compileRepeat(Compiler *compiler);
4143
static void compileRepeatUntil(Compiler *compiler);
4244
static void compileRepeatWhile(Compiler *compiler);
45+
static void compileRepeatForEach(Compiler *compiler);
4346
static void compileIfStatement(Compiler *compiler);
4447
static void compileIfElseStatement(Compiler *compiler);
4548
static void compileStop(Compiler *compiler);

0 commit comments

Comments
 (0)