diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-01-21 15:30:21 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-01-21 15:30:21 +0100 |
commit | 263ee143f103e86daef167a04ec1886130701334 (patch) | |
tree | 3009e1d44ee7452c8556f0a994baa0ac8e79fa77 | |
parent | 72b975d1ff232a26aa48952387d4bb4a5d51e065 (diff) | |
parent | 8fab2f81e3c7bd2630bd53d8c530165808b564c2 (diff) | |
download | Nim-263ee143f103e86daef167a04ec1886130701334.tar.gz |
Merge pull request #3733 from yglukhov/js-unicode
Fixed unicode handling in JS. Fixes #3714.
-rw-r--r-- | compiler/jsgen.nim | 20 | ||||
-rw-r--r-- | lib/system/jssys.nim | 33 |
2 files changed, 45 insertions, 8 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index 14cdf0174..16a03a4ec 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -163,8 +163,26 @@ proc mangleName(s: PSym): Rope = add(result, rope(s.id)) s.loc.r = result +proc escapeJSString(s: string): string = + result = newStringOfCap(s.len + s.len shr 2) + result.add("\"") + for c in items(s): + case c + of '\l': result.add("\\n") + of '\r': result.add("\\r") + of '\t': result.add("\\t") + of '\b': result.add("\\b") + of '\a': result.add("\\a") + of '\e': result.add("\\e") + of '\v': result.add("\\v") + of '\\': result.add("\\\\") + of '\'': result.add("\\'") + of '\"': result.add("\\\"") + else: add(result, c) + result.add("\"") + proc makeJSString(s: string): Rope = - (if s.isNil: "null".rope else: strutils.escape(s).rope) + (if s.isNil: "null".rope else: escapeJSString(s).rope) include jstypes diff --git a/lib/system/jssys.nim b/lib/system/jssys.nim index 5bac54772..0bb0ffade 100644 --- a/lib/system/jssys.nim +++ b/lib/system/jssys.nim @@ -166,14 +166,33 @@ proc SetConstr() {.varargs, asmNoStackFrame, compilerproc.} = """ proc cstrToNimstr(c: cstring): string {.asmNoStackFrame, compilerproc.} = - asm """ - var result = []; - for (var i = 0; i < `c`.length; ++i) { - result[i] = `c`.charCodeAt(i); + {.emit: """ + var ln = `c`.length; + var result = new Array(ln); + var r = 0; + for (var i = 0; i < ln; ++i) { + var ch = `c`.charCodeAt(i); + + if (ch < 128) { + result[r] = ch; } - result[result.length] = 0; // terminating zero - return result; - """ + 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; + ++r; + result[r] = (ch & 63) | 128; + } + ++r; + } + result[r] = 0; // terminating zero + return result; + """.} proc toJSStr(s: string): cstring {.asmNoStackFrame, compilerproc.} = asm """ |