Re: Translating optional zval ** with zend_parse_parameters() to PHP 7
| From: | Thomas Hruska | Date: | Sat, 26 Nov 2016 00:47:14 +0000 |
| Subject: | Re: Translating optional zval ** with zend_parse_parameters() to PHP 7 | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-97195@lists.php.net to get a copy of this message | ||
On 11/25/2016 4:32 PM, Jakub Zelenka wrote:
On 25 Nov 2016 20:43, "Kalle Sommer Nielsen" <kalle@php.net> wrote: 2016-11-25 13:30 GMT+01:00 Thomas Hruska <thruska@cubiclesoft.com>:Okay, everyone has been helpful. Thanks. I'll go with:I need to be able to *modify* the original variable that was passed in.I already use "|l" and zend_longelsewhere in the extensionAh my bad I misread it! In that case take a look at where such is implemented in php-src, dns_get_record() is an example despite the slightly clouded code: http://git.php.net/?p=php-src.git;a=blob;f=ext/standard/dns.c;h= f92015eee90d3e93a801e93d6381d89923825166;hb=refs/heads/master#l1011 See $weight_list: - Check if the argument is passed - zval_dtor() - Populate it (ZVAL_LONG is the same) The main difference from your code is to use 'z' (lower case) in ZPP, and then use zval* (which is what 'z' returns). You also need set 1 for the first param of ZEND_ARG_INFO (specify that it is a ref param) otherwise it won't use the changed val... Jakub
zval *zprevcount = NULL;
zend_long count;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z/", &zprevcount) == FAILURE) return;
...
if (zprevcount != NULL)
{
count = (zend_long)PrevCount;
zval_dtor(zprevcount);
ZVAL_LONG(zprevcount, count);
}
Just one little thing I found in php_str_replace_common() in ext/standard/string.c. That particular function calls zval_ptr_dtor() instead of zval_dtor() on zcount. Just wondering why it does that - I'm thinking it has something to do with removing the ZPP call for PHP 7 and using the (mostly undocumented?) Z_PARAM_ZVAL_EX() macro. However, php_do_pcre_match() over in ext/pcre/php_pcre.c calls zval_dtor() on subpats but also uses the Z_PARAM_ZVAL_EX() macro in a similar fashion. Looking back at PHP 5.6's php_str_replace_common() shows that it previously called zval_dtor(). So it might also be a bug of some sort.
--
Thomas Hruska
CubicleSoft President
I've got great, time saving software that you will find useful.
http://cubiclesoft.com/