diff options
| author | Sam Ruby <rubys@php.net> | 2000-07-22 20:36:11 +0000 | 
|---|---|---|
| committer | Sam Ruby <rubys@php.net> | 2000-07-22 20:36:11 +0000 | 
| commit | f4e94a50301e9c55b5ef62640bb59597272bba52 (patch) | |
| tree | 9f618720d557a6af936b82d77949cadabe913826 /ext/java/reflect.java | |
| parent | 668af98d753aa2991af11e0b2a0469559097eead (diff) | |
| download | php-git-f4e94a50301e9c55b5ef62640bb59597272bba52.tar.gz | |
Complete the work mapping arrays and hashtables
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; | 
