diff options
Diffstat (limited to 'tests/casestmt/tcomputedgoto.nim')
-rw-r--r-- | tests/casestmt/tcomputedgoto.nim | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/casestmt/tcomputedgoto.nim b/tests/casestmt/tcomputedgoto.nim new file mode 100644 index 000000000..f7603dac3 --- /dev/null +++ b/tests/casestmt/tcomputedgoto.nim @@ -0,0 +1,59 @@ +discard """ + output: ''' +yeah A enumB +uneven +yeah A enumB +yeah CD enumD +uneven +yeah CD enumE +yeah A enumB +uneven +yeah CD enumE +yeah CD enumD +uneven +yeah A enumB +yeah B enumC +uneven +yeah A enumB +yeah A enumB +uneven +yeah A enumB +''' +""" + +type + MyEnum = enum + enumA, enumB, enumC, enumD, enumE, enumLast + +proc vm() = + var instructions: array[0..100, MyEnum] + instructions[2] = enumC + instructions[3] = enumD + instructions[4] = enumA + instructions[5] = enumD + instructions[6] = enumC + instructions[7] = enumA + instructions[8] = enumB + + instructions[12] = enumE + var pc = 0 + while true: + {.computedGoto.} + let instr = instructions[pc] + let ra = instr.succ # instr.regA + case instr + of enumA: + echo "yeah A ", ra + of enumC, enumD: + echo "yeah CD ", ra + of enumB: + echo "yeah B ", ra + of enumE: + break + of enumLast: discard + inc(pc) + + if pc mod 2 == 1: + echo "uneven" + +vm() |