From ee9fc81dd2ef15d7ea3e17e7ec2370c5c09d633e Mon Sep 17 00:00:00 2001 From: Christophe Grand Date: Tue, 13 Apr 2010 11:50:38 +0200 Subject: Check for identity before equality in .equals for collections, see #96 Signed-off-by: Stuart Halloway --- src/clj/clojure/gvec.clj | 1 + src/jvm/clojure/lang/APersistentMap.java | 1 + src/jvm/clojure/lang/APersistentSet.java | 1 + src/jvm/clojure/lang/APersistentVector.java | 1 + src/jvm/clojure/lang/ASeq.java | 2 +- 5 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src') 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); -- cgit v1.2.3-18-g5258