cvs: php4 /ext/java README java.c reflect.java
| From: | Sam Ruby | 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;