cvs: php4 /ext/java README java.c reflect.java

From: Date: Sat, 22 Jul 2000 20:36:11 +0000
Subject: cvs: php4 /ext/java README java.c reflect.java
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-865@lists.php.net to get a copy of this message
rubys Sat Jul 22 13:36:11 2000 EDT Modified files: /php4/ext/java README java.c reflect.java Log: Complete the work mapping arrays and hashtables Index: php4/ext/java/README diff -u php4/ext/java/README:1.8 php4/ext/java/README:1.9 --- php4/ext/java/README:1.8 Sat Jul 8 21:16:30 2000 +++ php4/ext/java/README Sat Jul 22 13:36:10 2000 @@ -40,6 +40,12 @@ possibly with a loss of data (example: double precision floating point numbers will be converted to boolean). + 6) In the tradition of PHP, arrays and hashtables may pretty much + be used interchangably. Note that hashtables in PHP may only be + indexed by integers or strings; and that arrays of primitive types + in Java can not be sparse. Also note that these constructs are + passed by value, so may be expensive in terms of memory and time. + Build and execution instructions: Given the number of platforms and providers of JVMs, no single set of Index: php4/ext/java/java.c diff -u php4/ext/java/java.c:1.32 php4/ext/java/java.c:1.33 --- php4/ext/java/java.c:1.32 Sat Jul 22 11:09:27 2000 +++ php4/ext/java/java.c Sat Jul 22 13:36:10 2000 @@ -730,6 +730,17 @@ return (jlong)(long)result; } +JNIEXPORT jlong JNICALL Java_net_php_reflect_hashIndexUpdate + (JNIEnv *jenv, jclass self, jlong array, jlong key) +{ + pval *result; + pval *handle = (pval*)(long)array; + ALLOC_ZVAL(result); + zend_hash_index_update(handle->value.ht, (unsigned long)key, + &result, sizeof(zval *), NULL); + return (jlong)(long)result; +} + JNIEXPORT jlong JNICALL Java_net_php_reflect_hashUpdate (JNIEnv *jenv, jclass self, jlong array, jbyteArray key) { Index: php4/ext/java/reflect.java diff -u php4/ext/java/reflect.java:1.16 php4/ext/java/reflect.java:1.17 --- php4/ext/java/reflect.java:1.16 Sat Jul 22 10:32:31 2000 +++ php4/ext/java/reflect.java Sat Jul 22 13:36:10 2000 @@ -46,6 +46,7 @@ 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 @@ 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,9 +183,14 @@ 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]; if (args[i] instanceof Number) { @@ -235,6 +247,42 @@ 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;

« previous php.cvs (#865) next »