Hey,

I've been taking a look at the __autoload problem. During that time I saw that lots of places in the code (especially reflection API) use zend_str_tolower_dup().
In most of these cases it would be much more efficient to use do_alloca()/free_alloca() because that usually uses alloca() which allocates on the stack.
Simplified example from reflection API code:


lcname = zend_str_tolower_dup(name_str, name_len);

if (zend_hash_find(&ce->properties_info, lcname, name_len + 1, (void **) &property_info) == FAILURE) {
efree(lcname);
/* Error message */
return;
}


efree(lcname);

This should really be:

lcname = do_alloca(name_len+1);
zend_str_tolower_copy(lcname, name_str, name_len+1);

if (zend_hash_find(&ce->properties_info, lcname, name_len + 1, (void **) &property_info) == FAILURE) {
free_alloca(lcname);
/* Error message */
return;
}


free_alloca(lcname);

There are two times where you really shouldn't use do_alloca/free_alloca:
a) If you're in code which requires a regular malloc() don't use them (the fallback is emalloc()).
b) Only use them in functions which are about to return. They shouldn't be used in places like the main zend_execute loop because it would just make the stack grow more and more (in almost all cases where zend_str_tolower_dup() is being used, do_alloca/free_alloca are applicable).


I need to go away for the weekend now but it be cool if people here would at least take care of this in their code (such as reflection API code).

Thanks,

Andi

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



Reply via email to