- php_http_property_proxy_object_t *obj = zend_object_store_get_object(object TSRMLS_CC);
-
- return zend_read_property(Z_OBJCE_P(obj->proxy->object), obj->proxy->object, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), 0 TSRMLS_CC);
+ php_http_property_proxy_object_t *obj = zend_object_store_get_object(*object TSRMLS_CC);
+ zval *target = obj->proxy->parent ? php_http_property_proxy_object_get(obj->proxy->parent TSRMLS_CC) : obj->proxy->object;
+
+#if PHP_HTTP_PPDBG
+ fprintf(stderr, "proxy_set: %s\n", Z_STRVAL_P(obj->proxy->member));
+#endif
+ if (Z_TYPE_P(target) == IS_OBJECT) {
+ zend_update_property(Z_OBJCE_P(target), target, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), value TSRMLS_CC);
+ } else {
+ Z_ADDREF_P(value);
+ zend_symtable_update(Z_ARRVAL_P(target), Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member)+1, (void *) &value, sizeof(zval *), NULL);
+ }
+ /* propagate */
+ if (obj->proxy->parent) {
+ php_http_property_proxy_object_set(&obj->proxy->parent, target TSRMLS_CC);
+ zval_ptr_dtor(&target);
+ }