summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorBung <crc32@qq.com>2022-10-14 18:21:02 +0800
committerGitHub <noreply@github.com>2022-10-14 12:21:02 +0200
commitb286448a99f9c77333d9648ae5d3042fbaf5aa48 (patch)
tree2d3f0da2ed64f94274a93517979ef2d83128c8dd
parent07b645342abd06b2323df042c170eb847f51880d (diff)
downloadNim-b286448a99f9c77333d9648ae5d3042fbaf5aa48.tar.gz
fix #8821 JS codegen can produce extreme switch statements with case … (#20548)
* fix #8821 JS codegen can produce extreme switch statements with case a of range

* remove totalRange
-rw-r--r--compiler/jsgen.nim7
-rw-r--r--tests/js/t8821.nim5
2 files changed, 2 insertions, 10 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim
index de157ed49..267b9ba34 100644
--- a/compiler/jsgen.nim
+++ b/compiler/jsgen.nim
@@ -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
@@ -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])
@@ -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])
diff --git a/tests/js/t8821.nim b/tests/js/t8821.nim
index 43cf3f6f2..38c88efa8 100644
--- a/tests/js/t8821.nim
+++ b/tests/js/t8821.nim
@@ -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 
@@ -9,4 +6,4 @@ proc isInt32(i: int): bool =
   else:
     return false
 
-discard isInt32(1)
\ No newline at end of file
+doAssert isInt32(1) == true
\ No newline at end of file