I prefer (2) or (3). (3) requires less changes. #define S_DUPLICATE (1<<0) #define S_AUTO_FREE (1<<1)
#define ZVAL_U_STRINGL(conv, z, s, l, flags) \ if (UG(unicode)) { \ UErrorCode status = U_ZERO_ERROR; \ UChar *u_str; \ int u_len; \ zend_convert_to_unicode(conv, &u_str, &u_len, s, l, &status); \ ZVAL_UNICODEL(z, u_str, u_len, 0); \ if (flags & S_AUTO_FREE) {efree(s);} \ } else { \ char *__s=(s); int __l=l; \ Z_STRLEN_P(z) = __l; \ Z_STRVAL_P(z) = ((flags & S_DUPLICATE)?estrndup(__s, __l):__s); \ Z_TYPE_P(z) = IS_STRING; \ } And then we need to change only calls those rally leak. RETURN_RT_STRING(str, 1) -> RETURN_RT_STRING(str, S_DUPLICATE | S_AUTO_FREE) Thanks. Dmitry. > -----Original Message----- > From: Sara Golemon [mailto:[EMAIL PROTECTED] > Sent: Monday, April 03, 2006 10:15 PM > To: "Dmitry Stogov" > Cc: internals@lists.php.net > Subject: Re: [PHP-DEV] RETURN_RT_STRING() and family leakage > > > >> 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. > > > > No. :( > > You can use ZVAL_RT_STRING(&fname, "strlen", 0), then call > > zend_call_function(&fname) and do not destroy fname. > > > Doi, of course, good point... > > Okay, then the options are: > > (1) Assume auto_free for RETURN_RT_STRING(s,0) specifically > as in this case, > my statement above is valid since the engine IS going to try > it eventually. > Leave all other macros alone and make the calling scope > handle the original > string with the existing if (UG(unicode)) efree(s); Not my favorite. > > (2) Expand (ZVAL|RETVAL)_RT_STRING(s, 0) to include auto_free > argument. > This coule be done in conjunction with (1) or in place of it. > > (3) Overload duplicate argument to include (should I > auto-free?) logic. > > (4) Duplicate the macros to one auto-free, and one > non-auto-free version. > > I like the #1/#2 combo personally. > > -Sara > > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php