public override void GenerateCode(CodeGenerator output) { var reg = condition.GenerateCode(output); this.Scope.Enter(output); if (@else != null) { output.AppendLine(this, $"JMPNOT {reg} @else_{this.NodeID}"); body.GenerateCode(output); output.AppendLine(this, $"JMP @then_{this.NodeID}"); output.AppendLine(this, $"@else_{this.NodeID}: NOP"); @else.GenerateCode(output); } else { output.AppendLine(this, $"JMPNOT {reg} @then_{this.NodeID}"); body.GenerateCode(output); } output.AppendLine(this, $"@then_{this.NodeID}: NOP"); this.Scope.Leave(output); Compiler.Instance.DeallocRegister(ref reg); }
public override void GenerateCode(CodeGenerator output) { Compiler.Instance.PushLoop(this); output.AppendLine(this, $"@loop_start_{this.NodeID}: NOP"); this.Scope.Enter(output); body.GenerateCode(output); var reg = condition.GenerateCode(output); output.AppendLine(this, $"JMPIF {reg} @loop_start_{this.NodeID}"); output.AppendLine(this, $"@loop_end_{this.NodeID}: NOP"); this.Scope.Leave(output); Compiler.Instance.DeallocRegister(ref reg); Compiler.Instance.PopLoop(this); }