diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cli/runtime/Reflector.cs | 22 | ||||
-rw-r--r-- | src/org/clojure/runtime/Reflector.java | 21 |
2 files changed, 28 insertions, 15 deletions
diff --git a/src/cli/runtime/Reflector.cs b/src/cli/runtime/Reflector.cs index a23a305f..a2894285 100644 --- a/src/cli/runtime/Reflector.cs +++ b/src/cli/runtime/Reflector.cs @@ -29,13 +29,13 @@ public static Object invokeInstanceMethod(String name, Object target, Object[] a else if (methods.Count == 1)
{
MethodInfo m = (MethodInfo)methods[0];
- return m.Invoke(target, boxArgs(m.GetParameters(), args));
+ return prepRet(m.Invoke(target, boxArgs(m.GetParameters(), args)));
}
else //overloaded w/same arity, let reflection choose most specific match
{
- return t.InvokeMember(name, BindingFlags.Public | (statics ? BindingFlags.Static : BindingFlags.Instance)
+ return prepRet(t.InvokeMember(name, BindingFlags.Public | (statics ? BindingFlags.Static : BindingFlags.Instance)
| BindingFlags.FlattenHierarchy | BindingFlags.InvokeMethod,
- null, target, args);
+ null, target, args));
}
}
@@ -79,12 +79,12 @@ public static Object getStaticField(String name, String className) //throws Exce FieldInfo f = getField(t, name, true);
if (f != null) //field get
{
- return f.GetValue(null);
+ return prepRet(f.GetValue(null));
}
PropertyInfo p = getProperty(t, name, true);
if (p != null)
{
- return p.GetValue(null, null);
+ return prepRet(p.GetValue(null, null));
}
throw new InvalidOperationException("No matching field or property found");
}
@@ -108,11 +108,11 @@ public static Object setStaticField(String name, String className, Object arg1) throw new InvalidOperationException("No matching field or property found");
}
-public static Object invokeInstanceMember(String name, Object target) //throws Exception
{
//check for field first
Type t = target.GetType();
FieldInfo f = getField(t, name,false);
if(f != null) //field get
{
return f.GetValue(target);
}
+public static Object invokeInstanceMember(String name, Object target) //throws Exception
{
//check for field first
Type t = target.GetType();
FieldInfo f = getField(t, name,false);
if(f != null) //field get
{
return prepRet(f.GetValue(target));
}
PropertyInfo p = getProperty(t, name,false);
if (p != null)
{
- return p.GetValue(target, null);
+ return prepRet(p.GetValue(target, null));
}
return invokeInstanceMethod(name, target, RT.EMPTY_ARRAY);
}
public static Object invokeInstanceMember(String name, Object target, Object arg1) //throws Exception
{
//check for field first
Type t = target.GetType();
FieldInfo f = getField(t, name,false);
if (f != null) //field get
{
@@ -124,7 +124,7 @@ public static Object invokeInstanceMember(String name, Object target) //throws E {
//could be indexed property, which we otherwise aren't dealing with yet
if(p.GetIndexParameters() != null && p.GetIndexParameters().Length == 1)
- return p.GetValue(target, new Object[]{boxArg(p.GetIndexParameters()[0].ParameterType,arg1)});
+ return prepRet(p.GetValue(target, new Object[]{boxArg(p.GetIndexParameters()[0].ParameterType,arg1)}));
p.SetValue(target,boxArg(p.PropertyType,arg1),null);
return arg1;
}
return invokeInstanceMethod(name, target, new Object[]{arg1});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2) //throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4)
//throws Exception
{
return invokeInstanceMethod(name, target, new Object[]{arg1, arg2, arg3, arg4});
}
public static Object invokeInstanceMember(String name, Object target, Object arg1, Object arg2, Object arg3,
Object arg4,
Cons arglist)
//throws Exception
{
Object[] args = new Object[4 + RT.length(arglist)];
args[0] = arg1;
args[1] = arg2;
args[2] = arg3;
args[3] = arg4;
for(int i = 4; arglist != null; i++, arglist = arglist.rest)
args[i] = arglist.first;
return invokeInstanceMethod(name, target, args);
}
@@ -156,6 +156,12 @@ public static Object invokeInstanceMember(String name, Object target) //throws E static Object boxArg(Type paramType, Object arg)
{
Type argType = arg.GetType();
if(paramType == argType)
return arg;
if(paramType == typeof(bool))
{
return arg != null;
}
else if(paramType.IsPrimitive && arg is Num)
{
Num n = (Num) arg;
if(paramType == typeof(int))
return RT.box(n.intValue());
else if(paramType == typeof(float))
return RT.box(n.floatValue());
else if(paramType == typeof(double))
return RT.box(n.doubleValue());
else if(paramType == typeof(long))
return RT.box(n.longValue());
else if(paramType == typeof(char))
return RT.box((char) n.intValue());
else if(paramType == typeof(short))
return RT.box(n.shortValue());
else if(paramType == typeof(byte))
return RT.box(n.byteValue());
else
throw new ArgumentException("Cannot convert to primitive type: " + paramType.Name);
}
else
return arg;
}
static Object[] boxArgs(ParameterInfo[] parms, Object[] args)
{
if(parms.Length == 0)
return null;
Object[] ret = new Object[parms.Length];
for(int i = 0; i < parms.Length; i++)
{
Object arg = args[i];
Type paramType = parms[i].ParameterType;
ret[i] = boxArg(paramType, arg);
}
return ret;
}
+static Object prepRet(Object x)
+ {
+ if(x is Boolean)
+ return ((Boolean)x)?RT.T:null;
+ return x;
+ }
}
diff --git a/src/org/clojure/runtime/Reflector.java b/src/org/clojure/runtime/Reflector.java index 00294e0e..c81a6341 100644 --- a/src/org/clojure/runtime/Reflector.java +++ b/src/org/clojure/runtime/Reflector.java @@ -23,7 +23,7 @@ public static Object invokeInstanceMethod(String name, Object target, Object[] a { Class c = target.getClass(); List methods = getMethods(c, args.length, name,false); - return invokeMatchingMethod(methods, target, args); + return prepRet(invokeMatchingMethod(methods, target, args)); } private static Object invokeMatchingMethod(List methods, Object target, Object[] args) @@ -35,7 +35,7 @@ private static Object invokeMatchingMethod(List methods, Object target, Object[] else if(methods.size() == 1) { Method m = (Method) methods.get(0); - return m.invoke(target, boxArgs(m.getParameterTypes(), args)); + return prepRet(m.invoke(target, boxArgs(m.getParameterTypes(), args))); } else //overloaded w/same arity { @@ -47,7 +47,7 @@ private static Object invokeMatchingMethod(List methods, Object target, Object[] if(isCongruent(params, args)) { Object[] boxedArgs = boxArgs(params, args); - return m.invoke(target, boxedArgs); + return prepRet(m.invoke(target, boxedArgs)); } } throw new IllegalArgumentException("No matching field or method found"); @@ -105,7 +105,7 @@ public static Object getStaticField(String name, String className) throws Except Field f = getField(c, name,true); if(f != null) { - return f.get(null); + return prepRet(f.get(null)); } throw new IllegalArgumentException("No matching field found"); } @@ -128,9 +128,9 @@ public static Object invokeInstanceMember(String name, Object target) throws Exc Class c = target.getClass(); Field f = getField(c, name,false); if(f != null) //field get - { - return f.get(target); - } + { + return prepRet(f.get(target)); + } return invokeInstanceMethod(name, target, RT.EMPTY_ARRAY); } @@ -310,4 +310,11 @@ static boolean isCongruent(Class[] params, Object[] args) } return ret; } + +static Object prepRet(Object x) + { + if(x instanceof Boolean) + return ((Boolean)x).booleanValue()?RT.T:null; + return x; + } } |