Merge remote-tracking branch 'nim-lang/devel' into emscripten-support

This commit is contained in:
Andrey Sobolev 2015-09-15 14:13:25 +06:00
commit bbf77e1d23
7 changed files with 66 additions and 12 deletions

View file

@ -1074,9 +1074,9 @@ when not defined(js):
## for nice error messages.
var p: JsonParser
p.open(s, filename)
defer: p.close()
discard getTok(p) # read first token
result = p.parseJson()
p.close()
proc parseJson*(buffer: string): JsonNode =
## Parses JSON from `buffer`.
@ -1203,6 +1203,17 @@ when isMainModule:
testJson{["c", "d"]} = %true
assert(testJson["c"]["d"].bval)
# make sure no memory leek when parsing invalid string
let startMemory = getOccupiedMem()
for i in 0 .. 10000:
try:
discard parseJson"""{ invalid"""
except:
discard
# memory diff should less than 2M
assert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024)
# test `$`
let stringified = $testJson
let parsedAgain = parseJson(stringified)

View file

@ -21,9 +21,22 @@ proc reprPointer(x: pointer): string {.compilerproc.} =
return $buf
proc `$`(x: uint64): string =
var buf: array [0..59, char]
discard c_sprintf(buf, "%llu", x)
return $buf
if x == 0:
result = "0"
else:
var buf: array [60, char]
var i = 0
var n = x
while n != 0:
let nn = n div 10'u64
buf[i] = char(n - 10'u64 * nn + ord('0'))
inc i
n = nn
let half = i div 2
# Reverse
for t in 0 .. < half: swap(buf[t], buf[i-t-1])
result = $buf
proc reprStrAux(result: var string, s: string) =
if cast[pointer](s) == nil:
@ -294,4 +307,3 @@ when not defined(useNimRtl):
reprAux(result, addr(p), typ, cl)
add result, "\n"
deinitReprClosure(cl)