diff options
Diffstat (limited to 'ext/java/reflect.java')
-rw-r--r-- | ext/java/reflect.java | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/ext/java/reflect.java b/ext/java/reflect.java index d5e9393dc2..3520b2aba8 100644 --- a/ext/java/reflect.java +++ b/ext/java/reflect.java @@ -46,6 +46,7 @@ public class reflect { private static native void setResultFromArray(long result); private static native long nextElement(long array); private static native long hashUpdate(long array, byte key[]); + private static native long hashIndexUpdate(long array, long key); private static native void setException(long result, byte value[]); public static native void setEnv(); @@ -88,7 +89,13 @@ public class reflect { setResultFromArray(result); for (Enumeration e = ht.keys(); e.hasMoreElements(); ) { Object key = e.nextElement(); - setResult(hashUpdate(result, key.toString().getBytes()), ht.get(key)); + long slot; + if (key instanceof Number && + !(key instanceof Double || key instanceof Float)) + slot = hashIndexUpdate(result, ((Number)key).longValue()); + else + slot = hashUpdate(result, key.toString().getBytes()); + setResult(slot, ht.get(key)); } } else { @@ -176,8 +183,13 @@ public class reflect { if (!c.isInstance(args[i])) break; weight++; } - } else if (parms[i].isInstance("")) { - if (!(args[i] instanceof byte[])) + } else if (parms[i].isAssignableFrom(java.lang.String.class)) { + if (!(args[i] instanceof byte[]) && !(args[i] instanceof String)) + weight+=9999; + } else if (parms[i].isArray()) { + if (args[i] instanceof java.util.Hashtable) + weight+=256; + else weight+=9999; } else if (parms[i].isPrimitive()) { Class c=parms[i]; @@ -235,6 +247,42 @@ public class reflect { if (c == Float.TYPE) result[i]=new Float(n.floatValue()); if (c == Long.TYPE && !(n instanceof Long)) result[i]=new Long(n.longValue()); + } else if (args[i] instanceof Hashtable && parms[i].isArray()) { + try { + Hashtable ht = (Hashtable)args[i]; + int size = ht.size(); + + // Verify that the keys are Long, and determine maximum + for (Enumeration e = ht.keys(); e.hasMoreElements(); ) { + int index = ((Long)e.nextElement()).intValue(); + if (index >= size) size = index+1; + } + + Object tempArray[] = new Object[size]; + Class tempTarget[] = new Class[size]; + Class targetType = parms[i].getComponentType(); + + // flatten the hash table into an array + for (int j=0; j<size; j++) { + tempArray[j] = ht.get(new Long(j)); + if (tempArray[j] == null && targetType.isPrimitive()) + throw new Exception("bail"); + tempTarget[j] = targetType; + } + + // coerce individual elements into the target type + Object coercedArray[] = coerce(tempTarget, tempArray); + + // copy the results into the desired array type + Object array = Array.newInstance(targetType,size); + for (int j=0; j<size; j++) { + Array.set(array, j, coercedArray[j]); + } + + result[i]=array; + } catch (Exception e) { + // leave result[i] alone... + } } } return result; |