_Jordan_ in IRC discovered a bug that can be distilled to:
user=> (let [x [3 2 1]] (sort x) x)
[1 2 3]
The sort function mutates the vector. This can happen because the
toArray() method of LazilyPersistenVector returns its own internal
array, instead of creating a new array like most other collections do.
sort then passes this along to Java's Arrays.sort() which mutates the
array.
Attached is a patch that makes LPV toArray() return a clone of the
array. This is of course somewhat less efficient, but it seems like
any less drastic solution leaves open the possibility of mutating the
array inside the vector.
--Chouser
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---
commit 28112e0208dea4374e6515240d8653d2a9af0caa
Author: Chouser <[EMAIL PROTECTED]>
Date: Wed Nov 19 20:17:48 2008 -0500
LazilyPersistentVector.toArray() now returns clone of array to prevent accidental mutation.
diff --git a/src/jvm/clojure/lang/LazilyPersistentVector.java b/src/jvm/clojure/lang/LazilyPersistentVector.java
index bbe580f..455ea42 100644
--- a/src/jvm/clojure/lang/LazilyPersistentVector.java
+++ b/src/jvm/clojure/lang/LazilyPersistentVector.java
@@ -35,7 +35,7 @@ LazilyPersistentVector(IPersistentMap meta, Object[] array, PersistentVector v){
}
public Object[] toArray(){
- return array;
+ return array.clone();
}
public Object nth(int i){