summary refs log tree commit diff stats
path: root/lib/system
diff options
context:
space:
mode:
Diffstat (limited to 'lib/system')
-rw-r--r--lib/system/dollars.nim47
1 files changed, 29 insertions, 18 deletions
diff --git a/lib/system/dollars.nim b/lib/system/dollars.nim
index 4c72c2901..238c59837 100644
--- a/lib/system/dollars.nim
+++ b/lib/system/dollars.nim
@@ -3,6 +3,26 @@ proc `$`*(x: int): string {.magic: "IntToStr", noSideEffect.}
   ## converted to a decimal string. ``$`` is Nim's general way of
   ## spelling `toString`:idx:.
 
+template dollarImpl(x: uint | uint64, result: var string) =
+  type destTyp = typeof(x)
+  if x == 0:
+    result = "0"
+  else:
+    result = newString(60)
+    var i = 0
+    var n = x
+    while n != 0:
+      let nn = n div destTyp(10)
+      result[i] = char(n - destTyp(10) * nn + ord('0'))
+      inc i
+      n = nn
+    result.setLen i
+
+    let half = i div 2
+    # Reverse
+    for t in 0 .. half-1: swap(result[t], result[i-t-1])
+
+
 when defined(js):
   import std/private/since
   since (1, 3):
@@ -10,34 +30,25 @@ when defined(js):
       ## Caveat: currently implemented as $(cast[int](x)), tied to current
       ## semantics of js' Number type.
       # for c, see strmantle.`$`
-      $(cast[int](x))
+      when nimvm:
+        dollarImpl(x, result)
+      else:
+        result = $(int(x))
 
     proc `$`*(x: uint64): string =
       ## Compatibility note:
       ## the results may change in future releases if/when js target implements
       ## 64bit ints.
       # pending https://github.com/nim-lang/RFCs/issues/187
-      $(cast[int](x))
+      when nimvm:
+        dollarImpl(x, result)
+      else:
+        result = $(cast[int](x))
 else:
   proc `$`*(x: uint64): string {.noSideEffect, raises: [].} =
     ## The stringify operator for an unsigned integer argument. Returns `x`
     ## converted to a decimal string.
-    if x == 0:
-      result = "0"
-    else:
-      result = newString(60)
-      var i = 0
-      var n = x
-      while n != 0:
-        let nn = n div 10'u64
-        result[i] = char(n - 10'u64 * nn + ord('0'))
-        inc i
-        n = nn
-      result.setLen i
-
-      let half = i div 2
-      # Reverse
-      for t in 0 .. half-1: swap(result[t], result[i-t-1])
+    dollarImpl(x, result)
 
 proc `$`*(x: int64): string {.magic: "Int64ToStr", noSideEffect.}
   ## The stringify operator for an integer argument. Returns `x`