Re: Translating optional zval ** withzend_parse_parameters() to PHP 7

From: Date: Sat, 26 Nov 2016 11:29:47 +0000
Subject: Re: Translating optional zval ** withzend_parse_parameters() to PHP 7
References: 1 2 3 4 5 6  Groups: php.internals 
Request: Send a blank email to internals+get-97196@lists.php.net to get a copy of this message
On 26.11.2016 at 01:47, Thomas Hruska wrote: > 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. zval_dtor() destroys the value; zval_ptr_dtor() decrements the refcount, and destroys the value only if the refcount has dropped to 0. See also <http://www.phpinternalsbook.com/zvals/memory_management.html> (which is written for PHP 5, but is still useful). In your case, zval_dtor() is appropriate, as the zval has already been separated (ZPP's /), so there can't be other references. -- Christoph M. Becker

« previous php.internals (#97196) next »