mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-12 14:23:45 +00:00
This alters the DFA control flow graph generation for case statments. Gotos are now generated as a chained link, this ensures that evaluation of variant branches collapses as early as possible, without hitting the 2k call limit.
33 lines
709 B
Nim
33 lines
709 B
Nim
discard """
|
|
cmd: '''nim c --gc:arc $file'''
|
|
output: '''
|
|
other
|
|
'''
|
|
"""
|
|
|
|
import std/macros
|
|
|
|
macro bigCaseStmt(arg: untyped): untyped =
|
|
result = nnkCaseStmt.newTree(arg)
|
|
|
|
# try to change 2000 to a bigger value if it doesn't crash
|
|
for x in 0 ..< 2000:
|
|
result.add nnkOfBranch.newTree(newStrLitNode($x), newStrLitNode($x))
|
|
|
|
result.add nnkElse.newTree(newStrLitNode("other"))
|
|
|
|
macro bigIfElseExpr(): untyped =
|
|
result = nnkIfExpr.newTree()
|
|
|
|
for x in 0 ..< 1000:
|
|
result.add nnkElifExpr.newTree(newLit(false), newStrLitNode($x))
|
|
|
|
result.add nnkElseExpr.newTree(newStrLitNode("other"))
|
|
|
|
proc test(arg: string): string =
|
|
echo bigIfElseExpr()
|
|
|
|
result = bigCaseStmt(arg)
|
|
|
|
discard test("test")
|