]> granicus.if.org Git - php/commitdiff
Optimize func_get_args() to build packed array
authorDmitry Stogov <dmitry@zend.com>
Mon, 26 May 2014 13:15:52 +0000 (17:15 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 26 May 2014 13:15:52 +0000 (17:15 +0400)
Zend/zend_builtin_functions.c

index f10d455db11db301a5df9700e20fad4b3e41de48..6f5b25fbf22f365210a2b638857cd456b7680b05 100644 (file)
@@ -460,18 +460,27 @@ ZEND_FUNCTION(func_get_args)
        arg_count = Z_LVAL_P(p);                /* this is the amount of arguments passed to func_get_args(); */
 
        array_init_size(return_value, arg_count);
-       for (i=0; i<arg_count; i++) {
-               zval *element, *arg, tmp;
-
-               arg = p-(arg_count-i);
-               if (!Z_ISREF_P(arg)) {
-                       element = arg;
-                       if (Z_REFCOUNTED_P(element)) Z_ADDREF_P(element);
-               } else {
-                       ZVAL_DUP(&tmp, Z_REFVAL_P(arg));
-                       element = &tmp;
-           }
-               zend_hash_next_index_insert(Z_ARRVAL_P(return_value), element);
+       if (arg_count) {
+               Bucket *q;              
+
+               p -= arg_count;
+               zend_hash_real_init(Z_ARRVAL_P(return_value), 1);
+               q = Z_ARRVAL_P(return_value)->arData;
+               for (i=0; i<arg_count; i++) {
+                       q->h = i;
+                       q->key = NULL;
+                       if (!Z_ISREF_P(p)) {
+                               ZVAL_COPY(&q->val, p);
+                       } else {
+                               ZVAL_DUP(&q->val, Z_REFVAL_P(p));
+                   }
+                       p++;
+                       q++;
+               }
+               Z_ARRVAL_P(return_value)->nNumUsed = i;
+               Z_ARRVAL_P(return_value)->nNumOfElements = i;
+               Z_ARRVAL_P(return_value)->nNextFreeElement = i + 1;
+               Z_ARRVAL_P(return_value)->nInternalPointer = 0;
        }
 }
 /* }}} */