From 3ed16f32c6532d30eccd76ed41f90c956051ac58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Marczyk?= Date: Thu, 24 Jan 2013 07:45:35 +0100 Subject: [PATCH] CLJS-461: preserve metadata on automatic map conversions Also includes basic tests based on the failing form from the ticket. --- src/cljs/cljs/core.cljs | 13 ++++++------- test/cljs/cljs/core_test.cljs | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/cljs/cljs/core.cljs b/src/cljs/cljs/core.cljs index 019362ee9b..df8d218042 100644 --- a/src/cljs/cljs/core.cljs +++ b/src/cljs/cljs/core.cljs @@ -3597,13 +3597,13 @@ reduces them without incurring seq initialization" (let [ks (.-keys m) len (alength ks) so (.-strobj m) - out (with-meta cljs.core.PersistentHashMap/EMPTY (meta m))] + mm (meta m)] (loop [i 0 - out (transient out)] + out (transient cljs.core.PersistentHashMap/EMPTY)] (if (< i len) (let [k (aget ks i)] (recur (inc i) (assoc! out k (aget so k)))) - (persistent! (assoc! out k v)))))) + (with-meta (persistent! (assoc! out k v)) mm))))) ;;; ObjMap @@ -3912,10 +3912,9 @@ reduces them without incurring seq initialization" (.push k) (.push v)) nil) - (persistent! - (assoc! - (transient (into cljs.core.PersistentHashMap/EMPTY coll)) - k v))) + (with-meta + (assoc (into cljs.core.PersistentHashMap/EMPTY coll) k v) + meta)) (identical? v (aget arr (inc idx))) coll diff --git a/test/cljs/cljs/core_test.cljs b/test/cljs/cljs/core_test.cljs index 84e4787c63..2d1d2f3773 100644 --- a/test/cljs/cljs/core_test.cljs +++ b/test/cljs/cljs/core_test.cljs @@ -1262,6 +1262,20 @@ (assert (= (count m1) 100)) (assert (= (count m2) 100))))) + ;; CLJS-461: automatic map conversions + (loop [i 0 m (with-meta {} {:foo :bar}) result []] + (if (<= i (+ cljs.core.ObjMap/HASHMAP_THRESHOLD 2)) + (recur (inc i) (assoc m (str i) i) (conj result (meta m))) + (let [n (inc (+ cljs.core.ObjMap/HASHMAP_THRESHOLD 2)) + expected (repeat n {:foo :bar})] + (assert (= result expected))))) + (loop [i 0 m (with-meta {-1 :quux} {:foo :bar}) result []] + (if (<= i (+ cljs.core.PersistentArrayMap/HASHMAP_THRESHOLD 2)) + (recur (inc i) (assoc m i i) (conj result (meta m))) + (let [n (inc (+ cljs.core.PersistentArrayMap/HASHMAP_THRESHOLD 2)) + expected (repeat n {:foo :bar})] + (assert (= result expected))))) + ;; TransientHashSet (loop [s (transient #{}) i 0]