--- a/trunk/php-java-bridge/java.c +++ b/trunk/php-java-bridge/java.c @@ -229,8 +229,54 @@ (*jenv)->writeObject(jenv, obj); (*jenv)->writeInvokeEnd(jenv); #else - return_value = *pobj; -#endif + COPY_PZVAL_TO_ZVAL(*return_value, *pobj); +#endif +} + +EXT_FUNCTION(EXT_GLOBAL(closure)) +{ + proxyenv *jenv; + int key_type; + char *string_key; + ulong num_key; + zval **pobj, **pclass; + long obj, class; + zend_class_entry *ce = 0; + + if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &pobj, &pclass) == FAILURE) + WRONG_PARAM_COUNT; + + //convert_to_object_ex(pobj); + //convert_to_object_ex(pclass); + + jenv = EXT_GLOBAL(connect_to_server)(TSRMLS_C); + if(!jenv) RETURN_NULL(); + if (Z_TYPE_PP(pobj) == IS_OBJECT) ce = Z_OBJCE_PP(pobj); + if (!ce) WRONG_PARAM_COUNT; /* FIXME: proper message */ + + class = 0; + EXT_GLOBAL(get_jobject_from_object)(*pclass, &class TSRMLS_CC); + if(!class) { + zend_error(E_ERROR, "Argument #1 for %s() must be a "/**/EXT_NAME()/**/" object", get_active_function_name(TSRMLS_C)); + return; + } + + (*jenv)->writeInvokeBegin(jenv, 0, "makeClosure", 0, 'I', return_value); + (*jenv)->writeLong(jenv, (long)*pobj); + (*jenv)->writeObject(jenv, class); /* FIXME: check for array */ + (*jenv)->writeCompositeBegin_a(jenv); + + zend_hash_internal_pointer_reset(&ce->function_table); + while ((key_type = zend_hash_get_current_key(&ce->function_table, &string_key, &num_key, 1)) != HASH_KEY_NON_EXISTANT) { + if (key_type == HASH_KEY_IS_STRING) { + (*jenv)->writePairBegin(jenv); + (*jenv)->writeString(jenv, string_key, strlen(string_key)); + (*jenv)->writePairEnd(jenv); + } + zend_hash_move_forward(&ce->function_table); + } + (*jenv)->writeCompositeEnd(jenv); + (*jenv)->writeInvokeEnd(jenv); } function_entry EXT_GLOBAL(functions)[] = { @@ -244,6 +290,7 @@ EXT_FE(EXT_GLOBAL(get_server_name), NULL) EXT_FE(EXT_GLOBAL(reset), NULL) EXT_FE(EXT_GLOBAL(get_values), NULL) + EXT_FE(EXT_GLOBAL(closure), NULL) {NULL, NULL, NULL} };