Re: Re: Another question about storing zend_fcall_info and zend_fcall_info_cache

From: Date: Tue, 30 Jul 2013 11:58:12 +0000
Subject: Re: Re: Another question about storing zend_fcall_info and zend_fcall_info_cache
References: 1 2 3  Groups: php.pecl.dev 
Request: Send a blank email to pecl-dev+get-10924@lists.php.net to get a copy of this message
On 07/30/2013 04:03 PM, Johannes Schlüter wrote:
On Tue, 2013-07-30 at 15:37 +0500, Ruslan Osmanov wrote:
So what is the proper way to deal with zend_fcall_info.object_ptr's refcount? I didn't find a Zend API function to copy fcall info. I also didn't find a way to obtain the caller's "this_ptr" pointer. EG(This) points to current (Event) this_ptr, not Foo's this_ptr.
This hit me, too. I once thought about "fixing" this in zend_parse_parameters but figured this would cause an anomaly where the caller suddenly has to free memory allocated in zpp. My solution for this is here: https://github.com/johannes/php-test-helpers/blob/master/test_helpers.c#L342 and here https://github.com/johannes/php-test-helpers/blob/master/test_helpers.c#L178 hope this helps, johannes
Thanks for your reply. I see, you fixed it by freeing handler->fci before assigning new pointer to it. It works probably because the only user handler(THG(new_handler) is moving around. But in my case fci is created by zend_parse_arguments() ant put into newly allocated object. Something like the following: /* ... */
zend_fcall_info         fci   = empty_fcall_info;
zend_fcall_info_cache fcc = empty_fcall_info_cache;
php_event_t            *e;
struct event           *event;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f", &fci, &fcc) == FAILURE) { return; } e = emalloc(sizeof(struct event)); /* ... */ Z_ADDREF_P(fci.function_name); if (fci.object_ptr) {
    Z_ADDREF_P(fci.object_ptr);
} if (ZEND_FCI_INITIALIZED(*pfci)) {
    e->fci = (zend_fcall_info *) safe_emalloc(1, sizeof(zend_fcall_info), 0);
    e->fcc = (zend_fcall_info_cache *) safe_emalloc(1, sizeof(zend_fcall_info_cache), 0);
    memcpy(e->fci, pfci, sizeof(zend_fcall_info));
    memcpy(e->fcc, pfcc, sizeof(zend_fcall_info_cache));
    PHP_EVENT_FCI_ADDREF(e->fci);
} else {
    e->fci = NULL;
    e->fcc = NULL;
} So I have to search for another workaround. -- Ruslan Osmanov

« previous php.pecl.dev (#10924) next »