summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-04-05 11:23:55 -0400
committerRich Hickey <richhickey@gmail.com>2010-04-05 11:23:55 -0400
commitc733148ba0fb3ff7bbab133f5375422972e62d08 (patch)
tree0cbe5723116e143f0d1105d712fba09067eaf12a /src/jvm/clojure
parente6e39d5931fbdf3dfa68cd2d059b8e26ce45c965 (diff)
catch duplicate set keys for literals and hash-set calls.
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/LispReader.java2
-rw-r--r--src/jvm/clojure/lang/PersistentHashSet.java35
-rw-r--r--src/jvm/clojure/lang/RT.java2
3 files changed, 37 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java
index dc8ce972..137c8a4c 100644
--- a/src/jvm/clojure/lang/LispReader.java
+++ b/src/jvm/clojure/lang/LispReader.java
@@ -1008,7 +1008,7 @@ public static class MapReader extends AFn{
public static class SetReader extends AFn{
public Object invoke(Object reader, Object leftbracket) throws Exception{
PushbackReader r = (PushbackReader) reader;
- return PersistentHashSet.create(readDelimitedList('}', r, true));
+ return PersistentHashSet.createWithCheck(readDelimitedList('}', r, true));
}
}
diff --git a/src/jvm/clojure/lang/PersistentHashSet.java b/src/jvm/clojure/lang/PersistentHashSet.java
index eced8663..12170d4b 100644
--- a/src/jvm/clojure/lang/PersistentHashSet.java
+++ b/src/jvm/clojure/lang/PersistentHashSet.java
@@ -47,6 +47,41 @@ static public PersistentHashSet create(ISeq items){
return ret;
}
+public static PersistentHashSet createWithCheck(Object... init){
+ PersistentHashSet ret = EMPTY;
+ for(int i = 0; i < init.length; i++)
+ {
+ ret = (PersistentHashSet) ret.cons(init[i]);
+ if(ret.count() != i + 1)
+ throw new IllegalArgumentException("Duplicate key: " + init[i]);
+ }
+ return ret;
+}
+
+public static PersistentHashSet createWithCheck(List init){
+ PersistentHashSet ret = EMPTY;
+ int i=0;
+ for(Object key : init)
+ {
+ ret = (PersistentHashSet) ret.cons(key);
+ if(ret.count() != i + 1)
+ throw new IllegalArgumentException("Duplicate key: " + key);
+ ++i;
+ }
+ return ret;
+}
+
+static public PersistentHashSet createWithCheck(ISeq items){
+ PersistentHashSet ret = EMPTY;
+ for(int i=0; items != null; items = items.next(), ++i)
+ {
+ ret = (PersistentHashSet) ret.cons(items.first());
+ if(ret.count() != i + 1)
+ throw new IllegalArgumentException("Duplicate key: " + items.first());
+ }
+ return ret;
+}
+
PersistentHashSet(IPersistentMap meta, IPersistentMap impl){
super(impl);
this._meta = meta;
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 13afd8fd..58d91a44 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -1023,7 +1023,7 @@ static public IPersistentMap map(Object... init){
}
static public IPersistentSet set(Object... init){
- return PersistentHashSet.create(init);
+ return PersistentHashSet.createWithCheck(init);
}
static public IPersistentVector vector(Object... init){