Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

$(a: float) now works consistently in nim js, avoiding printing floats as ints #14134

Merged
merged 3 commits into from
Apr 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -530,11 +530,10 @@ proc arithAux(p: PProc, n: PNode, r: var TCompRes, op: TMagic) =
gen(p, n[1], r)
xLoc = r.rdLoc

template applyFormat(frmtA, frmtB: string) =
if i == 0:
r.res = frmtA % [xLoc, yLoc]
else:
r.res = frmtB % [xLoc, yLoc]
template applyFormat(frmt) =
r.res = frmt % [xLoc, yLoc]
template applyFormat(frmtA, frmtB) =
if i == 0: applyFormat(frmtA) else: applyFormat(frmtB)

case op:
of mAddI: applyFormat("addInt($1, $2)", "($1 + $2)")
Expand Down Expand Up @@ -596,7 +595,9 @@ proc arithAux(p: PProc, n: PNode, r: var TCompRes, op: TMagic) =
of mBoolToStr: applyFormat("nimBoolToStr($1)", "nimBoolToStr($1)")
of mIntToStr: applyFormat("cstrToNimstr(($1)+\"\")", "cstrToNimstr(($1)+\"\")")
of mInt64ToStr: applyFormat("cstrToNimstr(($1)+\"\")", "cstrToNimstr(($1)+\"\")")
of mFloatToStr: applyFormat("cstrToNimstr(($1)+\"\")", "cstrToNimstr(($1)+\"\")")
of mFloatToStr:
useMagic(p, "nimFloatToString")
applyFormat "cstrToNimstr(nimFloatToString($1))"
of mCStrToStr: applyFormat("cstrToNimstr($1)", "cstrToNimstr($1)")
of mStrToStr, mUnown: applyFormat("$1", "$1")
else:
Expand Down
15 changes: 15 additions & 0 deletions lib/system/jssys.nim
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,21 @@ proc negInt(a: int): int {.compilerproc.} =
proc negInt64(a: int64): int64 {.compilerproc.} =
result = a*(-1)

proc nimFloatToString(a: float): cstring {.compilerproc.} =
## ensures the result doesn't print like an integer, ie return 2.0, not 2
asm """
function nimOnlyDigitsOrMinus(n) {
return n.toString().match(/^-?\d+$/);
}
if (Number.isSafeInteger(`a`)) `result` = `a`+".0"
else {
`result` = `a`+""
if(nimOnlyDigitsOrMinus(`result`)){
`result` = `a`+".0"
}
}
"""

proc absInt(a: int): int {.compilerproc.} =
result = if a < 0: a*(-1) else: a

Expand Down
11 changes: 6 additions & 5 deletions tests/js/tbyvar.nim
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
discard """
output: '''foo 12
output: '''
foo 12
bar 12
2
foo 12
bar 12
2
12.5
(nums: @[5, 5, 10, 5, 5, 5, 5, 5, 5, 5])
(nums: @[5, 5, 50, 5, 5, 5, 5, 5, 5, 5])
(nums: @[5, 5, 45, 5, 5, 5, 5, 5, 5, 5])
(nums: @[5, 5, 9, 5, 5, 5, 5, 5, 5, 5])
(nums: @[5.0, 5.0, 10.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
(nums: @[5.0, 5.0, 50.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
(nums: @[5.0, 5.0, 45.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
(nums: @[5.0, 5.0, 9.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
asd
'''
"""
Expand Down
62 changes: 62 additions & 0 deletions tests/js/tdollar_float.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#[
merge into tests/system/tdollars.nim once https://github.com/nim-lang/Nim/pull/14122
is merged
]#

import unittest

block: # https://github.com/timotheecour/Nim/issues/133
# simple test
var a: float = 2
check $a == "2.0"

# systematic tests
template fun(a2: static float) =
const a: float = a2 # needed pending https://github.com/timotheecour/Nim/issues/132
var b = a
check $b == $a

fun 2
fun 2.0
fun 2.1
fun 1_000
fun 1_000.1
fun 1_000_000_000.1
fun 1_000_000_000_000.1

# negatives
fun -2.0
fun -2.1

# 0
fun 0
fun -0
fun 0.0

block:
var a = -0.0
check $a in ["-0.0", "0.0"]

# exponents
block:
var a = 5e20
check $a in ["5e20", "500000000000000000000.0"]

fun 3.4e1'f32
fun 3.4e-1'f32
fun -3.4e-1'f32
fun 3.4e-1'f32
fun 3e-1'f32

block:
var a = 3.4e38'f32
check $a in ["3.4e+38", "3.4e+038"]
# on windows, printf (used in VM) prints as 3.4e+038
# but js prints as 3.4e+38
# on osx, both print as 3.4e+38
# see https://github.com/timotheecour/Nim/issues/138

when false: # edge cases
fun -0.0 # see https://github.com/timotheecour/Nim/issues/136
fun 5e20
fun 3.4e38'f32