]> granicus.if.org Git - php/commitdiff
Use alloca() for temporary allocation
authorDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 11:18:19 +0000 (15:18 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 11:18:19 +0000 (15:18 +0400)
Zend/zend_API.c

index 7d79d99beef45a48f385890de6919b336750b738..7d394bfe13998693e898ad002d394ea7b7d8c190 100644 (file)
@@ -2836,6 +2836,7 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
        zend_class_entry *last_scope;
        HashTable *ftable;
        int call_via_handler = 0;
+       ALLOCA_FLAG(use_heap)
 
        if (error) {
                *error = NULL;
@@ -2845,22 +2846,27 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
        fcc->function_handler = NULL;
 
        if (!ce_org) {
+               char *lmname;
+               int lmname_len;
+
                /* Skip leading \ */
                if (Z_STRVAL_P(callable)[0] == '\\') {
-                       lmname = STR_ALLOC(Z_STRLEN_P(callable) - 1, 0);
-                       zend_str_tolower_copy(lmname->val, Z_STRVAL_P(callable) + 1, Z_STRLEN_P(callable) - 1);
+                       lmname = do_alloca(Z_STRLEN_P(callable) - 1, use_heap);
+                       lmname_len = Z_STRLEN_P(callable) - 1;
+                       zend_str_tolower_copy(lmname, Z_STRVAL_P(callable) + 1, lmname_len);
                } else {
-                       lmname = STR_ALLOC(Z_STRLEN_P(callable), 0);
-                       zend_str_tolower_copy(lmname->val, Z_STRVAL_P(callable), Z_STRLEN_P(callable));
+                       lmname = do_alloca(Z_STRLEN_P(callable), use_heap);
+                       lmname_len = Z_STRLEN_P(callable);
+                       zend_str_tolower_copy(lmname, Z_STRVAL_P(callable), lmname_len);
                }
                /* Check if function with given name exists.
                 * This may be a compound name that includes namespace name */
-               fcc->function_handler = zend_hash_find_ptr(EG(function_table), lmname);
+               fcc->function_handler = zend_hash_str_find_ptr(EG(function_table), lmname, lmname_len);
                if (fcc->function_handler != NULL) {
-                       STR_FREE(lmname);
+                       free_alloca(lmname, use_heap);
                        return 1;
                }
-               STR_FREE(lmname);
+               free_alloca(lmname, use_heap);
        }
 
        /* Split name into class/namespace and method/function names */