On 11/25/2016 4:32 PM, Jakub Zelenka wrote:
On 25 Nov 2016 20:43, "Kalle Sommer Nielsen" <ka...@php.net> wrote:
2016-11-25 13:30 GMT+01:00 Thomas Hruska <thru...@cubiclesoft.com>:
I need to be able to *modify* the original variable that was passed in.
I already use "|l" and zend_long
elsewhere in the extension
Ah 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
Okay, everyone has been helpful. Thanks. I'll go with:
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/
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php