summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2013-01-15 01:09:15 +0100
committerAraq <rumpf_a@web.de>2013-01-15 01:09:15 +0100
commit2f14d0e10890ccbdf4e2cdb2d553ad38ecb0322d (patch)
treee9eebe11bbb038d39d6ff52f8ef8f1564e4fb03c /lib
parentb3e70febb476a4e6512ee499aba130008c3fa1c8 (diff)
downloadNim-2f14d0e10890ccbdf4e2cdb2d553ad38ecb0322d.tar.gz
fixes a performance regression for json handling
Diffstat (limited to 'lib')
-rwxr-xr-xlib/pure/json.nim9
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index cee135f08..cca1e4a70 100755
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -541,6 +541,11 @@ proc newJString*(s: String): PJsonNode =
   result.kind = JString
   result.str = s
 
+proc newJStringMove(s: String): PJsonNode =
+  new(result)
+  result.kind = JString
+  shallowCopy(result.str, s)
+
 proc newJInt*(n: biggestInt): PJsonNode =
   ## Creates a new `JInt PJsonNode`.
   new(result)
@@ -809,7 +814,9 @@ proc parseJson(p: var TJsonParser): PJsonNode =
   ## Parses JSON from a JSON Parser `p`.
   case p.tok
   of tkString:
-    result = newJString(p.a)
+    # we capture 'p.a' here, so we need to give it a fresh buffer afterwards:
+    result = newJStringMove(p.a)
+    p.a = ""
     discard getTok(p)
   of tkInt:
     result = newJInt(parseBiggestInt(p.a))