Hello Matt,

  patch looks fine now, once we agree to this set you'd have to provide
a patch for 5.2 as well. Another thing we need is tests to ensure all
is working as expected.

best regards
marcus

Saturday, July 1, 2006, 12:30:48 PM, you wrote:

> Index: ext/standard/array.c
> ===================================================================
> RCS file: /repository/php-src/ext/standard/array.c,v
> retrieving revision 1.350
> diff -u -r1.350 array.c
> --- ext/standard/array.c        25 Jun 2006 19:19:31 -0000      1.350
> +++ ext/standard/array.c        1 Jul 2006 09:58:26 -0000
> @@ -1625,46 +1625,83 @@
>     Create an array containing num elements starting with index start_key 
> each initialized to val */
>  PHP_FUNCTION(array_fill)
>  {
> -       zval **start_key, **num, **val, *newval;
> +       zval **key_data, **num, **val, **entry;
>         long i;
> +       HashPosition pos;
>  
> -       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &start_key, 
> &num, &val) == FAILURE) {
> +       if ((ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &key_data, 
> &num, &val) == FAILURE) &&
> +               (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &key_data, 
> &val) == FAILURE)) {
>                 WRONG_PARAM_COUNT;
>         }
>  
> -       switch (Z_TYPE_PP(start_key)) {
> -               case IS_STRING:
> -               case IS_UNICODE:
> -               case IS_LONG:
> -               case IS_DOUBLE:
> -                       /* allocate an array for return */
> -                       array_init(return_value);
> -                       
> -                       if (PZVAL_IS_REF(*val)) {
> -                               SEPARATE_ZVAL(val);
> -                       }
> -                       convert_to_long_ex(start_key);
> -                       zval_add_ref(val);
> -                       zend_hash_index_update(Z_ARRVAL_P(return_value),
> Z_LVAL_PP(start_key), val, sizeof(val), NULL);
> -                       break;
> -               default:
> -                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong 
> data type for start key");
> +       if (ZEND_NUM_ARGS() == 2) {
> +               if (Z_TYPE_PP(key_data) != IS_ARRAY) {
> +                       php_error_docref(NULL TSRMLS_CC, E_WARNING,
> "First parameter must be an array when passing 2 parameters");
>                         RETURN_FALSE;
> -                       break;
> -       }       
> +               }
> +       } else {
> +               switch (Z_TYPE_PP(key_data)) {
> +                       case IS_LONG:
> +                       case IS_STRING:
> +                       case IS_UNICODE:
> +                       case IS_DOUBLE:
> +                               convert_to_long_ex(num);
> +
> +                               i = Z_LVAL_PP(num) - 1;
> +                               if (i < 0) {
> +                                       php_error_docref(NULL TSRMLS_CC,
> E_WARNING, "Number of elements must be positive");
> +                                       RETURN_FALSE;
> +                               }
>  
> -       convert_to_long_ex(num);
> -       i = Z_LVAL_PP(num) - 1; 
> -       if (i < 0) {
> -               zend_hash_destroy(Z_ARRVAL_P(return_value));
> -               efree(Z_ARRVAL_P(return_value));
> -               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of 
> elements must be positive");
> -               RETURN_FALSE;
> +                               convert_to_long_ex(key_data);
> +                               break;
> +                       default:
> +                               php_error_docref(NULL TSRMLS_CC,
> E_WARNING, "Wrong data type for start key");
> +                               RETURN_FALSE;
> +                               break;
> +               }
> +       }
> +
> +       /* Initialize return array */
> +       array_init(return_value);
> +
> +       if (PZVAL_IS_REF(*val)) {
> +               SEPARATE_ZVAL(val);
>         }
> -       newval = *val;
> -       while (i--) {
> -               zval_add_ref(&newval);
> -               zend_hash_next_index_insert(Z_ARRVAL_P(return_value), 
> &newval, sizeof(zval *), NULL);
> +
> +
> +       if (Z_TYPE_PP(key_data) == IS_LONG) {
> +               zval_add_ref(val);
> +               zend_hash_index_update(Z_ARRVAL_P(return_value),
> Z_LVAL_PP(key_data), val, sizeof(zval *), NULL);
> +
> +               while (i--) {
> +                       zval_add_ref(val);
> +                      
> zend_hash_next_index_insert(Z_ARRVAL_P(return_value), val, sizeof(zval *), 
> NULL);
> +               }
> +       } else {
> +              
> zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(key_data), &pos);
> +
> +               while
> (zend_hash_get_current_data_ex(Z_ARRVAL_PP(key_data), (void **)&entry, &pos) 
> == SUCCESS) {
> +                       zval_add_ref(val);
> +
> +                       if (Z_TYPE_PP(entry) == IS_STRING ||
> +                           Z_TYPE_PP(entry) == IS_UNICODE) {
> +                              
> zend_u_symtable_update(Z_ARRVAL_P(return_value), Z_TYPE_PP(entry),
> Z_UNIVAL_PP(entry), Z_UNILEN_PP(entry) + 1, val, sizeof(zval *), NULL);
> +                       } else if (Z_TYPE_PP(entry) == IS_LONG) {
> +                              
> zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_PP(entry), val, 
> sizeof(zval *), NULL);
> +                       } else {
> +                               zval tmpkey;
> +
> +                               tmpkey = **entry;
> +                               zval_copy_ctor(&tmpkey);
> +                               convert_to_string(&tmpkey);
> +
> +                              
> zend_symtable_update(Z_ARRVAL_P(return_value), Z_STRVAL(tmpkey),
> Z_STRLEN(tmpkey) + 1, val, sizeof(zval *), NULL);
> +
> +                               zval_dtor(&tmpkey);
> +                       }
> +                       zend_hash_move_forward_ex(Z_ARRVAL_PP(key_data), 
> &pos);
> +               }
>         }
>  }
>  /* }}} */




Best regards,
 Marcus

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

Reply via email to