diff options
author | Sam Ruby <rubys@php.net> | 2000-07-21 22:08:50 +0000 |
---|---|---|
committer | Sam Ruby <rubys@php.net> | 2000-07-21 22:08:50 +0000 |
commit | eb8a55893d67e41b53e8c868a19e6c7d36be5d02 (patch) | |
tree | 9577e75861a1bb8d9b439b98112fb6ea1b8700dc /ext | |
parent | be6c3d8b62a54b488a3dcfc20358dde5225b1f68 (diff) | |
download | php-git-eb8a55893d67e41b53e8c868a19e6c7d36be5d02.tar.gz |
Pass PHP arrays to Java as hash tables; minor cleanup
Diffstat (limited to 'ext')
-rw-r--r-- | ext/java/java.c | 151 | ||||
-rw-r--r-- | ext/java/reflect.java | 2 | ||||
-rw-r--r-- | ext/rpc/java/java.c | 151 | ||||
-rw-r--r-- | ext/rpc/java/reflect.java | 2 |
4 files changed, 208 insertions, 98 deletions
diff --git a/ext/java/java.c b/ext/java/java.c index 83db3d4b7a..701640b0e5 100644 --- a/ext/java/java.c +++ b/ext/java/java.c @@ -82,7 +82,7 @@ typedef struct { #define JG_FETCH() php_java_globals *java_globals = ts_resource(java_globals_id) #define JG_D php_java_globals *java_globals #define JG_DC , JG_D -#define JG_C dir_globals +#define JG_C java_globals #define JG_CC , JG_C int java_globals_id; #else @@ -276,58 +276,114 @@ static int jvm_create() { /***************************************************************************/ -static jobjectArray _java_makeArray(int argc, pval** argv) { - JG_FETCH(); +static jobject _java_makeObject(pval* arg JG_DC) { + JNIEnv *jenv = JG(jenv); + jobject result; + pval **handle; + int type; + jmethodID makeArg; + jclass hashClass; + + switch (arg->type) { + case IS_STRING: + result=(*jenv)->NewByteArray(jenv,arg->value.str.len); + (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0, + arg->value.str.len, arg->value.str.val); + break; + + case IS_OBJECT: + zend_hash_index_find(arg->value.obj.properties, 0, (void*)&handle); + result = zend_list_find((*handle)->value.lval, &type); + break; + + case IS_BOOL: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(Z)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jboolean)(arg->value.lval)); + break; + + case IS_LONG: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(J)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jlong)(arg->value.lval)); + break; + + case IS_DOUBLE: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(D)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jdouble)(arg->value.dval)); + break; + + case IS_ARRAY: + { + jobject jkey, jval; + zval **value; + zval key; + char *string_key; + ulong num_key; + jobject jold; + jmethodID put, init; + + hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable"); + init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V"); + result = (*jenv)->NewObject(jenv, hashClass, init); + + put = (*jenv)->GetMethodID(jenv, hashClass, "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + /* Iterate through hash */ + zend_hash_internal_pointer_reset(arg->value.ht); + while(zend_hash_get_current_data(arg->value.ht, (void**)&value) == SUCCESS) { + jval = _java_makeObject(*value JG_CC); + + switch (zend_hash_get_current_key(arg->value.ht, &string_key, &num_key)) { + case HASH_KEY_IS_STRING: + key.type = IS_STRING; + key.value.str.val = string_key; + key.value.str.len = strlen(string_key); + jkey = _java_makeObject(&key JG_CC); + efree(string_key); + break; + case HASH_KEY_IS_LONG: + key.type = IS_LONG; + key.value.lval = num_key; + jkey = _java_makeObject(&key JG_CC); + break; + default: /* HASH_KEY_NON_EXISTANT */ + jkey = 0; + } + jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval); + if ((*value)->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval); + zend_hash_move_forward(arg->value.ht); + } + + break; + } + + default: + result=0; + } + + return result; +} + +/***************************************************************************/ + +static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) { JNIEnv *jenv = JG(jenv); jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object"); jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0); jobject arg; - jmethodID makeArg; int i; - pval **handle; - int type; for (i=0; i<argc; i++) { - switch (argv[i]->type) { - case IS_STRING: - arg=(*jenv)->NewByteArray(jenv,argv[i]->value.str.len); - (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0, - argv[i]->value.str.len, argv[i]->value.str.val); - break; - - case IS_OBJECT: - zend_hash_index_find(argv[i]->value.obj.properties, 0, (void*)&handle); - arg = zend_list_find((*handle)->value.lval, &type); - break; - - case IS_BOOL: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(Z)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jboolean)(argv[i]->value.lval)); - break; - - case IS_LONG: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(J)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jlong)(argv[i]->value.lval)); - break; - - case IS_DOUBLE: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(D)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jdouble)(argv[i]->value.dval)); - break; - - default: - arg=0; - } + arg = _java_makeObject(argv[i] JG_CC); (*jenv)->SetObjectArrayElement(jenv, result, i, arg); - if (argv[i]->type != IS_OBJECT) - (*jenv)->DeleteLocalRef(jenv, arg); + if (argv[i]->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg); } return result; } @@ -382,7 +438,7 @@ void java_call_function_handler (pval*)(long)result = object; (*jenv)->CallVoidMethod(jenv, JG(php_reflect), co, - className, _java_makeArray(arg_count-1, arguments+1), result); + className, _java_makeArray(arg_count-1, arguments+1 JG_CC), result); (*jenv)->DeleteLocalRef(jenv, className); @@ -403,7 +459,7 @@ void java_call_function_handler (pval*)(long)result = return_value; (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke, - obj, method, _java_makeArray(arg_count, arguments), result); + obj, method, _java_makeArray(arg_count, arguments JG_CC), result); (*jenv)->DeleteLocalRef(jenv, method); @@ -508,8 +564,9 @@ pval java_get_property_handler int java_set_property_handler (zend_property_reference *property_reference, pval *value) { + JG_FETCH(); pval presult = _java_getset_property - (property_reference, _java_makeArray(1, &value)); + (property_reference, _java_makeArray(1, &value JG_CC)); return checkError(&presult) ? FAILURE : SUCCESS; } diff --git a/ext/java/reflect.java b/ext/java/reflect.java index 3cf53aece2..f5b43a96a8 100644 --- a/ext/java/reflect.java +++ b/ext/java/reflect.java @@ -236,7 +236,6 @@ public class reflect { public void Invoke (Object object, String method, Object args[], long result) { - try { Vector matches = new Vector(); @@ -284,7 +283,6 @@ public class reflect { public void GetSetProp (Object object, String prop, Object args[], long result) { -System.out.println(object + "." + prop); try { for (Class jclass = object.getClass();;jclass=(Class)object) { diff --git a/ext/rpc/java/java.c b/ext/rpc/java/java.c index 83db3d4b7a..701640b0e5 100644 --- a/ext/rpc/java/java.c +++ b/ext/rpc/java/java.c @@ -82,7 +82,7 @@ typedef struct { #define JG_FETCH() php_java_globals *java_globals = ts_resource(java_globals_id) #define JG_D php_java_globals *java_globals #define JG_DC , JG_D -#define JG_C dir_globals +#define JG_C java_globals #define JG_CC , JG_C int java_globals_id; #else @@ -276,58 +276,114 @@ static int jvm_create() { /***************************************************************************/ -static jobjectArray _java_makeArray(int argc, pval** argv) { - JG_FETCH(); +static jobject _java_makeObject(pval* arg JG_DC) { + JNIEnv *jenv = JG(jenv); + jobject result; + pval **handle; + int type; + jmethodID makeArg; + jclass hashClass; + + switch (arg->type) { + case IS_STRING: + result=(*jenv)->NewByteArray(jenv,arg->value.str.len); + (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0, + arg->value.str.len, arg->value.str.val); + break; + + case IS_OBJECT: + zend_hash_index_find(arg->value.obj.properties, 0, (void*)&handle); + result = zend_list_find((*handle)->value.lval, &type); + break; + + case IS_BOOL: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(Z)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jboolean)(arg->value.lval)); + break; + + case IS_LONG: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(J)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jlong)(arg->value.lval)); + break; + + case IS_DOUBLE: + makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", + "(D)Ljava/lang/Object;"); + result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, + (jdouble)(arg->value.dval)); + break; + + case IS_ARRAY: + { + jobject jkey, jval; + zval **value; + zval key; + char *string_key; + ulong num_key; + jobject jold; + jmethodID put, init; + + hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable"); + init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V"); + result = (*jenv)->NewObject(jenv, hashClass, init); + + put = (*jenv)->GetMethodID(jenv, hashClass, "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + + /* Iterate through hash */ + zend_hash_internal_pointer_reset(arg->value.ht); + while(zend_hash_get_current_data(arg->value.ht, (void**)&value) == SUCCESS) { + jval = _java_makeObject(*value JG_CC); + + switch (zend_hash_get_current_key(arg->value.ht, &string_key, &num_key)) { + case HASH_KEY_IS_STRING: + key.type = IS_STRING; + key.value.str.val = string_key; + key.value.str.len = strlen(string_key); + jkey = _java_makeObject(&key JG_CC); + efree(string_key); + break; + case HASH_KEY_IS_LONG: + key.type = IS_LONG; + key.value.lval = num_key; + jkey = _java_makeObject(&key JG_CC); + break; + default: /* HASH_KEY_NON_EXISTANT */ + jkey = 0; + } + jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval); + if ((*value)->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval); + zend_hash_move_forward(arg->value.ht); + } + + break; + } + + default: + result=0; + } + + return result; +} + +/***************************************************************************/ + +static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) { JNIEnv *jenv = JG(jenv); jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object"); jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0); jobject arg; - jmethodID makeArg; int i; - pval **handle; - int type; for (i=0; i<argc; i++) { - switch (argv[i]->type) { - case IS_STRING: - arg=(*jenv)->NewByteArray(jenv,argv[i]->value.str.len); - (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0, - argv[i]->value.str.len, argv[i]->value.str.val); - break; - - case IS_OBJECT: - zend_hash_index_find(argv[i]->value.obj.properties, 0, (void*)&handle); - arg = zend_list_find((*handle)->value.lval, &type); - break; - - case IS_BOOL: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(Z)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jboolean)(argv[i]->value.lval)); - break; - - case IS_LONG: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(J)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jlong)(argv[i]->value.lval)); - break; - - case IS_DOUBLE: - makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg", - "(D)Ljava/lang/Object;"); - arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg, - (jdouble)(argv[i]->value.dval)); - break; - - default: - arg=0; - } + arg = _java_makeObject(argv[i] JG_CC); (*jenv)->SetObjectArrayElement(jenv, result, i, arg); - if (argv[i]->type != IS_OBJECT) - (*jenv)->DeleteLocalRef(jenv, arg); + if (argv[i]->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg); } return result; } @@ -382,7 +438,7 @@ void java_call_function_handler (pval*)(long)result = object; (*jenv)->CallVoidMethod(jenv, JG(php_reflect), co, - className, _java_makeArray(arg_count-1, arguments+1), result); + className, _java_makeArray(arg_count-1, arguments+1 JG_CC), result); (*jenv)->DeleteLocalRef(jenv, className); @@ -403,7 +459,7 @@ void java_call_function_handler (pval*)(long)result = return_value; (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke, - obj, method, _java_makeArray(arg_count, arguments), result); + obj, method, _java_makeArray(arg_count, arguments JG_CC), result); (*jenv)->DeleteLocalRef(jenv, method); @@ -508,8 +564,9 @@ pval java_get_property_handler int java_set_property_handler (zend_property_reference *property_reference, pval *value) { + JG_FETCH(); pval presult = _java_getset_property - (property_reference, _java_makeArray(1, &value)); + (property_reference, _java_makeArray(1, &value JG_CC)); return checkError(&presult) ? FAILURE : SUCCESS; } diff --git a/ext/rpc/java/reflect.java b/ext/rpc/java/reflect.java index 3cf53aece2..f5b43a96a8 100644 --- a/ext/rpc/java/reflect.java +++ b/ext/rpc/java/reflect.java @@ -236,7 +236,6 @@ public class reflect { public void Invoke (Object object, String method, Object args[], long result) { - try { Vector matches = new Vector(); @@ -284,7 +283,6 @@ public class reflect { public void GetSetProp (Object object, String prop, Object args[], long result) { -System.out.println(object + "." + prop); try { for (Class jclass = object.getClass();;jclass=(Class)object) { |