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) {