diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/json.nim | 3 | ||||
-rw-r--r-- | lib/system/jssys.nim | 25 |
2 files changed, 18 insertions, 10 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index e3d5191c6..8c687a8d1 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -1815,8 +1815,7 @@ when isMainModule: doAssert(testJson["e"]["f"].bval) # make sure UTF-16 decoding works. - when not defined(js): # TODO: The following line asserts in JS - doAssert(testJson["c"].str == "🎃") + doAssert(testJson["c"].str == "🎃") doAssert(testJson["d"].str == "æ") # make sure no memory leek when parsing invalid string diff --git a/lib/system/jssys.nim b/lib/system/jssys.nim index f23be2d78..24093a310 100644 --- a/lib/system/jssys.nim +++ b/lib/system/jssys.nim @@ -233,15 +233,24 @@ proc cstrToNimstr(c: cstring): string {.asmNoStackFrame, compilerproc.} = if (ch < 128) { result[r] = ch; } - else if((ch > 127) && (ch < 2048)) { - result[r] = (ch >> 6) | 192; - ++r; - result[r] = (ch & 63) | 128; - } else { - result[r] = (ch >> 12) | 224; - ++r; - result[r] = ((ch >> 6) & 63) | 128; + if (ch < 2048) { + result[r] = (ch >> 6) | 192; + } + else { + if (ch < 55296 || ch >= 57344) { + result[r] = (ch >> 12) | 224; + } + else { + ++i; + ch = 65536 + (((ch & 1023) << 10) | (`c`.charCodeAt(i) & 1023)); + result[r] = (ch >> 18) | 240; + ++r; + result[r] = ((ch >> 12) & 63) | 128; + } + ++r; + result[r] = ((ch >> 6) & 63) | 128; + } ++r; result[r] = (ch & 63) | 128; } |