summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-09-21 17:03:46 +0000
committerRich Hickey <richhickey@gmail.com>2008-09-21 17:03:46 +0000
commit76081aa0420daebf9dee9495391b2c099300a4b9 (patch)
tree25361cc43fa300376e2808f745d3139e93f66832
parent1aa40dbfa8270e6d05469606be56a54a86b87909 (diff)
made vectors enforce integer keys
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java12
-rw-r--r--src/jvm/clojure/lang/Util.java8
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;
+}
+
}