transform event handlers to zvals;
authorMichael Wallner <mike@php.net>
Mon, 15 Apr 2013 08:53:44 +0000 (10:53 +0200)
committerMichael Wallner <mike@php.net>
Mon, 15 Apr 2013 08:53:44 +0000 (10:53 +0200)
ignore gc for now, until sorted out

src/php_pq_callback.c
src/php_pq_callback.h
src/php_pq_object.c
src/php_pq_object.h
src/php_pqconn.c

index 1f02a450f2eeaf3a7277a726b0e94d0435ce97d0..1a4a91731f166eefe6cbf96a6f3c5f1583e2cde1 100644 (file)
@@ -38,6 +38,23 @@ void php_pq_callback_addref(php_pq_callback_t *cb)
        }
 }
 
+zval *php_pq_callback_to_zval(php_pq_callback_t *cb)
+{
+       zval *zcb;
+
+       php_pq_callback_addref(cb);
+
+       if (cb->fci.object_ptr) {
+               MAKE_STD_ZVAL(zcb);
+               array_init_size(zcb, 2);
+               add_next_index_zval(zcb, cb->fci.object_ptr);
+               add_next_index_zval(zcb, cb->fci.function_name);
+       } else {
+               zcb = cb->fci.function_name;
+       }
+
+       return zcb;
+}
 /*
  * Local variables:
  * tab-width: 4
index 14d8d8080afd6b8fadac5c5b18971ba1e737c5c5..4f2e85ba1153dd9d7f92305e239567fcfaf11d66 100644 (file)
@@ -23,6 +23,7 @@ typedef struct php_pq_callback {
 
 void php_pq_callback_dtor(php_pq_callback_t *cb);
 void php_pq_callback_addref(php_pq_callback_t *cb);
+zval *php_pq_callback_to_zval(php_pq_callback_t *cb);
 
 #endif
 
index 704737ff95b1fcc2fcb95fccbed9ea7834ed5155..c471edfcf56d83a7f0bf090bfb7081d8babc6ca1 100644 (file)
@@ -99,6 +99,13 @@ HashTable *php_pq_object_properties(zval *object TSRMLS_DC)
        return ht;
 }
 
+HashTable *php_pq_object_gc(zval *object, zval ***gc_argv, int *gc_argc TSRMLS_DC)
+{
+       *gc_argv = NULL;
+       *gc_argc = 0;
+       return NULL;
+}
+
 zend_class_entry *ancestor(zend_class_entry *ce)
 {
        while (ce->parent) {
index 311f17f3a5525873e57b376655b739a84f45acdd..7498ffeaf0e8e01cb7b97385a458bbe3a3458c00 100644 (file)
@@ -33,6 +33,7 @@ void php_pq_object_addref(void *o TSRMLS_DC);
 void php_pq_object_delref(void *o TSRMLS_DC);
 HashTable *php_pq_object_debug_info(zval *object, int *temp TSRMLS_DC);
 HashTable *php_pq_object_properties(zval *object TSRMLS_DC);
+HashTable *php_pq_object_gc(zval *object, zval ***gc_argv, int *gc_argc TSRMLS_DC);
 zend_class_entry *ancestor(zend_class_entry *ce);
 zval *php_pq_object_read_prop(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC);
 void php_pq_object_write_prop(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC);
index 5031426561dafd6f2da433575565ca9d42e713a8..376ce3b9fd3769b038c099867e39642b7b9eee8f 100644 (file)
@@ -311,12 +311,40 @@ static void php_pqconn_object_read_options(zval *object, void *o, zval *return_v
        }
 }
 
+static int apply_read_event_handler_ex(void *p, void *arg TSRMLS_DC)
+{
+       HashTable *rv = arg;
+       zval *zcb = php_pq_callback_to_zval(p);
+
+       zend_hash_next_index_insert(rv, &zcb, sizeof(zval *), NULL);
+
+       return ZEND_HASH_APPLY_KEEP;
+}
+
+static int apply_read_event_handlers(void *p TSRMLS_DC, int argc, va_list argv, zend_hash_key *key)
+{
+       HashTable *evhs = p, *rv = va_arg(argv, HashTable *);
+       zval *entry, **entry_ptr;
+
+       MAKE_STD_ZVAL(entry);
+       array_init_size(entry, zend_hash_num_elements(evhs));
+
+       if (key->nKeyLength) {
+               zend_hash_add(rv, key->arKey, key->nKeyLength, &entry, sizeof(zval *), (void *) &entry_ptr);
+       } else {
+               zend_hash_index_update(rv, key->h, &entry, sizeof(zval *), (void *) &entry_ptr);
+       }
+
+       zend_hash_apply_with_argument(evhs, apply_read_event_handler_ex, Z_ARRVAL_PP(entry_ptr) TSRMLS_CC);
+
+       return ZEND_HASH_APPLY_KEEP;
+}
 static void php_pqconn_object_read_event_handlers(zval *object, void *o, zval *return_value TSRMLS_DC)
 {
        php_pqconn_object_t *obj = o;
 
        array_init(return_value);
-       zend_hash_copy(Z_ARRVAL_P(return_value), &obj->intern->eventhandlers, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+       zend_hash_apply_with_arguments(&obj->intern->eventhandlers TSRMLS_CC, apply_read_event_handlers, 1, Z_ARRVAL_P(return_value) TSRMLS_CC);
 }
 
 static STATUS php_pqconn_update_socket(zval *this_ptr, php_pqconn_object_t *obj TSRMLS_DC)
@@ -1502,6 +1530,7 @@ PHP_MINIT_FUNCTION(pqconn)
        php_pqconn_object_handlers.write_property = php_pq_object_write_prop;
        php_pqconn_object_handlers.clone_obj = NULL;
        php_pqconn_object_handlers.get_property_ptr_ptr = NULL;
+       php_pqconn_object_handlers.get_gc = php_pq_object_gc;
        php_pqconn_object_handlers.get_properties = php_pq_object_properties;
        php_pqconn_object_handlers.get_debug_info = php_pq_object_debug_info;