Your first solution will not work. String passed to
ZVAL_RETURN_RT_STRING()
may be not allocated by emalloc().
duplicate should only ever be set to 0 on this (or any of the macros) when
the string *is* allocated with emalloc. Otherwise the enegine would get in
trouble freeing it later on. I did just notice that I paste the wrong
version into my post though.... it should have been: if (!duplicate &&
UG(unicode) ...
#define RETURN_RT_STRING(t, duplicate) \
{ RETVAL_RT_STRING(t, duplicate); if (!duplicate && UG(unicode)) efree(t);
return; }
The second solution will work.
ZVAL_RETURN_RT_STRINGL(str, len, duplicate) ->
ZVAL_RETURN_RT_STRINGL(str, len, duplicate, auto_free)
There's one other we came up with:
Leave existing protos as is, having them assume auto-free when duplicate==0
(There is no issue when duplicate==1).
Create an ad=ditional set of macros: (ZVAL|RETVAL)_RT_STRINGL_NOFREE(str,
len) to be used when duplication (for the sake of owning the buffer) is not
needed (because it's emalloc'd), but where (str) should not be freeded even
in the eventuality that it's converted into a new buffer as unicode
contents.
This gives that edge 10% the ability to reuse (str) after populating it into
the zval. A RETURN variant would be silly here as
RETURN_RT_STRING_NOFREE(str) would be guaranteed to leak in unicode mode.
(It converts into a new buffer then abandons the old one).
3) It is possible to reuse "duplicate" argument
0 - don't duplicate
1 - duplicate
2 - duplicate and free
Andrei and I tossed this around last night (and actually it's "don't
duplicate and free" since the logic leading to the need for an auto_free
assumes that the original string should not have been copied but the unicode
conversion demanded that it was). The trouble with this approach is that
it's terribly inconsistent with other ZVAL/RETVAL/RETURN macros in use
everywhere else. e.g. duplicate has always been a binary value, not a
trinary one.
-Sara
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php