+php_property_proxy_t *php_property_proxy_init(zval *container, zend_string *member)
+{
+ php_property_proxy_t *proxy = ecalloc(1, sizeof(*proxy));
+#if DEBUG_PROPRO
+ zval offset;
+
+ ZVAL_STR_COPY(&offset, member);
+#endif
+
+ if (container) {
+ ZVAL_COPY(&proxy->container, container);
+ }
+ proxy->member = zend_string_copy(member);
+
+ debug_propro(0, "init", NULL, proxy, &offset, NULL);
+
+#if DEBUG_PROPRO
+ zval_dtor(&offset);
+#endif
+
+ return proxy;
+}
+
+void php_property_proxy_free(php_property_proxy_t **proxy)
+{
+#if DEBUG_PROPRO
+ zval offset;
+
+ ZVAL_STR_COPY(&offset, (*proxy)->member);
+ debug_propro(0, "free", NULL, *proxy, &offset, NULL);
+#endif
+
+ if (*proxy) {
+ if (!Z_ISUNDEF((*proxy)->container)) {
+ zval_ptr_dtor(&(*proxy)->container);
+ ZVAL_UNDEF(&(*proxy)->container);
+ }
+ zend_string_release((*proxy)->member);
+ (*proxy)->member = NULL;
+ efree(*proxy);
+ *proxy = NULL;
+ }
+
+#if DEBUG_PROPRO
+ zval_dtor(&offset);
+#endif
+}
+
+static zend_class_entry *php_property_proxy_class_entry;
+static zend_object_handlers php_property_proxy_object_handlers;
+
+zend_class_entry *php_property_proxy_get_class_entry(void)
+{
+ return php_property_proxy_class_entry;
+}
+