Re: Translating optional zval ** with zend_parse_parameters() to PHP 7

From: 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>:
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/

« previous php.internals (#97195) next »