summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-11-19 19:16:47 +0000
committerRich Hickey <richhickey@gmail.com>2008-11-19 19:16:47 +0000
commitdcc03cfbcadf6897aa49728f8b10656472193c7f (patch)
tree9ef209aac3f26bf5471f9a4e796ccfbf26502a48
parentfad06a6ae9cff3c55d203253cf5d704975e7edde (diff)
prepRet on Array.get calls to fixup non-canonic Booleans
-rw-r--r--src/clj/clojure/core.clj2
-rw-r--r--src/jvm/clojure/lang/ArraySeq.java10
-rw-r--r--src/jvm/clojure/lang/RT.java6
-rw-r--r--src/jvm/clojure/lang/Reflector.java10
4 files changed, 14 insertions, 14 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 169a1e5b..1e74fef6 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -1820,7 +1820,7 @@
{:inline (fn [a i] `(. clojure.lang.RT (aget ~a ~i)))
:inline-arities #{2}}
([array idx]
- (. Array (get array idx)))
+ (clojure.lang.Reflector/prepRet (. Array (get array idx))))
([array idx & idxs]
(apply aget (aget array idx) idxs)))
diff --git a/src/jvm/clojure/lang/ArraySeq.java b/src/jvm/clojure/lang/ArraySeq.java
index dfdb4560..cf4325a7 100644
--- a/src/jvm/clojure/lang/ArraySeq.java
+++ b/src/jvm/clojure/lang/ArraySeq.java
@@ -62,7 +62,7 @@ ArraySeq(IPersistentMap meta, Object array, int i){
public Object first(){
if(oa != null)
return oa[i];
- return Array.get(array, i);
+ return Reflector.prepRet(Array.get(array, i));
}
public ISeq rest(){
@@ -102,9 +102,9 @@ public Object reduce(IFn f) throws Exception{
return ret;
}
- Object ret = Array.get(array, i);
+ Object ret = Reflector.prepRet(Array.get(array, i));
for(int x = i + 1; x < Array.getLength(array); x++)
- ret = f.invoke(ret, Array.get(array, x));
+ ret = f.invoke(ret, Reflector.prepRet(Array.get(array, x)));
return ret;
}
@@ -116,9 +116,9 @@ public Object reduce(IFn f, Object start) throws Exception{
ret = f.invoke(ret, oa[x]);
return ret;
}
- Object ret = f.invoke(start, Array.get(array, i));
+ Object ret = f.invoke(start, Reflector.prepRet(Array.get(array, i)));
for(int x = i + 1; x < Array.getLength(array); x++)
- ret = f.invoke(ret, Array.get(array, x));
+ ret = f.invoke(ret, Reflector.prepRet(Array.get(array, x)));
return ret;
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 1c81e3c8..f6139d1b 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -782,7 +782,7 @@ static public Object nth(Object coll, int n){
else if(coll instanceof String)
return Character.valueOf(((String) coll).charAt(n));
else if(coll.getClass().isArray())
- return Array.get(coll, n);
+ return Reflector.prepRet(Array.get(coll, n));
else if(coll instanceof List)
return ((List) coll).get(n);
else if(coll instanceof Matcher)
@@ -834,7 +834,7 @@ static public Object nth(Object coll, int n, Object notFound){
else if(coll.getClass().isArray())
{
if(n < Array.getLength(coll))
- return Array.get(coll, n);
+ return Reflector.prepRet(Array.get(coll, n));
return notFound;
}
else if(coll instanceof List)
@@ -1780,7 +1780,7 @@ static public Object[] aclone(Object[] xs){
}
static public Object aget(Object xs, int i){
- return Array.get(xs, i);
+ return Reflector.prepRet(Array.get(xs, i));
}
static public Object aset(Object xs, int i, Object v){
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index 5f40772b..0eaf1123 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -83,7 +83,7 @@ static Object invokeMatchingMethod(String methodName, List methods, Object targe
throw new IllegalArgumentException(noMethodReport(methodName,target));
try
{
- return prepRet(m.getReturnType(), m.invoke(target, boxedArgs));
+ return prepRet(m.invoke(target, boxedArgs));
}
catch(InvocationTargetException e)
{
@@ -203,7 +203,7 @@ public static Object getStaticField(Class c, String fieldName) throws Exception{
Field f = getField(c, fieldName, true);
if(f != null)
{
- return prepRet(f.getType(), f.get(null));
+ return prepRet(f.get(null));
}
throw new IllegalArgumentException("No matching field found: " + fieldName
+ " for " + c);
@@ -230,7 +230,7 @@ public static Object getInstanceField(Object target, String fieldName) throws Ex
Field f = getField(c, fieldName, false);
if(f != null)
{
- return prepRet(f.getType(), f.get(target));
+ return prepRet(f.get(target));
}
throw new IllegalArgumentException("No matching field found: " + fieldName
+ " for " + target.getClass());
@@ -263,7 +263,7 @@ public static Object invokeInstanceMember(Object target, String name) throws Exc
Field f = getField(c, name, false);
if(f != null) //field get
{
- return prepRet(f.getType(), f.get(target));
+ return prepRet(f.get(target));
}
return invokeInstanceMethod(target, name, RT.EMPTY_ARRAY);
}
@@ -418,7 +418,7 @@ static boolean isCongruent(Class[] params, Object[] args){
return ret;
}
-static Object prepRet(Class c, Object x){
+public static Object prepRet(Object x){
// if(c == boolean.class)
// return ((Boolean) x).booleanValue() ? RT.T : null;
if(x instanceof Boolean)