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.

--
Yasuo Ohgaki
yohg...@ohgaki.net

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to