diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-09-21 17:03:46 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-09-21 17:03:46 +0000 |
commit | 76081aa0420daebf9dee9495391b2c099300a4b9 (patch) | |
tree | 25361cc43fa300376e2808f745d3139e93f66832 | |
parent | 1aa40dbfa8270e6d05469606be56a54a86b87909 (diff) |
made vectors enforce integer keys
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Util.java | 8 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index ed5cda09..631273c9 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -172,7 +172,9 @@ public boolean addAll(int i, Collection c){ public Object invoke(Object arg1) throws Exception{ - return nth(((Number) arg1).intValue()); + if(Util.isInteger(arg1)) + return nth(((Number) arg1).intValue()); + throw new IllegalArgumentException("Key must be integer"); } public Iterator iterator(){ @@ -201,14 +203,14 @@ public Object peek(){ } public boolean containsKey(Object key){ - if(!(key instanceof Number)) + if(!(Util.isInteger(key))) return false; int i = ((Number) key).intValue(); return i >= 0 && i < count(); } public IMapEntry entryAt(Object key){ - if(key instanceof Number) + if(Util.isInteger(key)) { int i = ((Number) key).intValue(); if(i >= 0 && i < count()) @@ -218,7 +220,7 @@ public IMapEntry entryAt(Object key){ } public IPersistentVector assoc(Object key, Object val){ - if(key instanceof Number) + if(Util.isInteger(key)) { int i = ((Number) key).intValue(); return assocN(i, val); @@ -227,7 +229,7 @@ public IPersistentVector assoc(Object key, Object val){ } public Object valAt(Object key, Object notFound){ - if(key instanceof Number) + if(Util.isInteger(key)) { int i = ((Number) key).intValue(); if(i >= 0 && i < count()) diff --git a/src/jvm/clojure/lang/Util.java b/src/jvm/clojure/lang/Util.java index 96bf5bf7..b43bd51d 100644 --- a/src/jvm/clojure/lang/Util.java +++ b/src/jvm/clojure/lang/Util.java @@ -12,6 +12,8 @@ package clojure.lang; +import java.math.BigInteger; + public class Util{ static public boolean equal(Object k1, Object k2){ if(k1 == k2) @@ -55,4 +57,10 @@ static public boolean isPrimitive(Class c){ return c != null && c.isPrimitive() && !(c == Void.TYPE); } +static public boolean isInteger(Object x){ + return x instanceof Integer + || x instanceof Long + || x instanceof BigInteger; +} + } |