summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Grand <christophe@cgrand.net>2010-04-13 11:50:38 +0200
committerStuart Halloway <stu@thinkrelevance.com>2010-04-16 11:17:40 -0400
commitee9fc81dd2ef15d7ea3e17e7ec2370c5c09d633e (patch)
treefd493948d9e2d9c72b08a2baeda533a3ad71ed48
parenta2db3b5508cef22dcc5bcb7b386c17815ed83c6e (diff)
Check for identity before equality in .equals for collections, see #96
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/gvec.clj1
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java1
-rw-r--r--src/jvm/clojure/lang/APersistentSet.java1
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java1
-rw-r--r--src/jvm/clojure/lang/ASeq.java2
5 files changed, 5 insertions, 1 deletions
diff --git a/src/clj/clojure/gvec.clj b/src/clj/clojure/gvec.clj
index a47959b0..2b1223ad 100644
--- a/src/clj/clojure/gvec.clj
+++ b/src/clj/clojure/gvec.clj
@@ -84,6 +84,7 @@
Object
(equals [this o]
(cond
+ (identical? this o) true
(or (instance? clojure.lang.IPersistentVector o) (instance? java.util.RandomAccess o))
(and (= cnt (count o))
(loop [i (int 0)]
diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java
index e693a802..213eef71 100644
--- a/src/jvm/clojure/lang/APersistentMap.java
+++ b/src/jvm/clojure/lang/APersistentMap.java
@@ -44,6 +44,7 @@ public IPersistentCollection cons(Object o){
}
public boolean equals(Object obj){
+ if(this == obj) return true;
if(!(obj instanceof Map))
return false;
Map m = (Map) obj;
diff --git a/src/jvm/clojure/lang/APersistentSet.java b/src/jvm/clojure/lang/APersistentSet.java
index 988ff5dd..90275fcd 100644
--- a/src/jvm/clojure/lang/APersistentSet.java
+++ b/src/jvm/clojure/lang/APersistentSet.java
@@ -49,6 +49,7 @@ public Object invoke(Object arg1) throws Exception{
}
public boolean equals(Object obj){
+ if(this == obj) return true;
if(!(obj instanceof Set))
return false;
Set m = (Set) obj;
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java
index 1761b237..7ac9f32b 100644
--- a/src/jvm/clojure/lang/APersistentVector.java
+++ b/src/jvm/clojure/lang/APersistentVector.java
@@ -36,6 +36,7 @@ public ISeq rseq(){
}
static boolean doEquals(IPersistentVector v, Object obj){
+ if(v == obj) return true;
if(obj instanceof List || obj instanceof IPersistentVector)
{
Collection ma = (Collection) obj;
diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java
index 78e7b6ef..ffa7fa47 100644
--- a/src/jvm/clojure/lang/ASeq.java
+++ b/src/jvm/clojure/lang/ASeq.java
@@ -46,7 +46,7 @@ public boolean equiv(Object obj){
}
public boolean equals(Object obj){
-
+ if(this == obj) return true;
if(!(obj instanceof Sequential || obj instanceof List))
return false;
ISeq ms = RT.seq(obj);