There are two parts to this patch...
1) it changes zend_execute_API.c/call_user_function_ex to allow
     overloaded object to handle this callback.
2) Takes advantage of the change above allowing java object to
     be searlized and/or "sessionable"

here are two examples...
<?
$java = new Java("java.util.Stack");
$java->push("bottom");
$java->push("middle");
$java->push("top");

$stack = serialize($java);
$java2 = unserialize($stack);

$java2->pop();
$java2->push("new top");

echo $java2->tostring();
?>

<?
session_register("javaobj");
session_register("counter");

if(!isset($javaobj))
   $javaobj = new Java("java.util.Stack");
else
   $javaobj->push($counter++);

echo $javaobj->toString();
?>


Does anyone wanna review/apply the patch?


/* Brad */


__________________________________________________
Do You Yahoo!?
Yahoo! Movies - coverage of the 74th Academy Awards®
http://movies.yahoo.com/
--- zend_execute_API_cvs.c      Thu Mar 21 18:44:34 2002
+++ zend_execute_API.c  Thu Mar 21 18:46:38 2002
@@ -446,8 +446,18 @@
 
        original_function_state_ptr = EG(function_state_ptr);
        if (zend_hash_find(function_table, function_name_copy.value.str.val, 
function_name_copy.value.str.len+1, (void **) &function_state.function)==FAILURE) {
-               zval_dtor(&function_name_copy);
-               return FAILURE;
+               if((*object_pp)->value.obj.ce->handle_function_call != NULL)
+               {
+                       function_state.function = (zend_function *) 
+emalloc(sizeof(zend_function));
+                       function_state.function->type = ZEND_OVERLOADED_FUNCTION;
+                       function_state.function->common.arg_types = NULL;
+                       function_state.function->overloaded_function.function_name = 
+Z_STRVAL_P(function_name); 
+               }
+               else
+               {
+                       zval_dtor(&function_name_copy);
+                       return FAILURE;
+               }
        }
        zval_dtor(&function_name_copy);
 
@@ -527,6 +537,28 @@
                EG(free_op2) = orig_free_op2;
                EG(unary_op) = orig_unary_op;
                EG(binary_op) = orig_binary_op;
+       } else if(function_state.function->type == ZEND_OVERLOADED_FUNCTION) {
+               zend_overloaded_element overloaded_element;
+               zend_property_reference property_reference;
+
+               overloaded_element.element = *function_name;
+               overloaded_element.type = OE_IS_METHOD;
+               zval_copy_ctor(&overloaded_element.element);
+
+               property_reference.object = *object_pp;
+               property_reference.type = BP_VAR_NA;
+               property_reference.elements_list = (zend_llist 
+*)emalloc(sizeof(zend_llist));
+               zend_llist_init(property_reference.elements_list, 
+sizeof(zend_overloaded_element), NULL, 0);
+               zend_llist_add_element(property_reference.elements_list, 
+&overloaded_element);
+
+               ALLOC_INIT_ZVAL(*retval_ptr_ptr);
+               Z_OBJCE_PP(object_pp)->handle_function_call(param_count, 
+*retval_ptr_ptr, *object_pp, 1 TSRMLS_CC, &property_reference);
+               INIT_PZVAL(*retval_ptr_ptr);
+
+               zend_llist_destroy(property_reference.elements_list);
+               efree(property_reference.elements_list);
+               efree(function_state.function);
+
        } else {
                ALLOC_INIT_ZVAL(*retval_ptr_ptr);
                ((zend_internal_function *) 
function_state.function)->handler(param_count, *retval_ptr_ptr, 
(object_pp?*object_pp:NULL), 1 TSRMLS_CC);
--- java_cvs.c  Thu Mar 21 18:58:50 2002
+++ java1.c     Thu Mar 21 18:59:02 2002
@@ -449,6 +449,55 @@
 
     (*jenv)->DeleteLocalRef(jenv, className);
 
+  } else if (!strcmp("__wakeup", function_name->element.value.str.val)) {
+       zval **data;
+       jmethodID invoke;
+       jbyteArray jdata;
+
+       if(zend_hash_find(Z_OBJPROP_P(object), "__data__", sizeof("__data__"), (void 
+**) &data) == FAILURE)
+               php_error(E_ERROR, "Could not unserialize the java object");
+
+    jdata = (*jenv)->NewByteArray(jenv, Z_STRLEN_PP(data));
+       (*jenv)->SetByteArrayRegion(jenv, jdata, 0, Z_STRLEN_PP(data), (jbyte 
+*)Z_STRVAL_PP(data));
+
+    invoke = (*jenv)->GetMethodID(jenv, JG(reflect_class), "Deserialize", "([BJ)V");
+       if(!invoke)
+               php_error(E_ERROR, "Coulnd't find function");
+
+    result = (jlong)(long)object;
+    (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke, jdata, result);
+
+    (*jenv)->DeleteLocalRef(jenv, jdata);
+       zend_hash_del(Z_OBJPROP_P(object), "__data__", sizeof("__data__"));
+
+  } else if (!strcmp("__sleep", function_name->element.value.str.val)) {
+       pval **handle;
+    int type;
+    jobject obj;
+       zval *data;
+       zval *data_name;
+       jmethodID invoke;
+
+       MAKE_STD_ZVAL(data);
+       MAKE_STD_ZVAL(data_name);
+
+       ZVAL_STRING(data_name, "__data__", 1);
+
+    invoke = (*jenv)->GetMethodID(jenv, JG(reflect_class), "Serialize", 
+"(Ljava/lang/Object;J)V");
+
+    zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**) &handle);
+    obj = zend_list_find((*handle)->value.lval, &type);
+
+    result = (jlong)(long)data;
+    (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke, obj, result);
+
+       if(Z_TYPE_P(data) == IS_EXCEPTION)
+               php_error(E_ERROR, "Error while serializing java object (%s)", 
+Z_STRVAL_P(data));
+
+       zend_hash_update(Z_OBJPROP_P(object), "__data__", sizeof("__data__"), &data, 
+sizeof(zval *), NULL);
+       array_init(return_value);
+       zend_hash_index_update(Z_ARRVAL_P(return_value), 0, &data_name, sizeof(zval 
+*), NULL);
+
   } else {
 
     pval **handle;
--- reflect_cvs.java    Thu Mar 21 18:56:16 2002
+++ reflect.java        Thu Mar 21 19:01:42 2002
@@ -23,6 +23,7 @@
 import java.lang.reflect.*;
 import java.util.*;
 import java.beans.*;
+import java.io.*;
 
 public class reflect {
 
@@ -409,6 +410,34 @@
       setException(result, e);
     }
   }
+
+  public void Deserialize(byte data[], long result)
+  {
+       try {
+               ByteArrayInputStream istream = new ByteArrayInputStream(data);
+               ObjectInputStream q = new ObjectInputStream(istream);
+               Object object = q.readObject();
+               istream.close();
+               //setResultFromString(result, object.toString().getBytes());
+               setResultFromObject(result, object);
+       } catch (Exception e) {
+               setException(result, e);
+       }
+  }
+
+  public void Serialize(Object object, long result)
+  {
+       try {
+           ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+               ObjectOutputStream p = new ObjectOutputStream(ostream);
+               p.writeObject(object);
+               ostream.close();
+               setResultFromString(result, ostream.toByteArray());
+       } catch (Exception e) {
+               setException(result, e);
+       }
+  }
+
 
   //
   // Helper routines for the C implementation

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to