Re: Re: Another question about storing zend_fcall_info and zend_fcall_info_cache
| From: | Ruslan Osmanov | 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: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: /* ... */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
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