diff --git a/example/program.nub b/example/program.nub index 82f0a47..927fca6 100644 --- a/example/program.nub +++ b/example/program.nub @@ -1,7 +1,12 @@ import "c"; global func main() { - while true { - continue; + let x = true; + while x { + if (true) { + puts("level 1"); + } + puts("level 2"); + break; } } diff --git a/src/compiler/Nub.Lang/Backend/Generator.cs b/src/compiler/Nub.Lang/Backend/Generator.cs index e4af7e7..4786246 100644 --- a/src/compiler/Nub.Lang/Backend/Generator.cs +++ b/src/compiler/Nub.Lang/Backend/Generator.cs @@ -12,6 +12,7 @@ public class Generator private readonly List _strings = []; private readonly Stack _breakLabels = new(); private readonly Stack _continueLabels = new(); + private bool _codeIsReachable = true; public Generator(List definitions) { @@ -80,10 +81,12 @@ public class Generator private void GenerateBlock(BlockNode block) { - foreach (var statement in block.Statements) + foreach (var statement in block.Statements.Where(_ => _codeIsReachable)) { GenerateStatement(statement); } + + _codeIsReachable = true; } private void GenerateStatement(StatementNode statement) @@ -122,11 +125,13 @@ public class Generator private void GenerateBreak() { _builder.AppendLine($" jmp @{_breakLabels.Peek()}"); + _codeIsReachable = false; } private void GenerateContinue() { _builder.AppendLine($" jmp @{_continueLabels.Peek()}"); + _codeIsReachable = false; } private void GenerateStatementFuncCall(FuncCallStatementNode funcCall)