<!-- 
RSS generated by JIRA (4.4#649-r158309) at Sat May 18 15:13:36 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/si/jira.issueviews:issue-xml/CLJS-178/CLJS-178.xml?field=key&field=summary
-->
<rss version="0.92" >
<channel>
    <title>Clojure JIRA</title>
    <link>http://dev.clojure.org/jira</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>4.4</version>
        <build-number>649</build-number>
        <build-date>25-07-2011</build-date>
    </build-info>

<item>
            <title>[CLJS-178] PersistentHashMap implementation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-178</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&lt;tt&gt;0001-PersistentHashMap-ported-from-Clojure.patch&lt;/tt&gt; contains a port of Clojure&apos;s &lt;tt&gt;PersistentHashMap&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;0002-...-.patch&lt;/tt&gt; rewires &lt;tt&gt;cljs.core/hash-map&lt;/tt&gt; and &lt;tt&gt;cljs.compiler/emit&lt;/tt&gt;&apos;s &lt;tt&gt;:map&lt;/tt&gt; method to use &lt;tt&gt;cljs.core.PersistentHashMap&lt;/tt&gt;. With that in place, the regular cljs test suite runs fine.&lt;/p&gt;

&lt;p&gt;As a quick sanity check,&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(loop [m cljs.core.PersistentHashMap/EMPTY i 0]
  (if (&amp;lt; i 10000)
    (recur (assoc m i :foo) (inc i))
    (loop [i 0]
      (if (&amp;lt; i 10000)
        (do (assert (= :foo (get m i)))
            (recur (inc i)))))))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;runs fine under Rhino. Timing this loop produces the expected results: it takes 1.1s on my machine as written above and 10.5s with cljs.core.HashMap/EMPTY bound to m. With 100000 iterations, PersistentHashMap takes 11.8s, whereas HashMap takes forever.&lt;/p&gt;

&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;iron out any remaining bugs, add in missing protocols (if any) etc.,&lt;/li&gt;
	&lt;li&gt;test HashCollisionNode and related code,&lt;/li&gt;
	&lt;li&gt;use other map types for small maps and switch at some threshold.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;See &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/DMcV4QwApuY/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/DMcV4QwApuY/discussion&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15328">CLJS-178</key>
            <summary>PersistentHashMap implementation</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Wed, 11 Apr 2012 18:09:48 -0500</created>
                <updated>Thu, 19 Apr 2012 22:41:18 -0500</updated>
                    <resolved>Thu, 19 Apr 2012 22:41:18 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28104" author="michalmarczyk" created="Thu, 12 Apr 2012 07:50:09 -0500"  >&lt;p&gt;Note that I&apos;m developing this code on a branch at&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/persistent-hash-map&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/persistent-hash-map&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The branch may be ahead of the patch here (as it is at the time of this writing); I&apos;ll update the patch periodically.&lt;/p&gt;

&lt;p&gt;The rewiring gets tested on a separate branch:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/persistent-hash-map-tests&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/persistent-hash-map-tests&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28105" author="dnolen" created="Thu, 12 Apr 2012 10:08:19 -0500"  >&lt;p&gt;Some notes after a quick look. Don&apos;t use js*. We have (make-array n) now.&lt;/p&gt;

&lt;p&gt;Don&apos;t create a protocol for the node interface. Protocols are nice but introduce overhead. Just add those methods via Object.&lt;/p&gt;</comment>
                    <comment id="28107" author="michalmarczyk" created="Thu, 12 Apr 2012 12:14:43 -0500"  >&lt;p&gt;Thanks! Updated both branches with these changes, plus a new bit-shift-right-zero-fill function in core (with accompanying compiler macro).&lt;/p&gt;</comment>
                    <comment id="28110" author="dnolen" created="Thu, 12 Apr 2012 14:44:04 -0500"  >&lt;p&gt;Please attach new patches here with the changes - thanks.&lt;/p&gt;</comment>
                    <comment id="28111" author="dnolen" created="Thu, 12 Apr 2012 14:53:54 -0500"  >&lt;p&gt;I also notice that you&apos;re using js* in a couple of other places to inline array constructors. But array is already a compiler macro - again no need for js*. &lt;/p&gt;</comment>
                    <comment id="28112" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500"  >&lt;p&gt;These patches bring master in line with my persistent-hash-map branch; the &quot;rewiring&quot; are coming in a moment.&lt;/p&gt;</comment>
                    <comment id="28113" author="michalmarczyk" created="Thu, 12 Apr 2012 15:05:41 -0500"  >&lt;p&gt;Ah, actually the original rewiring patch still works.&lt;/p&gt;

&lt;p&gt;@David Nolen: Thanks for the review! No js* left in PHM now.&lt;/p&gt;

&lt;p&gt;Incidentally, I&apos;ve run a couple of tests of hash collision handling &amp;#8211; seems to work fine so far. Also, the way sets are implemented in cljs, they too are persistent with the PHM impl wired for use in cljs.core/hash-map.&lt;/p&gt;

&lt;p&gt;One more thing: PHM needs a function to count bits set in a given (presumably integral) number, which I&apos;ve introduced under the name of cljs.core/bit-count. It is currently not marked private, but it resides in the PHM section of core.cljs. I think it might be generally useful, so I&apos;m inclined to add a docstring and add it to the bit ops section; otherwise it should probably be marked private.&lt;/p&gt;</comment>
                    <comment id="28114" author="dnolen" created="Thu, 12 Apr 2012 15:08:08 -0500"  >&lt;p&gt;Cool. Can you please construct a single patch with all the changes, thanks.&lt;/p&gt;</comment>
                    <comment id="28115" author="michalmarczyk" created="Thu, 12 Apr 2012 15:31:02 -0500"  >&lt;p&gt;@David Nolen: Sure. The new patch includes all changes (in particular it wires up the compiler and hash-map to use PHM) and places bit-count in the bit-ops section (with a docstring).&lt;/p&gt;</comment>
                    <comment id="28116" author="dnolen" created="Thu, 12 Apr 2012 15:37:16 -0500"  >&lt;p&gt;Please remove any code behind #_. Looking more closely at your code, why are you using atoms? Is the added-leaf field only set once per node? If so why not a ^:mutable field for those deftypes. &lt;/p&gt;</comment>
                    <comment id="28117" author="michalmarczyk" created="Thu, 12 Apr 2012 15:46:18 -0500"  >&lt;p&gt;&lt;tt&gt;added-leaf?&lt;/tt&gt; is set at most once per an `assoc` to a PHM to signal that the new PHM needs to have an incremented count in relation to the original. Clojure&apos;s impl uses mutable Boxes for this purpose. Looking at this again, I guess a singleton array would make more sense than an atom; I&apos;ll make the change.&lt;/p&gt;</comment>
                    <comment id="28118" author="dnolen" created="Thu, 12 Apr 2012 15:52:39 -0500"  >&lt;p&gt;Sounds good.&lt;/p&gt;</comment>
                    <comment id="28119" author="michalmarczyk" created="Thu, 12 Apr 2012 16:38:44 -0500"  >&lt;p&gt;All in one.&lt;/p&gt;</comment>
                    <comment id="28120" author="dnolen" created="Thu, 12 Apr 2012 16:56:55 -0500"  >&lt;p&gt;Looks good! I ran some quick perf tests - access times on small maps vs. ObjMap is actually a significant performance hit. I&apos;ll review the patch more thoroughly. I do note that update performance on V8 is pretty stellar.&lt;/p&gt;

&lt;p&gt;Fantastic work! I think we&apos;re getting very close.&lt;/p&gt;</comment>
                    <comment id="28122" author="michalmarczyk" created="Thu, 12 Apr 2012 23:16:18 -0500"  >&lt;p&gt;I&apos;ve got an updated version on a branch here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/phm-wip-2&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/phm-wip-2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately I&apos;ve got to dash right now, so I&apos;ll post a new monolithic patch sometime later. I&apos;m closing in on a transient hash map implementation too &amp;#8211; it should be ready sometime &lt;b&gt;very&lt;/b&gt; soon now.&lt;/p&gt;

&lt;p&gt;Many thanks for the review and all the helpful tips, David! The latest branch incorporates some of the changes you suggested, with others due to land next time I&apos;m at the keyboard.&lt;/p&gt;</comment>
                    <comment id="28125" author="michalmarczyk" created="Fri, 13 Apr 2012 07:20:31 -0500"  >&lt;p&gt;The latest changes are available in two branches on my fork, &lt;tt&gt;phm&lt;/tt&gt; and &lt;tt&gt;phm-transient&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;phm&lt;/tt&gt; is just the old monolithic commit. &lt;tt&gt;phm-transient&lt;/tt&gt;, on the other hand, introduces TransientHashMap, TransientObjMap, various performance-related fixes (as per David&apos;s suggestions; one thing I haven&apos;t got around to yet is the alternative bit-count impl &amp;#8211; will do that soon) and I believe even a bug fix or two. It&apos;s available for viewing at&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/phm-transient&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/phm-transient&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&apos;ll post the patch here in a moment. I&apos;ll also rip it apart into single-concern commits if appropriate &amp;#8211; I&apos;m afraid I got into the flow on this during a longish train ride, so it&apos;s another monolithic commit for now.&lt;/p&gt;</comment>
                    <comment id="28126" author="michalmarczyk" created="Fri, 13 Apr 2012 07:21:20 -0500"  >&lt;p&gt;Meant to be applied on top of the previous monolithic patch.&lt;/p&gt;</comment>
                    <comment id="28127" author="dnolen" created="Fri, 13 Apr 2012 07:26:22 -0500"  >&lt;p&gt;Yes please move the transient work into a separate patch, thanks!&lt;/p&gt;</comment>
                    <comment id="28128" author="michalmarczyk" created="Fri, 13 Apr 2012 07:36:01 -0500"  >&lt;p&gt;Ok, no problem. Will do that in the next batch sometime soon, since again I need to dash right now. Should any bugs surface in the meantime, I&apos;ll fix them as soon as possible too.&lt;/p&gt;</comment>
                    <comment id="28154" author="michalmarczyk" created="Mon, 16 Apr 2012 09:32:54 -0500"  >&lt;p&gt;PHM without the transient stuff available at&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/phm2&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/phm2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Will attach patch in a moment.&lt;/p&gt;</comment>
                    <comment id="28155" author="michalmarczyk" created="Mon, 16 Apr 2012 09:35:01 -0500"  >&lt;p&gt;Here&apos;s the patch. Applies cleanly onto the current master.&lt;/p&gt;</comment>
                    <comment id="28156" author="dnolen" created="Mon, 16 Apr 2012 09:43:50 -0500"  >&lt;p&gt;Before moving forward with this it would be useful to get a jsperf benchmark comparing performance to ObjMap and HashMap for big/small, access/update, string/non-string keys. Mind putting this together? Once we have that we can pick a strategy that won&apos;t slow down existing programs.&lt;/p&gt;</comment>
                    <comment id="28157" author="michalmarczyk" created="Mon, 16 Apr 2012 11:01:57 -0500"  >&lt;p&gt;Here&apos;s a first cut at some tests... but I must have something or other mixed up, because the results are crazy. Any hints will be greatly appreciated.&lt;/p&gt;

&lt;p&gt;This is the code used by the test cases:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/cljs-persistent-hash-map-test&quot;&gt;https://github.com/michalmarczyk/cljs-persistent-hash-map-test&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here is the current batch of tests:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-tiny-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-tiny-assoc&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-small-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-small-assoc&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-large-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-large-assoc&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-access&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-access&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28158" author="michalmarczyk" created="Mon, 16 Apr 2012 12:12:39 -0500"  >&lt;p&gt;A further pair of test cases for associng non-string keys:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-assoc-non-string&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-assoc-non-string&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-large-assoc-non-string&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-large-assoc-non-string&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, to make the earlier comment clearer &amp;#8211; the results are crazy, because in Chrome PHM just totally trounces everything, even at small map sizes.&lt;/p&gt;</comment>
                    <comment id="28159" author="michalmarczyk" created="Mon, 16 Apr 2012 13:39:20 -0500"  >&lt;p&gt;I have a new branch based off of the latest PHM code and including transient support for PHM (but not ObjMap &amp;#8211; leaving that on the previous phm-transient branch for now).&lt;/p&gt;

&lt;p&gt;Here&apos;s the branch:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/michalmarczyk/clojurescript/tree/phm2-transient&quot;&gt;https://github.com/michalmarczyk/clojurescript/tree/phm2-transient&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here&apos;s a jsPerf test (with transient/assoc!/persistent! being twice as fast to build a PHM of 10000 entries than assoc in Chrome):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-transient-support&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-transient-support&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28160" author="michalmarczyk" created="Mon, 16 Apr 2012 13:49:06 -0500"  >&lt;p&gt;Here&apos;s the patch (applies cleanly on top of the previous PHM patch).&lt;/p&gt;

&lt;p&gt;I&apos;ve updated the test with slightly modified preparation code (I used a version with cljs.core/hash-map not using transient &amp;#8211; no difference in this case, but still, now it&apos;s using the actual code from the patch).&lt;/p&gt;</comment>
                    <comment id="28161" author="dnolen" created="Mon, 16 Apr 2012 13:49:26 -0500"  >&lt;p&gt;Please a create a new ticket and put the transient patch there, thanks!&lt;/p&gt;</comment>
                    <comment id="28162" author="michalmarczyk" created="Mon, 16 Apr 2012 13:51:08 -0500"  >&lt;p&gt;Makes sense, will do right now.&lt;/p&gt;</comment>
                    <comment id="28163" author="michalmarczyk" created="Mon, 16 Apr 2012 13:56:16 -0500"  >&lt;p&gt;Done:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-181&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-181&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28166" author="michalmarczyk" created="Mon, 16 Apr 2012 18:45:55 -0500"  >&lt;p&gt;There is an issue which hasn&apos;t occurred to me previously &amp;#8211; a lot of code (including TwitterBuzz) will simply break with PHM wired in due to the way in which people use &lt;tt&gt;-strobj&lt;/tt&gt;. Of course nobody ever promised &lt;tt&gt;-strobj&lt;/tt&gt; to work... But a replacement would be nice.&lt;/p&gt;

&lt;p&gt;For the sort of uses of &lt;tt&gt;-strobj&lt;/tt&gt; I see at first glance, making &lt;tt&gt;js-obj&lt;/tt&gt; accept varargs like &lt;tt&gt;hash-map&lt;/tt&gt; does (and &lt;tt&gt;array&lt;/tt&gt;!) and construct a JS object with appropriate entries would be an adequate solution; the rest could be expected to use a conversion function.&lt;/p&gt;

&lt;p&gt;If breaking &lt;tt&gt;-strobj&lt;/tt&gt; proves to be a major problem, though, I do have code ready (on an older branch previously linked to from here, phm-transient) which causes ObjMaps to be constructed for small maps with string keys (then a PHM is built using a transient when a non-string key is encountered or the OM grows too large).&lt;/p&gt;</comment>
                    <comment id="28175" author="michalmarczyk" created="Thu, 19 Apr 2012 07:18:25 -0500"  >&lt;p&gt;Added a test case for 6 key `assoc` @ &lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-miniscule-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-miniscule-assoc&lt;/a&gt;. PHM still wins in Chrome and FF1 and loses by a reasonable margin to ObjMap on Iceweasel.&lt;/p&gt;

&lt;p&gt;Also, for completeness, here&apos;s a 20 key, &quot;mutable is fine&quot; `assoc` / `aset` test with JS object included: &lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-vs-js-object-small&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-vs-js-object-small&lt;/a&gt;, where unsurprisingly JS objects dominate. (Note that transients are &lt;b&gt;a lot&lt;/b&gt; faster than PHM for building large maps &amp;#8211; see the test linked to in a previous comment, &lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-transient-support&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-transient-support&lt;/a&gt;.)&lt;/p&gt;</comment>
                    <comment id="28176" author="michalmarczyk" created="Thu, 19 Apr 2012 07:48:34 -0500"  >&lt;p&gt;4 key `assoc`: &lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-minuscule-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-minuscule-assoc&lt;/a&gt;.&lt;br/&gt;
8 key `assoc`: &lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-teeny-assoc&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-teeny-assoc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Same results, basically.&lt;/p&gt;</comment>
                    <comment id="28177" author="dnolen" created="Thu, 19 Apr 2012 08:54:07 -0500"  >&lt;p&gt;This great. For completeness can we compare against defrecord w/ 4 keys? Thanks!&lt;/p&gt;</comment>
                    <comment id="28178" author="michalmarczyk" created="Thu, 19 Apr 2012 09:54:30 -0500"  >&lt;p&gt;Sure, here&apos;s a test:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsperf.com/cljs-persistent-hash-map-vs-records-minuscule&quot;&gt;http://jsperf.com/cljs-persistent-hash-map-vs-records-minuscule&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initial test run suggests that a record is significantly faster for {assoc} onto fields and significantly slower if using {_&lt;em&gt;extmap} (NB. here the {&lt;/em&gt;_extmap} is itself a PHM).&lt;/p&gt;</comment>
                    <comment id="28181" author="dnolen" created="Thu, 19 Apr 2012 22:41:18 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/ef0d52541b02bcf767f2f54f497c8808c6afa91d&quot;&gt;https://github.com/clojure/clojurescript/commit/ef0d52541b02bcf767f2f54f497c8808c6afa91d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11046" name="0001-PersistentHashMap-improvements-TransientHashMap-Tran.patch" size="37860" author="michalmarczyk" created="Fri, 13 Apr 2012 07:21:20 -0500" />
                    <attachment id="11055" name="0001-PersistentHashMap-ported-from-Clojure.patch" size="20440" author="michalmarczyk" created="Mon, 16 Apr 2012 09:35:01 -0500" />
                    <attachment id="11045" name="0001-PersistentHashMap-ported-from-Clojure.patch" size="19536" author="michalmarczyk" created="Thu, 12 Apr 2012 16:38:44 -0500" />
                    <attachment id="11044" name="0001-PersistentHashMap-ported-from-Clojure.patch" size="18704" author="michalmarczyk" created="Thu, 12 Apr 2012 15:31:02 -0500" />
                    <attachment id="11038" name="0001-PersistentHashMap-ported-from-Clojure.patch" size="16692" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                    <attachment id="11036" name="0001-PersistentHashMap-ported-from-Clojure.patch" size="16688" author="michalmarczyk" created="Wed, 11 Apr 2012 18:09:48 -0500" />
                    <attachment id="11039" name="0002-Fix-BitmapIndexedNode-s-inode-find-impl-with-not-fou.patch" size="1577" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                    <attachment id="11037" name="0002-Have-cljs.core-hash-map-and-compiler-s-emit-map-use-.patch" size="1568" author="michalmarczyk" created="Wed, 11 Apr 2012 18:09:48 -0500" />
                    <attachment id="11057" name="0002-Transient-support-for-PersistentHashMap-ported-from-.patch" size="24711" author="michalmarczyk" created="Mon, 16 Apr 2012 13:49:06 -0500" />
                    <attachment id="11056" name="0002-Transient-support-for-PersistentHashMap-ported-from-.patch" size="24711" author="michalmarczyk" created="Mon, 16 Apr 2012 13:46:50 -0500" />
                    <attachment id="11040" name="0003-Remove-most-uses-of-js-in-PersistentHashMap-add-bit-.patch" size="5274" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                    <attachment id="11041" name="0004-Remove-INode-proto-impl-methods-via-Object.patch" size="12675" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                    <attachment id="11042" name="0005-PersistentHashMap-rename-added-leaf-to-added-leaf.patch" size="7354" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                    <attachment id="11043" name="0006-Remove-remaining-uses-of-js-in-PersistentHashMap.patch" size="1404" author="michalmarczyk" created="Thu, 12 Apr 2012 15:00:01 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>
</channel>
</rss>