com gtk/php-gtk: Fix a few memory leaks by implementing a get_property_ptr_ptr handler that cleverly fails when necessary.: main/phpg_support.c

[email protected] (David Soria Parra) Tue, 01 Nov 2005 07:29:13 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    3a5e6e6e78f470c580787073349d836ed19b7345
Author:    Andrei Zmievski <[email protected]>         Tue, 1 Nov 2005 07:29:13 +0000
Parents:   b175fb343d88654b89b99b0eb8e7a259040f5995
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=3a5e6e6e78f470c580787073349d836ed19b7345

Log:
Fix a few memory leaks by implementing a get_property_ptr_ptr handler
that cleverly fails when necessary.

Changed paths:
  M  main/phpg_support.c


Diff:
3a5e6e6e78f470c580787073349d836ed19b7345
diff --git a/main/phpg_support.c b/main/phpg_support.c
index 942e04a..5bcb0a0 100644
--- a/main/phpg_support.c
+++ b/main/phpg_support.c
@@ -111,6 +111,50 @@ void phpg_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
 }
 /* }}} */
 
+/* {{{ phpg_get_property_ptr_ptr() */
+zval **phpg_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC)
+{
+    phpg_head_t *poh = NULL;
+    zval tmp_member;
+    zval **result = NULL;
+    prop_info_t *pi = NULL;
+    int ret;
+
+    if (member->type != IS_STRING) {
+        tmp_member = *member;
+        zval_copy_ctor(&tmp_member);
+        convert_to_string(&tmp_member);
+        member = &tmp_member;
+    }
+
+    ret = FAILURE;
+
+    poh = (phpg_head_t *) zend_object_store_get_object(object TSRMLS_CC);
+    if (poh->pi_hash) {
+        ret = zend_hash_find(poh->pi_hash, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &pi);
+    }
+
+    if (ret == SUCCESS) {
+        /*
+         * We cannot return a zval** for the internal properties, because we are not
+         * actually storing zval*'s. We could potentially return a proxy object here, but
+         * it may be simpler just to fail and let the engine retry by calling
+         * read_property handler. This should work since we don't really care about
+         * assigning to internal properties by reference or doing some other weird stuff.
+         */
+        result = NULL;
+    } else {
+        result = zend_get_std_object_handlers()->get_property_ptr_ptr(object, member TSRMLS_CC);
+    }
+
+    if (member == &tmp_member) {
+        zval_dtor(member);
+    }
+
+    return result;
+}
+/* }}} */
+
 /* {{{ phpg_get_properties() */
 HashTable* phpg_get_properties(zval *object TSRMLS_DC)
 {