On Sat, Oct 15, 2016 at 8:23 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:
> Hi all, > > I'm wandering what is the best practice of zval array hash initialization. > > Following code leaks 56 bytes on ZVAL_NEW_ARR() > > chash = php_mb_convert_encoding_recursive(HASH_OF(entry), > _to_encoding, _from_encodings); > if (chash) { > ZVAL_NEW_ARR(&entry_tmp); // _array_init() is called. Should leak by > next line. > Z_ARRVAL(entry_tmp) = chash; > } > > I thought there would be API that replaces or initialize ZVAL array > hash to existing hash, but I couldn't find one. So I fixed above code > like > > chash = php_mb_convert_encoding_recursive(HASH_OF(entry), > _to_encoding, _from_encodings); > if (chash) { > Z_TYPE_INFO(entry_tmp) = IS_ARRAY_EX; > Z_ARRVAL(entry_tmp) = chash; > } > > I used IS_ARRAY_EX like ZVAL_NEW_ARR(). However, this code seemed a > little strange to me, so I grepped source tree and found no other .c > code uses IS_ARRAY_EX. > > What's the best practice for this? > > It seems API does not expect to replace zval array hash by existing > hash. Should I pass entry_tmp to php_mb_covert_encoding_recursive() > instead? i.e. > > ZVAL_NEW_ARR(&entry_tmp); > php_mb_convert_encoding_recursive(HASH_OF(&entry_tmp), HASH_OF(entry), > _to_encoding, _from_encodings); > > Thank you. > Are you looking for ZVAL_ARR()? Nikita