diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-04-05 11:23:55 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-04-05 11:23:55 -0400 |
commit | c733148ba0fb3ff7bbab133f5375422972e62d08 (patch) | |
tree | 0cbe5723116e143f0d1105d712fba09067eaf12a /src/jvm/clojure | |
parent | e6e39d5931fbdf3dfa68cd2d059b8e26ce45c965 (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.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentHashSet.java | 35 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 2 |
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){ |