- zend_property_info *pi = p;
- HashTable *ht = va_arg(argv, HashTable *);
- zval *object = va_arg(argv, zval *);
- php_pq_object_t *obj = va_arg(argv, php_pq_object_t *);
- int addref = va_arg(argv, int);
- zval *property = zend_read_property(obj->zo.ce, object, pi->name, pi->name_length, 0 TSRMLS_CC);
-
- if (addref) {
- Z_ADDREF_P(property);
+ zend_property_info *pi = Z_PTR_P(p);
+ struct apply_pi_to_ht_arg *arg = a;
+
+ if (arg->gc) {
+ php_pq_object_prophandler_t *handler;
+
+ if ((handler = zend_hash_find_ptr(arg->pq_obj->prophandler, pi->name)) && handler->gc) {
+ zval member, return_value;
+
+ ZVAL_STR(&member, pi->name);
+ ZVAL_ARR(&return_value, arg->ht);
+ handler->gc(arg->object, arg->pq_obj, &return_value);
+ }
+ } else {
+ zval tmp_prop, *property = NULL;
+
+ property = zend_read_property(arg->pq_obj->zo.ce, arg->object, pi->name->val, pi->name->len, 0, &tmp_prop);
+ zend_hash_update(arg->ht, pi->name, property);