diff --git a/Library/Core/Blocks/Controls/ControlsRepeatExt.cs b/Library/Core/Blocks/Controls/ControlsRepeatExt.cs index a7628b8..08dbbcb 100644 --- a/Library/Core/Blocks/Controls/ControlsRepeatExt.cs +++ b/Library/Core/Blocks/Controls/ControlsRepeatExt.cs @@ -24,19 +24,14 @@ public class ControlsRepeatExt : Block await statement.EvaluateAsync(context); - try - { - /* See if a break of the loop is requested. */ - if (context.EscapeMode == EscapeMode.Break) break; - } - finally - { - /* Either a continue is requested or the inner block is executed normally. */ - context.EscapeMode = EscapeMode.None; - } + /* See if a break of the loop is requested. */ + if (context.EscapeMode == EscapeMode.Break) break; + + /* Either a continue is requested or the inner block is executed normally. */ + context.EscapeMode = EscapeMode.None; } - /* For safety reasons reset the break mode - should not really be neccessary! */ + /* Reset the break mode - just in case. */ context.EscapeMode = EscapeMode.None; /* Continue with the next block. */ diff --git a/Library/Core/Blocks/Controls/ControlsWhileUntil.cs b/Library/Core/Blocks/Controls/ControlsWhileUntil.cs index d017aa8..780145e 100644 --- a/Library/Core/Blocks/Controls/ControlsWhileUntil.cs +++ b/Library/Core/Blocks/Controls/ControlsWhileUntil.cs @@ -1,5 +1,3 @@ - - using BlocklyNet.Core.Model; namespace BlocklyNet.Core.Blocks.Controls; @@ -12,36 +10,43 @@ public class ControlsWhileUntil : Block /// public override async Task EvaluateAsync(Context context) { - var mode = Fields["MODE"]; var value = Values.TryGet("BOOL"); + var statement = Statements.TryGet("DO"); - if (!Statements.Has("DO") || null == value) + if (statement == null || null == value) return await base.EvaluateAsync(context); - var statement = Statements["DO"]; + var execStatementAndTestForBreak = async () => + { + context.Cancellation.ThrowIfCancellationRequested(); + + await statement.EvaluateAsync(context); + + if (context.EscapeMode == EscapeMode.Break) return true; + + context.EscapeMode = EscapeMode.None; + + return false; + }; - if (mode == "WHILE") + switch (Fields["MODE"]) { - while ((bool)(await value.EvaluateAsync(context))!) - { - context.Cancellation.ThrowIfCancellationRequested(); - - if (context.EscapeMode == EscapeMode.Break) - { - context.EscapeMode = EscapeMode.None; - break; - } - - await statement.EvaluateAsync(context); - } + case "WHILE": + while ((bool)(await value.EvaluateAsync(context))!) + if (await execStatementAndTestForBreak()) + break; + + break; + case "UNTIL": + do + if (await execStatementAndTestForBreak()) + break; + while (!(bool)(await value.EvaluateAsync(context))!); + + break; } - else - while (!(bool)(await value.EvaluateAsync(context))!) - { - context.Cancellation.ThrowIfCancellationRequested(); - await statement.EvaluateAsync(context); - } + context.EscapeMode = EscapeMode.None; return await base.EvaluateAsync(context); }