wez             Sun Feb  9 16:37:40 2003 EDT

  Modified files:              
    /php4/ext/rpc       handler.h rpc.c 
  Log:
  Add get_class_name handler so that the current var_dump implementation does not 
segfault.
  Add a generic rpc_object_from_data() function for generating rpc objects from C code 
(as discussed with Harald).
  
Index: php4/ext/rpc/handler.h
diff -u php4/ext/rpc/handler.h:1.14 php4/ext/rpc/handler.h:1.15
--- php4/ext/rpc/handler.h:1.14 Thu Jan 16 12:49:20 2003
+++ php4/ext/rpc/handler.h      Sun Feb  9 16:37:40 2003
@@ -128,5 +128,7 @@
 } rpc_proxy;
 
 ZEND_API rpc_register_layer(rpc_handler_entry *entry TSRMLS_DC);
+ZEND_API zval* _rpc_object_from_data(zval *z, zend_class_entry *ce, void *data, 
+rpc_class_hash *class_hash TSRMLS_DC);
+#define rpc_object_from_data(z, layer, data, class_hash)  _rpc_object_from_data((z), 
+layer##_class_entry, (data), (class_hash) TSRMLS_CC)
 
 #endif /* HANDLER_H */
Index: php4/ext/rpc/rpc.c
diff -u php4/ext/rpc/rpc.c:1.18 php4/ext/rpc/rpc.c:1.19
--- php4/ext/rpc/rpc.c:1.18     Thu Jan 16 12:49:20 2003
+++ php4/ext/rpc/rpc.c  Sun Feb  9 16:37:40 2003
@@ -48,6 +48,7 @@
 static union _zend_function* rpc_get_method(zval *, char *, int TSRMLS_DC);
 static union _zend_function* rpc_get_constructor(zval * TSRMLS_DC);
 static zend_class_entry* rpc_get_class_entry(zval * TSRMLS_DC);
+static int rpc_get_class_name(zval *object, char **class_name, zend_uint 
+*class_name_len, int parent TSRMLS_DC);
 static int rpc_compare(zval *, zval * TSRMLS_DC);
 /**/
 
@@ -74,7 +75,7 @@
        NULL,
        rpc_get_constructor,
        rpc_get_class_entry,
-       NULL,
+       rpc_get_class_name,
        rpc_compare
 };
 
@@ -409,6 +410,19 @@
        return intern->ce;
 }
 
+static int rpc_get_class_name(zval *object, char **class_name, zend_uint 
+*class_name_len, int parent TSRMLS_DC)
+{
+       GET_INTERNAL(intern);
+
+       if (parent) {
+               return FAILURE;
+       } else {
+               *class_name = intern->ce->name;
+               *class_name_len = intern->ce->name_length;
+               return SUCCESS;
+       }
+}
+
 static int rpc_compare(zval *object1, zval *object2 TSRMLS_DC)
 {
        /* FIXME */
@@ -581,7 +595,7 @@
                        retval = SUCCESS;
                } else {
                        /* call the rpc ctor */
-                       retval = RPC_HT(intern)->rpc_ctor(*(rpc_string *)(class_hash), 
&(intern->data), num_args, args);
+                       retval = RPC_HT(intern)->rpc_ctor(class_hash->name, 
+&(intern->data), num_args, args);
                }
        } else {
                /* disable caching from now on */
@@ -788,7 +802,7 @@
        zov->handlers = &rpc_handlers;
 
        /* set up the internal representation of our rpc instance */
-       intern = (rpc_internal *) pemalloc(sizeof(rpc_internal), TRUE);
+       intern = (rpc_internal *) pecalloc(1, sizeof(rpc_internal), TRUE);
 
        intern->ce = class_type;
        intern->data = NULL;
@@ -867,6 +881,45 @@
        if (retval != SUCCESS) {
                /* TODO: exception here */
        }
+}
+
+ZEND_API zval* _rpc_object_from_data(zval *z, zend_class_entry *ce, void *data, 
+rpc_class_hash *class_hash TSRMLS_DC)
+{
+       rpc_internal *intern;
+
+       if (z == NULL) {
+               ALLOC_ZVAL(z);
+       }
+
+       Z_TYPE_P(z) = IS_OBJECT;
+       z->value.obj = rpc_objects_new(ce TSRMLS_CC);
+       
+       if (GET_INTERNAL_EX(intern, z) != SUCCESS) {
+               /* TODO: exception */
+               return NULL;
+       }
+
+       intern->data = data;
+
+       if (class_hash == NULL) {
+               class_hash = pemalloc(sizeof(rpc_class_hash), TRUE);
+               if (class_hash == NULL) {
+                       /* TODO: exception */
+
+                       return NULL;
+               }
+               /* set up the cache */
+               zend_ts_hash_init(&(class_hash->methods), 0, NULL, rpc_string_dtor, 
+TRUE);
+               zend_ts_hash_init(&(class_hash->properties), 0, NULL, rpc_string_dtor, 
+TRUE);
+               class_hash->handlers = intern->handlers;
+               class_hash->singleton = FALSE;
+               class_hash->poolable = FALSE;
+               class_hash->data = NULL;
+       }
+
+       RPC_CLASS(intern) = class_hash;
+
+       return z;
 }
 
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to