fixes #10963, disallow implicit mixing of strings and ints/floats (#11292)

This commit is contained in:
Miran 2019-05-21 21:32:37 +02:00 • committed by Andreas Rumpf
commit bab5e30972
6 changed files with 25 additions and 17 deletions

View file

@ -692,12 +692,12 @@ proc toPretty(result: var string, node: JsonNode, indent = 2, ml = true,
of JInt:
if lstArr: result.indent(currIndent)
when defined(js): result.add($node.num)
else: result.add(node.num)
else: result.addInt(node.num)
of JFloat:
if lstArr: result.indent(currIndent)
# Fixme: implement new system.add ops for the JS target
when defined(js): result.add($node.fnum)
else: result.add(node.fnum)
else: result.addFloat(node.fnum)
of JBool:
if lstArr: result.indent(currIndent)
result.add(if node.bval: "true" else: "false")
@ -773,10 +773,10 @@ proc toUgly*(result: var string, node: JsonNode) =
node.str.escapeJson(result)
of JInt:
when defined(js): result.add($node.num)
else: result.add(node.num)
else: result.addInt(node.num)
of JFloat:
when defined(js): result.add($node.fnum)
else: result.add(node.fnum)
else: result.addFloat(node.fnum)
of JBool:
result.add(if node.bval: "true" else: "false")
of JNull:

View file

@ -40,14 +40,14 @@ proc hashString(s: string): int {.compilerproc.} =
h = h +% h shl 15
result = h
proc add*(result: var string; x: int64) =
proc addInt*(result: var string; x: int64) =
## Converts integer to its string representation and appends it to `result`.
##
## .. code-block:: Nim
## var
## a = "123"
## b = 45
## a.add(b) # a <- "12345"
## a.addInt(b) # a <- "12345"
let base = result.len
setLen(result, base + sizeof(x)*4)
var i = 0
@ -66,18 +66,22 @@ proc add*(result: var string; x: int64) =
for j in 0..i div 2 - 1:
swap(result[base+j], result[base+i-j-1])
proc add*(result: var string; x: int64) {.deprecated:
"Deprecated since v0.20, use 'addInt'".} =
addInt(result, x)
proc nimIntToStr(x: int): string {.compilerRtl.} =
result = newStringOfCap(sizeof(x)*4)
result.add x
result.addInt x
proc add*(result: var string; x: float) =
proc addFloat*(result: var string; x: float) =
## Converts float to its string representation and appends it to `result`.
##
## .. code-block:: Nim
## var
## a = "123"
## b = 45.67
## a.add(b) # a <- "12345.67"
## a.addFloat(b) # a <- "12345.67"
when nimvm:
result.add $x
else:
@ -113,9 +117,13 @@ proc add*(result: var string; x: float) =
result.add buf[i]
inc i
proc add*(result: var string; x: float) {.deprecated:
"Deprecated since v0.20, use 'addFloat'".} =
addFloat(result, x)
proc nimFloatToStr(f: float): string {.compilerproc.} =
result = newStringOfCap(8)
result.add f
result.addFloat f
proc c_strtod(buf: cstring, endptr: ptr cstring): float64 {.
importc: "strtod", header: "<stdlib.h>", noSideEffect.}
@ -284,7 +292,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
proc nimInt64ToStr(x: int64): string {.compilerRtl.} =
result = newStringOfCap(sizeof(x)*4)
result.add x
result.addInt x
proc nimBoolToStr(x: bool): string {.compilerRtl.} =
return if x: "true" else: "false"