While builds a logic block with the following psuedocode: while test() { loop() }
(test func() *Value, loop func())
| 196 | // } |
| 197 | // |
| 198 | func (b *Builder) While(test func() *Value, loop func()) { |
| 199 | testBlock := b.m.ctx.AddBasicBlock(b.function.llvm, "while_test") |
| 200 | loopBlock := b.m.ctx.AddBasicBlock(b.function.llvm, "while_loop") |
| 201 | exitBlock := b.m.ctx.AddBasicBlock(b.function.llvm, "while_exit") |
| 202 | |
| 203 | b.llvm.CreateBr(testBlock) |
| 204 | |
| 205 | b.block(testBlock, llvm.BasicBlock{}, func() { |
| 206 | cond := test() |
| 207 | if !b.IsBlockTerminated() { |
| 208 | b.llvm.CreateCondBr(cond.llvm, loopBlock, exitBlock) |
| 209 | } |
| 210 | }) |
| 211 | |
| 212 | b.block(loopBlock, testBlock, loop) |
| 213 | |
| 214 | b.setInsertPointAtEnd(exitBlock) |
| 215 | } |
| 216 | |
| 217 | // ForN builds a logic block with the following psuedocode: |
| 218 | // |
no test coverage detected