From 16666f37cc13ead5a66330046db82a2976b6f1f0 Mon Sep 17 00:00:00 2001 From: Mike Fikes Date: Sat, 20 Feb 2016 16:29:11 -0500 Subject: [PATCH] CLJS-1573: Self-host: Invalid UTF escaping in cljs-in-cljs Zero-pad \u escapes --- src/main/clojure/cljs/compiler.cljc | 6 +++-- src/test/self/self_host/test.cljs | 34 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/compiler.cljc b/src/main/clojure/cljs/compiler.cljc index 50843ae452..a2aa9cfb52 100644 --- a/src/main/clojure/cljs/compiler.cljc +++ b/src/main/clojure/cljs/compiler.cljc @@ -132,8 +132,10 @@ 9 "\\t" (if (< 31 cp 127) c ; Print simple ASCII characters - #?(:clj (format "\\u%04X" cp) - :cljs (str "\\u" (.toString cp 16))))))) ; Any other character is Unicode + #?(:clj (format "\\u%04X" cp) ; Any other character is Unicode + :cljs (let [unpadded (.toString cp 16) + pad (subs "0000" (.-length unpadded))] + (str "\\u" pad unpadded))))))) (defn- escape-string [^CharSequence s] (let [sb #?(:clj (StringBuilder. (count s)) diff --git a/src/test/self/self_host/test.cljs b/src/test/self/self_host/test.cljs index 2f1448fcf1..c90bff8f83 100644 --- a/src/test/self/self_host/test.cljs +++ b/src/test/self/self_host/test.cljs @@ -240,6 +240,40 @@ (is (nil? value)) (is (= "if-let requires a vector for its binding at line 1 " (ex-message (ex-cause error))))))) +(deftest test-CLJS-1573 + (cljs/compile-str st + "\"90°\"" + nil + {:eval node-eval + :context :expr} + (fn [{:keys [error value]}] + (is (nil? error)) + (is (= "\"90\\u00b0\"" value)))) + (cljs/compile-str st + "\"Ϊ\"" + nil + {:eval node-eval + :context :expr} + (fn [{:keys [error value]}] + (is (nil? error)) + (is (= "\"\\u03aa\"" value)))) + (cljs/compile-str st + "\"ሴ\"" + nil + {:eval node-eval + :context :expr} + (fn [{:keys [error value]}] + (is (nil? error)) + (is (= "\"\\u1234\"" value)))) + (cljs/eval-str st + "\"90°\"" + nil + {:eval node-eval + :context :expr} + (fn [{:keys [error value]}] + (is (nil? error)) + (is (= "90°" value))))) + #_(deftest test-eval-str-with-require (async done (let [l (latch 3 done)]