Skip to content

Commit

Permalink
fix nim-lang#8821 JS codegen can produce extreme switch statements wi…
Browse files Browse the repository at this point in the history
…th case … (nim-lang#20548)

* fix nim-lang#8821 JS codegen can produce extreme switch statements with case a of range

* remove totalRange
  • Loading branch information
bung87 authored and capocasa committed Mar 31, 2023
1 parent b60c62a commit 8ef57ed
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 10 deletions.
7 changes: 1 addition & 6 deletions compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,6 @@ proc genRaiseStmt(p: PProc, n: PNode) =
proc genCaseJS(p: PProc, n: PNode, r: var TCompRes) =
var
a, b, cond, stmt: TCompRes
totalRange = 0
genLineDir(p, n)
gen(p, n[0], cond)
let typeKind = skipTypes(n[0].typ, abstractVar).kind
Expand All @@ -897,7 +896,7 @@ proc genCaseJS(p: PProc, n: PNode, r: var TCompRes) =
of tyString:
useMagic(p, "toJSStr")
lineF(p, "switch (toJSStr($1)) {$n", [cond.rdLoc])
of tyFloat..tyFloat128:
of tyFloat..tyFloat128, tyInt..tyInt64, tyUInt..tyUInt64:
transferRange = true
else:
lineF(p, "switch ($1) {$n", [cond.rdLoc])
Expand Down Expand Up @@ -926,10 +925,6 @@ proc genCaseJS(p: PProc, n: PNode, r: var TCompRes) =
lineF(p, "$1 >= $2 && $1 <= $3", [cond.rdLoc, a.rdLoc, b.rdLoc])
else:
var v = copyNode(e[0])
inc(totalRange, int(e[1].intVal - v.intVal))
if totalRange > 65535:
localError(p.config, n.info,
"Your case statement contains too many branches, consider using if/else instead!")
while v.intVal <= e[1].intVal:
gen(p, v, cond)
lineF(p, "case $1:$n", [cond.rdLoc])
Expand Down
5 changes: 1 addition & 4 deletions tests/js/t8821.nim
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
discard """
errormsg: "Your case statement contains too many branches, consider using if/else instead!"
"""

proc isInt32(i: int): bool =
case i
Expand All @@ -9,4 +6,4 @@ proc isInt32(i: int): bool =
else:
return false

discard isInt32(1)
doAssert isInt32(1) == true

0 comments on commit 8ef57ed

Please sign in to comment.