phanto Mon Feb 10 15:59:11 2003 EDT
Modified files:
/php4/ext/rpc handler.h php_rpc.h rpc.c rpc.h rpc_proxy.c
Log:
a bunch of fixes
Index: php4/ext/rpc/handler.h
diff -u php4/ext/rpc/handler.h:1.15 php4/ext/rpc/handler.h:1.16
--- php4/ext/rpc/handler.h:1.15 Sun Feb 9 16:37:40 2003
+++ php4/ext/rpc/handler.h Mon Feb 10 15:59:10 2003
@@ -82,13 +82,13 @@
int (*rpc_ctor)(rpc_string class_name, void **data, int num_args, zval
**args[]);
int (*rpc_dtor)(void *data);
int (*rpc_describe)(rpc_string method_name, void *data, char **arg_types,
unsigned char **ref_types);
- int (*rpc_call)(rpc_string method_name, void **data, zval *return_value, int
num_args, zval **args[]);
- int (*rpc_get)(rpc_string property_name, zval *return_value, void **data);
- int (*rpc_set)(rpc_string property_name, zval *value, void **data);
- int (*rpc_compare)(void **data1, void **data2);
- int (*rpc_has_property)(rpc_string property_name, void **data);
- int (*rpc_unset_property)(rpc_string property_name, void **data);
- int (*rpc_get_properties)(HashTable **properties, void **data);
+ int (*rpc_call)(rpc_string method_name, void *data, zval *return_value, int
+num_args, zval **args[]);
+ int (*rpc_get)(rpc_string property_name, zval *return_value, void *data);
+ int (*rpc_set)(rpc_string property_name, zval *value, void *data);
+ int (*rpc_compare)(void *data1, void *data2);
+ int (*rpc_has_property)(rpc_string property_name, void *data);
+ int (*rpc_unset_property)(rpc_string property_name, void *data);
+ int (*rpc_get_properties)(HashTable **properties, void *data);
} rpc_object_handlers;
/* handler entry */
@@ -127,8 +127,17 @@
zend_uint dummy;
} rpc_proxy;
+
+ZEND_API ZEND_FUNCTION(rpc_load);
+ZEND_API ZEND_FUNCTION(rpc_call);
+ZEND_API ZEND_FUNCTION(rpc_set);
+ZEND_API ZEND_FUNCTION(rpc_get);
+ZEND_API ZEND_FUNCTION(rpc_singleton);
+ZEND_API ZEND_FUNCTION(rpc_poolable);
+
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)
+ZEND_API zval* _rpc_object_from_data(zval *z, rpc_handler_entry *handler, void *data,
+rpc_class_hash *class_hash);
+#define rpc_object_from_data(layer, data) rpc_object_from_data_ex(NULL, layer, data,
+NULL)
+#define rpc_object_from_data_ex(z, layer, data, class_hash)
+_rpc_object_from_data((z), &layer##_handler_entry, (data), (class_hash))
#endif /* HANDLER_H */
Index: php4/ext/rpc/php_rpc.h
diff -u php4/ext/rpc/php_rpc.h:1.9 php4/ext/rpc/php_rpc.h:1.10
--- php4/ext/rpc/php_rpc.h:1.9 Thu Jan 16 12:49:20 2003
+++ php4/ext/rpc/php_rpc.h Mon Feb 10 15:59:10 2003
@@ -34,13 +34,6 @@
ZEND_RSHUTDOWN_FUNCTION(rpc);
ZEND_MINFO_FUNCTION(rpc);
-ZEND_API ZEND_FUNCTION(rpc_load);
-ZEND_API ZEND_FUNCTION(rpc_call);
-ZEND_API ZEND_FUNCTION(rpc_set);
-ZEND_API ZEND_FUNCTION(rpc_get);
-ZEND_API ZEND_FUNCTION(rpc_singleton);
-ZEND_API ZEND_FUNCTION(rpc_poolable);
-
ZEND_API void rpc_error(int type, const char *format, ...);
ZEND_API zend_object_value rpc_objects_new(zend_class_entry * TSRMLS_DC);
Index: php4/ext/rpc/rpc.c
diff -u php4/ext/rpc/rpc.c:1.21 php4/ext/rpc/rpc.c:1.22
--- php4/ext/rpc/rpc.c:1.21 Mon Feb 10 07:36:06 2003
+++ php4/ext/rpc/rpc.c Mon Feb 10 15:59:10 2003
@@ -36,8 +36,10 @@
static void rpc_objects_delete(void *, zend_object_handle TSRMLS_DC);
static void rpc_ini_cb(void *arg TSRMLS_DC);
+static rpc_class_hash *rpc_class_hash_find(rpc_string *name);
+
/* object handler */
-static zval* rpc_read(zval *, zval *, int TSRMLS_DC);
+static zval* rpc_read(zval *, zval * TSRMLS_DC);
static void rpc_write(zval *, zval *, zval * TSRMLS_DC);
static zval** rpc_get_property(zval *, zval * TSRMLS_DC);
static zval* rpc_get(zval * TSRMLS_DC);
@@ -283,7 +285,7 @@
}
}
-static zval* rpc_read(zval *object, zval *member, int type TSRMLS_DC)
+static zval* rpc_read(zval *object, zval *member TSRMLS_DC)
{
zval *return_value;
GET_INTERNAL(intern);
@@ -439,7 +441,6 @@
zend_uint num_args = ZEND_NUM_ARGS();
zend_class_entry overloaded_class_entry;
rpc_class_hash *class_hash;
- rpc_class_hash **class_hash_find = NULL;
rpc_internal *intern;
rpc_string hash_val, class_val;
int retval, append = 0;
@@ -493,16 +494,10 @@
GET_SIGNATURE(intern, class_val.str, class_val.len,
hash_val, num_args, arg_types);
/* check if already hashed */
- if (zend_ts_hash_find(&classes, hash_val.str,
hash_val.len + 1, (void **) &class_hash_find) != SUCCESS) {
- class_hash = pemalloc(sizeof(rpc_class_hash),
TRUE);
+ if ((class_hash = rpc_class_hash_find(&hash_val)) ==
+NULL) {
+ rpc_class_hash **class_hash_find;
- /* 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;
+ ALLOC_CLASS_HASH(class_hash, intern->handlers);
/* do hashing */
if (RPC_HT(intern)->rpc_hash(class_val,
(rpc_string *)(class_hash), NULL, num_args, arg_types, CLASS) != SUCCESS) {
@@ -524,8 +519,8 @@
* also track all instaces in a llist for
destruction later on, because there might be duplicate entries in
* the hashtable and we can't determine if a
pointer references to an already freed element
*/
- zend_ts_hash_add(&classes, hash_val.str,
hash_val.len + 1, &class_hash, sizeof(rpc_class_hash *), (void **) &class_hash_find);
tsrm_mutex_lock(classes.mx_writer);
+ zend_ts_hash_add(&classes, hash_val.str,
+hash_val.len + 1, &class_hash, sizeof(rpc_class_hash *), (void **) &class_hash_find);
zend_llist_add_element(&classes_list,
class_hash_find);
tsrm_mutex_unlock(classes.mx_writer);
@@ -537,7 +532,6 @@
zend_ts_hash_index_update(&classes,
class_hash->name.len, &class_hash, sizeof(rpc_class_hash *), NULL);
}
} else {
- class_hash = *class_hash_find;
intern->ce = class_hash->ce;
}
@@ -551,19 +545,11 @@
}
} else {
/* integer classname (hashcode) */
- if (zend_ts_hash_index_find(&classes, class_val.len, (void**)
&class_hash_find) != SUCCESS) {
- class_hash = pemalloc(sizeof(rpc_class_hash), TRUE);
+ if ((class_hash = rpc_class_hash_find(&hash_val)) == NULL) {
+ ALLOC_CLASS_HASH(class_hash, intern->handlers);
- /* set up the cache */
class_hash->name.str = NULL;
class_hash->name.len = class_val.len;
- class_hash->handlers = intern->handlers;
- class_hash->singleton = FALSE;
- class_hash->poolable = FALSE;
- class_hash->data = NULL;
-
- 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);
/* overload class entry */
RPC_HT(intern)->rpc_name(class_val, &class_val, NULL, CLASS);
@@ -575,7 +561,6 @@
/* register int hashcode, we don't know more */
zend_ts_hash_index_update(&classes, class_hash->name.len,
&class_hash, sizeof(rpc_class_hash *), NULL);
} else {
- class_hash = *class_hash_find;
intern->ce = class_hash->ce;
}
}
@@ -686,9 +671,10 @@
/* actually this should not be neccesary, but who knows :)
* considering possible thread implementations in future php versions
* and srm it is better to do concurrency checks
+ * DEPRECATE THIS !
*/
tsrm_mutex_lock(intern->mx_handler);
- retval = RPC_HT(intern)->rpc_call(*method_hash, &(intern->data),
return_value, num_args, args);
+ retval = RPC_HT(intern)->rpc_call(*method_hash, intern->data,
+return_value, num_args, args);
tsrm_mutex_unlock(intern->mx_handler);
}
@@ -789,9 +775,10 @@
ZEND_API void rpc_error(int type, const char *format, ...)
{
va_list args;
+ TSRMLS_FETCH();
va_start(args, format);
- zend_error(type, format, args);
+ zend_error_cb(type, zend_get_executed_filename(TSRMLS_C),
+zend_get_executed_lineno(TSRMLS_C), format, args);
va_end(args);
}
@@ -808,7 +795,6 @@
intern->ce = class_type;
intern->data = NULL;
- intern->function_table.hash = intern->ce->function_table;
intern->function_table.reader = 0;
intern->function_table.mx_reader = tsrm_mutex_alloc();
intern->function_table.mx_writer = tsrm_mutex_alloc();
@@ -885,16 +871,37 @@
}
}
-ZEND_API zval* _rpc_object_from_data(zval *z, zend_class_entry *ce, void *data,
rpc_class_hash *class_hash TSRMLS_DC)
+static rpc_class_hash *rpc_class_hash_find(rpc_string *name)
+{
+ rpc_class_hash **class_hash_find = NULL;
+
+ if (name->str == NULL) {
+ /* int value */
+ if (zend_ts_hash_index_find(&classes, name->len, (void**)
+&class_hash_find) != SUCCESS) {
+ return NULL;
+ }
+ } else {
+ /* string value */
+ if (zend_ts_hash_find(&classes, name->str, name->len + 1, (void **)
+&class_hash_find) != SUCCESS) {
+ return NULL;
+ }
+ }
+
+ return *class_hash_find;
+}
+
+ZEND_API zval* _rpc_object_from_data(zval *z, rpc_handler_entry *handler, void *data,
+rpc_class_hash *class_hash)
{
rpc_internal *intern;
+ rpc_string name = {NULL, 0};
+ TSRMLS_FETCH();
if (z == NULL) {
ALLOC_ZVAL(z);
}
Z_TYPE_P(z) = IS_OBJECT;
- z->value.obj = rpc_objects_new(ce TSRMLS_CC);
+ z->value.obj = rpc_objects_new(*(handler->ce) TSRMLS_CC);
if (GET_INTERNAL_EX(intern, z) != SUCCESS) {
/* TODO: exception */
@@ -904,24 +911,21 @@
intern->data = data;
if (class_hash == NULL) {
- class_hash = pemalloc(sizeof(rpc_class_hash), TRUE);
- if (class_hash == NULL) {
- /* TODO: exception */
+ if (handler->handlers->rpc_name(name, &name, data, CLASS) == SUCCESS) {
+ class_hash = rpc_class_hash_find(&name);
+ } else {
+ ALLOC_CLASS_HASH(class_hash, intern->handlers);
- return NULL;
+ if (class_hash == NULL) {
+ /* TODO: exception */
+ return NULL;
+ }
+
+ /* Copy the function table hash for this object, so that it is
+separated
+ * from the "global" table */
+ zend_ts_hash_init(&(intern->function_table), 0, NULL, NULL, TRUE);
+ zend_hash_copy(&intern->function_table.hash,
+&((*(handler->ce))->function_table), NULL, NULL, 0);
}
- /* 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;
-
- /* Copy the function table hash for this object, so that it is
separated
- * from the "global" table */
- zend_ts_hash_init(&intern->function_table, 0, NULL, NULL, TRUE);
- zend_hash_copy(&intern->function_table.hash, &ce->function_table,
NULL, NULL, 0);
}
RPC_CLASS(intern) = class_hash;
Index: php4/ext/rpc/rpc.h
diff -u php4/ext/rpc/rpc.h:1.12 php4/ext/rpc/rpc.h:1.13
--- php4/ext/rpc/rpc.h:1.12 Thu Jan 16 12:49:20 2003
+++ php4/ext/rpc/rpc.h Mon Feb 10 15:59:10 2003
@@ -123,4 +123,15 @@
efree(arg_types);
\
efree(hash_val.str);
+#define ALLOC_CLASS_HASH(_class_hash, _handlers) \
+ if (_class_hash = pemalloc(sizeof(rpc_class_hash), TRUE)) { \
+ /* 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->singleton = FALSE; \
+ _class_hash->poolable = FALSE; \
+ _class_hash->data = NULL; \
+ _class_hash->handlers = _handlers; \
+ }
+
#endif
Index: php4/ext/rpc/rpc_proxy.c
diff -u php4/ext/rpc/rpc_proxy.c:1.7 php4/ext/rpc/rpc_proxy.c:1.8
--- php4/ext/rpc/rpc_proxy.c:1.7 Sun Feb 9 16:35:30 2003
+++ php4/ext/rpc/rpc_proxy.c Mon Feb 10 15:59:10 2003
@@ -26,7 +26,7 @@
static void rpc_proxy_del_ref(zval * TSRMLS_DC);
static void rpc_proxy_delete(zval * TSRMLS_DC);
static zend_object_value rpc_proxy_clone(zval * TSRMLS_DC);
-static zval* rpc_proxy_read(zval *, zval *, int TSRMLS_DC);
+static zval* rpc_proxy_read(zval *, zval * TSRMLS_DC);
static void rpc_proxy_write(zval *, zval *, zval * TSRMLS_DC);
static zval** rpc_proxy_get_property(zval *, zval * TSRMLS_DC);
static zval* rpc_proxy_get(zval * TSRMLS_DC);
@@ -82,7 +82,7 @@
{
}
-static zval* rpc_proxy_read(zval *object, zval *member, int type TSRMLS_DC)
+static zval* rpc_proxy_read(zval *object, zval *member TSRMLS_DC)
{
return NULL;
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php